egcs-20000207 Bug: Misuse of $gp when using -mips16 and -O3.
Franklin Hooker
Franklin.Hooker@mail.com
Tue Feb 8 14:54:00 GMT 2000
egcs-20000207 Bug: Misuse of $gp when using -mips16 and -O3.
This is one of the functions in dhrystone 2.1. The generated code
doesn't properly access the global variables. It appears that the
first two uses of $a3 should have been $gp instead. Also note that I
included code generated by a gnupro release. This version works
properly.
Thanks,
Franklin
------------------------------------------------------
gcc version 2.96 20000207 (experimental)
$ uname -a
SunOS light 5.6 Generic_105181-17 sun4u sparc SUNW,Ultra-2
------------------------------------------------------------
Code from dhrystone 2.1.
Proc_2 (Int_Par_Ref)
/******************/
/* executed once */
/* *Int_Par_Ref == 1, becomes 4 */
One_Fifty *Int_Par_Ref;
{
One_Fifty Int_Loc;
Enumeration Enum_Loc;
Int_Loc = *Int_Par_Ref + 10;
do /* executed once */
if (Ch_1_Glob == 'A')
/* then, executed */
{
Int_Loc -= 1;
*Int_Par_Ref = Int_Loc - Int_Glob;
Enum_Loc = Ident_1;
} /* if */
while (Enum_Loc != Ident_1); /* true */
} /* Proc_2 */
--------------------------------------------------------------------------
mips-lexra-elf-gcc -v
Reading specs from /opt/lsdk/bin/../lib/gcc-lib/mips-lexra-elf/2.96/specs
gcc version 2.96 20000207 (experimental)
mips-lexra-elf-gcc -mips16 -c -msoft-float -mno-unaligned-insn -O3 -I../incl
ude -o dhry21a.o ../dhrystone/dhry21a.c
000000000040052c <Proc_2>:
40052c: 9c40 lw $v0,0($a0)
Proc_2():
40052e: 67c7 move $a2,$a3
400530: 4267 addiu $v1,$v0,7
400532: 67a7 move $a1,$a3
400534: 4b03 addiu $v1,3
400536: f030 4e0c addiu $a2,-32724
40053a: f030 4d08 addiu $a1,-32728
40053e: 8640 lb $v0,0($a2)
400540: 7241 cmpi $v0,65
400542: 6105 btnez 40054e <Proc_2+0x22>
400544: 9d40 lw $v0,0($a1)
400546: 4bff addiu $v1,-1
400548: e34b subu $v0,$v1,$v0
40054a: dc40 sw $v0,0($a0)
40054c: 6f00 li $a3,0
40054e: 2ff7 bnez $a3,40053e <Proc_2+0x12>
400550: e820 jr $ra
400552: 6500 nop
--------------------------------------------------------------------------
$ mips-lsi-elf-gcc -v
Reading specs from
/usr/cygnus/gnupro-98r2/H-sparc-sun-solaris2.5/lib/gcc-lib/mips-lsi-elf/2.9-
gnupro-98r2/specs
gcc version 2.9-gnupro-98r2
mips-lsi-elf-gcc -mips16 -c -msoft-float -O3 -I../include -o dhry21a.o
../dhrystone/dhry21a.c
000000000040054c <Proc_2>:
40054c: 677c move $v1,$gp
Proc_2():
40054e: 9c40 lw $v0,0($a0)
400550: 67c3 move $a2,$v1
400552: f030 4e0c addiu $a2,-32724
400556: f030 4b08 addiu $v1,-32728
40055a: 42a7 addiu $a1,$v0,7
40055c: 4d03 addiu $a1,3
40055e: 8640 lb $v0,0($a2)
400560: 7241 cmpi $v0,65
400562: 6105 btnez 40056e <Proc_2+0x22>
400564: 4dff addiu $a1,-1
400566: 9b40 lw $v0,0($v1)
400568: 6f00 li $a3,0
40056a: e54b subu $v0,$a1,$v0
40056c: dc40 sw $v0,0($a0)
40056e: 2ff7 bnez $a3,40055e <Proc_2+0x12>
400570: e820 jr $ra
400572: 6500 nop
More information about the Gcc-bugs
mailing list