TI mode in gcc broken.
Posted: Fri Apr 15, 2005 12:19 am
Okay, this is reported by shazz.
After some investigations, I conclude the TI mode support using our current gcc patches is broken, when it comes to casting, in both optimized and non optimized mode. Here is the basic example:
Original C code:
Disassembly of the above compilation using -O2:
Same, without any -O:
In both cases, the "foobar" function returns the correct value in $v0, and the "bar" function returns 0, whatever the result of "foo" is. Worse: I believe the way it does it is wrong, since it uses a 64-bits move to erase $v0, potentially letting garbage in the upper 64 bits of $v0.
Did anyone experienced such things in the past ? Can anyone of you check this with the previous toolchain ? I can't do such test atm.
After some investigations, I conclude the TI mode support using our current gcc patches is broken, when it comes to casting, in both optimized and non optimized mode. Here is the basic example:
Original C code:
Code: Select all
#include <tamtypes.h>
u32 foo();
u128 bar() {
return foo();
}
u128 foobar() {
return 5;
}
Code: Select all
00000000 <bar>:
0: 27bdfff0 addiu sp,sp,-16
4: ffbf0000 sd ra,0(sp)
8: 0c000000 jal 0 <bar>
8: R_MIPS_26 foo
c: 00000000 nop
10: dfbf0000 ld ra,0(sp)
14: 0000102d move v0,zero
18: 03e00008 jr ra
1c: 27bd0010 addiu sp,sp,16
00000020 <foobar>:
20: 700014a9 por v0,zero,zero
24: 03e00008 jr ra
28: 24020005 li v0,5
2c: 00000000 nop
Code: Select all
00000000 <bar>:
0: 27bdffe0 addiu sp,sp,-32
4: ffbf0010 sd ra,16(sp)
8: ffbe0000 sd s8,0(sp)
c: 0c000000 jal 0 <bar>
c: R_MIPS_26 foo
10: 03a0f02d move s8,sp
14: 0002103c dsll32 v0,v0,0x0
18: 0002183e dsrl32 v1,v0,0x0
1c: 0060102d move v0,v1
20: 0000102d move v0,zero
24: 03c0e82d move sp,s8
28: dfbf0010 ld ra,16(sp)
2c: dfbe0000 ld s8,0(sp)
30: 03e00008 jr ra
34: 27bd0020 addiu sp,sp,32
00000038 <foobar>:
38: 27bdfff0 addiu sp,sp,-16
3c: ffbe0000 sd s8,0(sp)
40: 03a0f02d move s8,sp
44: 700014a9 por v0,zero,zero
48: 24020005 li v0,5
4c: 03c0e82d move sp,s8
50: dfbe0000 ld s8,0(sp)
54: 03e00008 jr ra
58: 27bd0010 addiu sp,sp,16
Did anyone experienced such things in the past ? Can anyone of you check this with the previous toolchain ? I can't do such test atm.