This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PowerPC-sysV/eabi, harmonization of section attribute and small data optimization


Dear GCC maintainers:

Here is a bug report and bug fix / improvement:

The small data optimization allowed in the PowerPC SystemV
ABI specification (or its embedded refinement, eabi), as
implemented in the GCC file gcc/config/rs6000/rs6000.c is
creating conflicts and inefficiencies (missed optimization
opportunities) when the __attribute__ ((section...)) is
used for object declarations.

This issue applies when -msdata=eabi or -msdata=sysv. (The
conflicts can be avoided by setting the GCC driver option -
G 0 which is analogue to -msdata=none.)

I enclose a fix to rs6000.c (from GCC-3.2.2 distribution,
but should be applicable to other versions as well).

I also enclose a sample program and the generated assembler
code for various values of the -G option.

The current documentation was unclear as to when the r2 or
r13 addressing was used. With the proposed fix, the
documentation should read:

-msdata=eabi
     On System V.4 and embedded PowerPC systems, put small
     initialized const global and static data in the
     .sdata2 section, which is pointed to by register r2.
     Put small initialized non-const global and static data
     in the .sdata section, which is pointed to by register
     r13. Put small uninitialized global and static data in
     the .sbss section, which is adjacent to the .sdata
     section. Use register r2 or r13 to address variables
     allocated to these sections, either implicitly or
     explicitly with  __attribute__ ((section)). The
     -msdata=eabi option is incompatible with the
     -mrelocatable option. The -msdata=eabi option also
     sets the -memb option.

-msdata=sysv
     On System V.4 and embedded PowerPC systems, put small
     global and static data in the .sdata section, which is
     pointed to by register r13. Put small uninitialized
     global and static data in the .sbss section, which is
     adjacent to the .sdata section. Use register r13 to
     address variables allocated to these sections, either
     implicitly or explicitly with  __attribute__
     ((section)). The -msdata=sysv option is incompatible
     with the -mrelocatable option.

This bug fix or enhancement should be beneficial to the
embedded software developers.

ChangeLog entry:

2003-02-14 Thierry Moreau <thierry.moreau@connotech.com>

* config/rs6000/rs6000.c functions
rs6000_encode_section_info and small_data_operand: PowerPC-
sysV/eabi, harmonization of section attribute and small
data optimization

Many thanks for the GCC compiler technology.

--

- Thierry Moreau

CONNOTECH Experts-conseils inc.
9130 Place de Montgolfier
Montreal, Qc
H2M 2A1

Tel.: (514)385-5691
Fax:  (514)385-5900

e-mail: thierry.moreau@connotech.com

*** rs6000.c	Fri Feb 14 14:15:58 2003
--- rs6000.bak	Thu Feb 13 10:57:14 2003
*************** small_data_operand (op, mode)
*** 1679,1686 ****
        rtx sum = XEXP (op, 0);
        HOST_WIDE_INT summand;
  
        summand = INTVAL (XEXP (sum, 1));
!       if (summand < 0)
         return 0;
  
        sym_ref = XEXP (sum, 0);
--- 1679,1688 ----
        rtx sum = XEXP (op, 0);
        HOST_WIDE_INT summand;
  
+       /* We have to be careful here, because it is the referenced address
+         that must be 32k from _SDA_BASE_, not just the symbol.  */
        summand = INTVAL (XEXP (sum, 1));
!       if (summand < 0 || summand > g_switch_value)
         return 0;
  
        sym_ref = XEXP (sum, 0);
*************** rs6000_encode_section_info (decl)
*** 11031,11038 ****
  	    abort ();
  	}
  
!       if (name?
! 		   ((len == sizeof (".sdata")
  		   && strcmp (name, ".sdata") == 0)
  		  || (len == sizeof (".sdata2")
  		      && strcmp (name, ".sdata2") == 0)
--- 11033,11041 ----
  	    abort ();
  	}
  
!       if ((size > 0 && size <= g_switch_value)
! 	  || (name
! 	      && ((len == sizeof (".sdata")
  		   && strcmp (name, ".sdata") == 0)
  		  || (len == sizeof (".sdata2")
  		      && strcmp (name, ".sdata2") == 0)
*************** rs6000_encode_section_info (decl)
*** 11043,11050 ****
  		  || (len == sizeof (".PPC.EMB.sdata0")
  		      && strcmp (name, ".PPC.EMB.sdata0") == 0)
  		  || (len == sizeof (".PPC.EMB.sbss0")
! 		      && strcmp (name, ".PPC.EMB.sbss0") == 0))
! 		   :(size > 0 && size <= g_switch_value))
  	{
  	  rtx sym_ref = XEXP (DECL_RTL (decl), 0);
  	  size_t len = strlen (XSTR (sym_ref, 0));
--- 11046,11052 ----
  		  || (len == sizeof (".PPC.EMB.sdata0")
  		      && strcmp (name, ".PPC.EMB.sdata0") == 0)
  		  || (len == sizeof (".PPC.EMB.sbss0")
! 		      && strcmp (name, ".PPC.EMB.sbss0") == 0))))
  	{
  	  rtx sym_ref = XEXP (DECL_RTL (decl), 0);
  	  size_t len = strlen (XSTR (sym_ref, 0));
	.file	"test_rs6000_sda.cpp"

 # rs6000/powerpc options: -mcpu=860 -msdata=eabi -G 4
 # GNU C++ version 3.2.2 (powerpc-eabi)
 #	compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110).
 # options passed:  -v -D__GNUC__=3 -D__GNUC_MINOR__=2
 # -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -DPPC -D__embedded__
 # -D__PPC__ -D__embedded__ -D__PPC -Asystem=embedded -Acpu=powerpc
 # -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV
 # -D_SOFT_FLOAT -D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian
 # -D_ARCH_PPC -D__GNUG__=3 -D__DEPRECATED -G -mcpu=860 -mno-altivec
 # -mbig-endian -mmultiple -mstring -mupdate -mcall-sysv -meabi
 # -msvr4-struct-return -mprototype -mno-relocatable -mno-relocatable-lib
 # -msdata=eabi -memb -mregnames -O2 -fno-exceptions -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer
 # -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
 # -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
 # -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
 # -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -frerun-cse-after-loop
 # -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -freorder-blocks -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
 # -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
 # -fmerge-constants -fident -fpeephole2 -fguess-branch-probability
 # -fmath-errno -ftrapping-math -mpowerpc -mnew-mnemonics -msoft-float
 # -mmultiple -mno-multiple -mstring -mno-string -msched-prolog
 # -msched-epilog -msvr4-struct-return -mno-aix-struct-return -mprototype
 # -meabi -mregnames -mcpu=860 -mcall-sysv -msdata=eabi

	.globl sda_array
	.section	.sbss,"aw",@nobits
	.align 2
	.type	sda_array,@object
	.size	sda_array,8000
sda_array:
	.zero	8000
	.globl byte_v
	.globl byte_v
	.section	".sbss","aw",@nobits
byte_v:
	.zero	1
	.size	byte_v,1
	.globl short_v
	.globl short_v
	.align 1
short_v:
	.zero	2
	.size	short_v,2
	.globl long_v
	.globl long_v
	.align 2
long_v:
	.zero	4
	.size	long_v,4
	.globl peripheral_register
	.section	.periph_reg_sect,"aw",@progbits
	.type	peripheral_register,@object
	.size	peripheral_register,1
peripheral_register:
	.zero	1
	.section	".text"
	.align 2
	.globl _Z8functionv
	.type	_Z8functionv,@function
_Z8functionv:
	lha %r0,short_v@sda21(%r0)	 #  short_v
	lbz %r3,byte_v@sda21(%r0)	 #  byte_v
	lwz %r9,long_v@sda21(%r0)	 #  long_v
	add %r3,%r3,%r0
	lis %r10,sda_array@ha
	add %r3,%r3,%r9
	la %r11,sda_array@l(%r10)
	li %r0,1
	li %r9,0
	slwi %r3,%r3,2
	add %r3,%r3,%r11
	stw %r0,sda_array@l(%r10)	 #  sda_array
	stb %r9,peripheral_register@sda21(%r0)	 #  peripheral_register
	li %r0,2
	li %r9,3
	stw %r0,400(%r11)	 #  sda_array
	stw %r9,4000(%r11)	 #  sda_array
	blr
.Lfe1:
	.size	_Z8functionv,.Lfe1-_Z8functionv
	.ident	"GCC: (GNU) 3.2.2"

Attachment: test_rs6000_sda.cpp
Description: application/unknown-content-type-cppfile

	.file	"test_rs6000_sda.cpp"

 # rs6000/powerpc options: -mcpu=860 -msdata=eabi -G 2
 # GNU C++ version 3.2.2 (powerpc-eabi)
 #	compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110).
 # options passed:  -v -D__GNUC__=3 -D__GNUC_MINOR__=2
 # -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -DPPC -D__embedded__
 # -D__PPC__ -D__embedded__ -D__PPC -Asystem=embedded -Acpu=powerpc
 # -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV
 # -D_SOFT_FLOAT -D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian
 # -D_ARCH_PPC -D__GNUG__=3 -D__DEPRECATED -G -mcpu=860 -mno-altivec
 # -mbig-endian -mmultiple -mstring -mupdate -mcall-sysv -meabi
 # -msvr4-struct-return -mprototype -mno-relocatable -mno-relocatable-lib
 # -msdata=eabi -memb -mregnames -O2 -fno-exceptions -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer
 # -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
 # -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
 # -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
 # -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -frerun-cse-after-loop
 # -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -freorder-blocks -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
 # -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
 # -fmerge-constants -fident -fpeephole2 -fguess-branch-probability
 # -fmath-errno -ftrapping-math -mpowerpc -mnew-mnemonics -msoft-float
 # -mmultiple -mno-multiple -mstring -mno-string -msched-prolog
 # -msched-epilog -msvr4-struct-return -mno-aix-struct-return -mprototype
 # -meabi -mregnames -mcpu=860 -mcall-sysv -msdata=eabi

	.globl sda_array
	.section	.sbss,"aw",@nobits
	.align 2
	.type	sda_array,@object
	.size	sda_array,8000
sda_array:
	.zero	8000
	.globl byte_v
	.globl byte_v
	.section	".sbss","aw",@nobits
byte_v:
	.zero	1
	.size	byte_v,1
	.globl short_v
	.globl short_v
	.align 1
short_v:
	.zero	2
	.size	short_v,2
	.globl long_v
	.globl long_v
	.lcomm	long_v,4,4
	.globl peripheral_register
	.section	.periph_reg_sect,"aw",@progbits
	.type	peripheral_register,@object
	.size	peripheral_register,1
peripheral_register:
	.zero	1
	.section	".text"
	.align 2
	.globl _Z8functionv
	.type	_Z8functionv,@function
_Z8functionv:
	lha %r11,short_v@sda21(%r0)	 #  short_v
	lbz %r3,byte_v@sda21(%r0)	 #  byte_v
	lis %r9,long_v@ha
	lwz %r0,long_v@l(%r9)	 #  long_v
	add %r3,%r3,%r11
	lis %r10,sda_array@ha
	add %r3,%r3,%r0
	la %r11,sda_array@l(%r10)
	li %r0,1
	li %r9,0
	slwi %r3,%r3,2
	add %r3,%r3,%r11
	stw %r0,sda_array@l(%r10)	 #  sda_array
	stb %r9,peripheral_register@sda21(%r0)	 #  peripheral_register
	li %r0,2
	li %r9,3
	stw %r0,400(%r11)	 #  sda_array
	stw %r9,4000(%r11)	 #  sda_array
	blr
.Lfe1:
	.size	_Z8functionv,.Lfe1-_Z8functionv
	.ident	"GCC: (GNU) 3.2.2"
	.file	"test_rs6000_sda.cpp"

 # rs6000/powerpc options: -mcpu=860 -msdata=eabi -G 10000
 # GNU C++ version 3.2.2 (powerpc-eabi)
 #	compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110).
 # options passed:  -v -D__GNUC__=3 -D__GNUC_MINOR__=2
 # -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -DPPC -D__embedded__
 # -D__PPC__ -D__embedded__ -D__PPC -Asystem=embedded -Acpu=powerpc
 # -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV
 # -D_SOFT_FLOAT -D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian
 # -D_ARCH_PPC -D__GNUG__=3 -D__DEPRECATED -G -mcpu=860 -mno-altivec
 # -mbig-endian -mmultiple -mstring -mupdate -mcall-sysv -meabi
 # -msvr4-struct-return -mprototype -mno-relocatable -mno-relocatable-lib
 # -msdata=eabi -memb -mregnames -O2 -fno-exceptions -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer
 # -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
 # -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
 # -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
 # -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -frerun-cse-after-loop
 # -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -freorder-blocks -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
 # -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
 # -fmerge-constants -fident -fpeephole2 -fguess-branch-probability
 # -fmath-errno -ftrapping-math -mpowerpc -mnew-mnemonics -msoft-float
 # -mmultiple -mno-multiple -mstring -mno-string -msched-prolog
 # -msched-epilog -msvr4-struct-return -mno-aix-struct-return -mprototype
 # -meabi -mregnames -mcpu=860 -mcall-sysv -msdata=eabi

	.globl sda_array
	.section	.sbss,"aw",@nobits
	.align 2
	.type	sda_array,@object
	.size	sda_array,8000
sda_array:
	.zero	8000
	.globl byte_v
	.globl byte_v
	.section	".sbss","aw",@nobits
byte_v:
	.zero	1
	.size	byte_v,1
	.globl short_v
	.globl short_v
	.align 1
short_v:
	.zero	2
	.size	short_v,2
	.globl long_v
	.globl long_v
	.align 2
long_v:
	.zero	4
	.size	long_v,4
	.globl peripheral_register
	.section	.periph_reg_sect,"aw",@progbits
	.type	peripheral_register,@object
	.size	peripheral_register,1
peripheral_register:
	.zero	1
	.section	".text"
	.align 2
	.globl _Z8functionv
	.type	_Z8functionv,@function
_Z8functionv:
	lha %r0,short_v@sda21(%r0)	 #  short_v
	lbz %r3,byte_v@sda21(%r0)	 #  byte_v
	lwz %r9,long_v@sda21(%r0)	 #  long_v
	add %r3,%r3,%r0
	add %r3,%r3,%r9
	la %r11,sda_array@sda21(%r0)
	li %r0,0
	li %r9,1
	slwi %r3,%r3,2
	add %r3,%r3,%r11
	stb %r0,peripheral_register@sda21(%r0)	 #  peripheral_register
	stw %r9,0(%r11)	 #  sda_array
	li %r0,2
	li %r9,3
	stw %r0,sda_array+400@sda21(%r0)	 #  sda_array
	stw %r9,sda_array+4000@sda21(%r0)	 #  sda_array
	blr
.Lfe1:
	.size	_Z8functionv,.Lfe1-_Z8functionv
	.ident	"GCC: (GNU) 3.2.2"
	.file	"test_rs6000_sda.cpp"

 # rs6000/powerpc options: -mcpu=860 -msdata=eabi
 # GNU C++ version 3.2.2 (powerpc-eabi)
 #	compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110).
 # options passed:  -v -D__GNUC__=3 -D__GNUC_MINOR__=2
 # -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -DPPC -D__embedded__
 # -D__PPC__ -D__embedded__ -D__PPC -Asystem=embedded -Acpu=powerpc
 # -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV
 # -D_SOFT_FLOAT -D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian
 # -D_ARCH_PPC -D__GNUG__=3 -D__DEPRECATED -G -mcpu=860 -mno-altivec
 # -mbig-endian -mmultiple -mstring -mupdate -mcall-sysv -meabi
 # -msvr4-struct-return -mprototype -mno-relocatable -mno-relocatable-lib
 # -msdata=eabi -memb -mregnames -O2 -fno-exceptions -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer
 # -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
 # -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
 # -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
 # -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -frerun-cse-after-loop
 # -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -freorder-blocks -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
 # -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
 # -fmerge-constants -fident -fpeephole2 -fguess-branch-probability
 # -fmath-errno -ftrapping-math -mpowerpc -mnew-mnemonics -msoft-float
 # -mmultiple -mno-multiple -mstring -mno-string -msched-prolog
 # -msched-epilog -msvr4-struct-return -mno-aix-struct-return -mprototype
 # -meabi -mregnames -mcpu=860 -mcall-sysv -msdata=eabi

	.globl sda_array
	.section	.sbss,"aw",@nobits
	.align 2
	.type	sda_array,@object
	.size	sda_array,8000
sda_array:
	.zero	8000
	.globl byte_v
	.globl byte_v
	.lcomm	byte_v,1,1
	.globl short_v
	.globl short_v
	.lcomm	short_v,2,2
	.globl long_v
	.globl long_v
	.lcomm	long_v,4,4
	.globl peripheral_register
	.section	.periph_reg_sect,"aw",@progbits
	.type	peripheral_register,@object
	.size	peripheral_register,1
peripheral_register:
	.zero	1
	.section	".text"
	.align 2
	.globl _Z8functionv
	.type	_Z8functionv,@function
_Z8functionv:
	lis %r9,byte_v@ha
	lis %r11,short_v@ha
	lha %r10,short_v@l(%r11)	 #  short_v
	lbz %r3,byte_v@l(%r9)	 #  byte_v
	lis %r9,long_v@ha
	lwz %r0,long_v@l(%r9)	 #  long_v
	add %r3,%r3,%r10
	lis %r8,sda_array@ha
	add %r3,%r3,%r0
	la %r10,sda_array@l(%r8)
	li %r11,0
	lis %r9,peripheral_register@ha
	li %r0,1
	slwi %r3,%r3,2
	add %r3,%r3,%r10
	stb %r11,peripheral_register@l(%r9)	 #  peripheral_register
	stw %r0,sda_array@l(%r8)	 #  sda_array
	li %r9,2
	li %r0,3
	stw %r9,400(%r10)	 #  sda_array
	stw %r0,4000(%r10)	 #  sda_array
	blr
.Lfe1:
	.size	_Z8functionv,.Lfe1-_Z8functionv
	.ident	"GCC: (GNU) 3.2.2"
	.file	"test_rs6000_sda.cpp"

 # rs6000/powerpc options: -mcpu=860 -msdata=eabi -G 4
 # GNU C++ version 3.2.2 (powerpc-eabi)
 #	compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110).
 # options passed:  -v -D__GNUC__=3 -D__GNUC_MINOR__=2
 # -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -DPPC -D__embedded__
 # -D__PPC__ -D__embedded__ -D__PPC -Asystem=embedded -Acpu=powerpc
 # -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV
 # -D_SOFT_FLOAT -D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian
 # -D_ARCH_PPC -D__GNUG__=3 -D__DEPRECATED -G -mcpu=860 -mno-altivec
 # -mbig-endian -mmultiple -mstring -mupdate -mcall-sysv -meabi
 # -msvr4-struct-return -mprototype -mno-relocatable -mno-relocatable-lib
 # -msdata=eabi -memb -mregnames -O2 -fno-exceptions -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer
 # -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
 # -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
 # -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
 # -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -frerun-cse-after-loop
 # -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -freorder-blocks -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
 # -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
 # -fmerge-constants -fident -fpeephole2 -fguess-branch-probability
 # -fmath-errno -ftrapping-math -mpowerpc -mnew-mnemonics -msoft-float
 # -mmultiple -mno-multiple -mstring -mno-string -msched-prolog
 # -msched-epilog -msvr4-struct-return -mno-aix-struct-return -mprototype
 # -meabi -mregnames -mcpu=860 -mcall-sysv -msdata=eabi

	.globl sda_array
	.section	.sbss,"aw",@nobits
	.align 2
	.type	sda_array,@object
	.size	sda_array,8000
sda_array:
	.zero	8000
	.globl byte_v
	.globl byte_v
	.section	".sbss","aw",@nobits
byte_v:
	.zero	1
	.size	byte_v,1
	.globl short_v
	.globl short_v
	.align 1
short_v:
	.zero	2
	.size	short_v,2
	.globl long_v
	.globl long_v
	.align 2
long_v:
	.zero	4
	.size	long_v,4
	.globl peripheral_register
	.section	.periph_reg_sect,"aw",@progbits
	.type	peripheral_register,@object
	.size	peripheral_register,1
peripheral_register:
	.zero	1
	.section	".text"
	.align 2
	.globl _Z8functionv
	.type	_Z8functionv,@function
_Z8functionv:
	lha %r0,short_v@sda21(%r0)	 #  short_v
	lbz %r3,byte_v@sda21(%r0)	 #  byte_v
	lwz %r9,long_v@sda21(%r0)	 #  long_v
	add %r3,%r3,%r0
	add %r3,%r3,%r9
	la %r10,sda_array@sda21(%r0)
	li %r11,0
	lis %r9,peripheral_register@ha
	li %r0,1
	slwi %r3,%r3,2
	add %r3,%r3,%r10
	stb %r11,peripheral_register@l(%r9)	 #  peripheral_register
	stw %r0,0(%r10)	 #  sda_array
	li %r9,2
	li %r0,3
	stw %r9,sda_array+400@sda21(%r0)	 #  sda_array
	stw %r0,sda_array+4000@sda21(%r0)	 #  sda_array
	blr
.Lfe1:
	.size	_Z8functionv,.Lfe1-_Z8functionv
	.ident	"GCC: (GNU) 3.2.2"
	.file	"test_rs6000_sda.cpp"

 # rs6000/powerpc options: -mcpu=860 -msdata=eabi -G 2
 # GNU C++ version 3.2.2 (powerpc-eabi)
 #	compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110).
 # options passed:  -v -D__GNUC__=3 -D__GNUC_MINOR__=2
 # -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -DPPC -D__embedded__
 # -D__PPC__ -D__embedded__ -D__PPC -Asystem=embedded -Acpu=powerpc
 # -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV
 # -D_SOFT_FLOAT -D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian
 # -D_ARCH_PPC -D__GNUG__=3 -D__DEPRECATED -G -mcpu=860 -mno-altivec
 # -mbig-endian -mmultiple -mstring -mupdate -mcall-sysv -meabi
 # -msvr4-struct-return -mprototype -mno-relocatable -mno-relocatable-lib
 # -msdata=eabi -memb -mregnames -O2 -fno-exceptions -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer
 # -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
 # -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
 # -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
 # -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -frerun-cse-after-loop
 # -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -freorder-blocks -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
 # -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
 # -fmerge-constants -fident -fpeephole2 -fguess-branch-probability
 # -fmath-errno -ftrapping-math -mpowerpc -mnew-mnemonics -msoft-float
 # -mmultiple -mno-multiple -mstring -mno-string -msched-prolog
 # -msched-epilog -msvr4-struct-return -mno-aix-struct-return -mprototype
 # -meabi -mregnames -mcpu=860 -mcall-sysv -msdata=eabi

	.globl sda_array
	.section	.sbss,"aw",@nobits
	.align 2
	.type	sda_array,@object
	.size	sda_array,8000
sda_array:
	.zero	8000
	.globl byte_v
	.globl byte_v
	.section	".sbss","aw",@nobits
byte_v:
	.zero	1
	.size	byte_v,1
	.globl short_v
	.globl short_v
	.align 1
short_v:
	.zero	2
	.size	short_v,2
	.globl long_v
	.globl long_v
	.lcomm	long_v,4,4
	.globl peripheral_register
	.section	.periph_reg_sect,"aw",@progbits
	.type	peripheral_register,@object
	.size	peripheral_register,1
peripheral_register:
	.zero	1
	.section	".text"
	.align 2
	.globl _Z8functionv
	.type	_Z8functionv,@function
_Z8functionv:
	lha %r11,short_v@sda21(%r0)	 #  short_v
	lbz %r3,byte_v@sda21(%r0)	 #  byte_v
	lis %r9,long_v@ha
	lwz %r0,long_v@l(%r9)	 #  long_v
	add %r3,%r3,%r11
	add %r3,%r3,%r0
	la %r10,sda_array@sda21(%r0)
	li %r11,0
	lis %r9,peripheral_register@ha
	li %r0,1
	slwi %r3,%r3,2
	add %r3,%r3,%r10
	stb %r11,peripheral_register@l(%r9)	 #  peripheral_register
	stw %r0,0(%r10)	 #  sda_array
	li %r9,2
	li %r0,3
	stw %r9,sda_array+400@sda21(%r0)	 #  sda_array
	stw %r0,sda_array+4000@sda21(%r0)	 #  sda_array
	blr
.Lfe1:
	.size	_Z8functionv,.Lfe1-_Z8functionv
	.ident	"GCC: (GNU) 3.2.2"
	.file	"test_rs6000_sda.cpp"

 # rs6000/powerpc options: -mcpu=860 -msdata=eabi
 # GNU C++ version 3.2.2 (powerpc-eabi)
 #	compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110).
 # options passed:  -v -D__GNUC__=3 -D__GNUC_MINOR__=2
 # -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -DPPC -D__embedded__
 # -D__PPC__ -D__embedded__ -D__PPC -Asystem=embedded -Acpu=powerpc
 # -Amachine=powerpc -D__OPTIMIZE__ -D__STDC_HOSTED__=1 -D_CALL_SYSV
 # -D_SOFT_FLOAT -D_BIG_ENDIAN -D__BIG_ENDIAN__ -Amachine=bigendian
 # -D_ARCH_PPC -D__GNUG__=3 -D__DEPRECATED -G -mcpu=860 -mno-altivec
 # -mbig-endian -mmultiple -mstring -mupdate -mcall-sysv -meabi
 # -msvr4-struct-return -mprototype -mno-relocatable -mno-relocatable-lib
 # -msdata=eabi -memb -mregnames -O2 -fno-exceptions -fverbose-asm
 # options enabled:  -fdefer-pop -fomit-frame-pointer
 # -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
 # -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
 # -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
 # -freg-struct-return -fgcse -fgcse-lm -fgcse-sm -frerun-cse-after-loop
 # -frerun-loop-opt -fdelete-null-pointer-checks -fschedule-insns
 # -fschedule-insns2 -fsched-interblock -fsched-spec -fbranch-count-reg
 # -freorder-blocks -fcprop-registers -fcommon -fverbose-asm -fgnu-linker
 # -fregmove -foptimize-register-move -fargument-alias -fstrict-aliasing
 # -fmerge-constants -fident -fpeephole2 -fguess-branch-probability
 # -fmath-errno -ftrapping-math -mpowerpc -mnew-mnemonics -msoft-float
 # -mmultiple -mno-multiple -mstring -mno-string -msched-prolog
 # -msched-epilog -msvr4-struct-return -mno-aix-struct-return -mprototype
 # -meabi -mregnames -mcpu=860 -mcall-sysv -msdata=eabi

	.globl sda_array
	.section	.sbss,"aw",@nobits
	.align 2
	.type	sda_array,@object
	.size	sda_array,8000
sda_array:
	.zero	8000
	.globl byte_v
	.globl byte_v
	.lcomm	byte_v,1,1
	.globl short_v
	.globl short_v
	.lcomm	short_v,2,2
	.globl long_v
	.globl long_v
	.lcomm	long_v,4,4
	.globl peripheral_register
	.section	.periph_reg_sect,"aw",@progbits
	.type	peripheral_register,@object
	.size	peripheral_register,1
peripheral_register:
	.zero	1
	.section	".text"
	.align 2
	.globl _Z8functionv
	.type	_Z8functionv,@function
_Z8functionv:
	lis %r9,byte_v@ha
	lis %r11,short_v@ha
	lha %r10,short_v@l(%r11)	 #  short_v
	lbz %r3,byte_v@l(%r9)	 #  byte_v
	lis %r9,long_v@ha
	lwz %r0,long_v@l(%r9)	 #  long_v
	add %r3,%r3,%r10
	add %r3,%r3,%r0
	la %r10,sda_array@sda21(%r0)
	li %r11,0
	lis %r9,peripheral_register@ha
	li %r0,1
	slwi %r3,%r3,2
	add %r3,%r3,%r10
	stb %r11,peripheral_register@l(%r9)	 #  peripheral_register
	stw %r0,0(%r10)	 #  sda_array
	li %r9,2
	li %r0,3
	stw %r9,sda_array+400@sda21(%r0)	 #  sda_array
	stw %r0,sda_array+4000@sda21(%r0)	 #  sda_array
	blr
.Lfe1:
	.size	_Z8functionv,.Lfe1-_Z8functionv
	.ident	"GCC: (GNU) 3.2.2"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]