J. Scott Kasten wrote: [snip] > > I don't know how file detects this, but at least current CVS gas > > does not set the appropriate flag in the object file header. > > Gas does not apply here. We're talking about gcc running under Irix with > the native as and ld tools. I'm using gcc-2.91.66 (egcs-1.1.2), > gcc-2.95.2, MipsPro 7.30 as and ld. Sorry, I have missed this. > > > > > > > > Run: > > > > > > > > sizeof(int) = 8, sizeof(*) = 8 > > ^ ^ > > This should be both 4, I assume this happened due to -mint64. > > Not totally. -mips3 generates values of 4 and 8. The -mint64 takes it to > 8 and 8. If I just invoke gcc with no -m flags, it does produce 4 and 4. n32 ABI uses sizeof(void *) == 4, so something went wrong here. [snip] > Just for kicks, instead of *j = 10, which is trivial, I picked a true 64 > bit constant: Are you a telepathic? :-) > sd $2,40($fp) > ld $2,40($fp) > dli $3,0x807060504030201 > sd $3,0($2) > ld $2,32($fp) > daddu $3,$2,1 > sd $3,32($fp) > ld $2,40($fp) > > > 100012b0: ffc20028 sd $v0,40($s8) > 100012b4: dfc20028 ld $v0,40($s8) > 100012b8: 3c030807 lui $v1,0x807 > 100012bc: 34630605 ori $v1,$v1,0x605 > 100012c0: 00031c38 dsll $v1,$v1,0x10 > 100012c4: 34630403 ori $v1,$v1,0x403 > 100012c8: 00031c38 dsll $v1,$v1,0x10 > 100012cc: 34630201 ori $v1,$v1,0x201 > 100012d0: fc430000 sd $v1,0($v0) > 100012d4: dfc20020 ld $v0,32($s8) > 100012d8: 64430001 daddiu $v1,$v0,1 > 100012dc: ffc30020 sd $v1,32($s8) > 100012e0: dfc20028 ld $v0,40($s8) > > Ouch that's a painfull load. It's interesting that in both cases, it > effectively makes the constant load a 16 bit operation, does the math 64 > bit, and stores 64 bit. Loading constants via 16bit immediates is normal and the fastest way on MIPS. The really interesting part is that the load avoids clobbering $at. For superscalar processors it's faster to do e.g. lui $v1,0x807 lui $at,$at,0x403 ori $v1,$v1,0x605 ori $at,$at,0x201 dsll32 $v1,$v1,0x0 or $v1,$v1,$at with a critical path length of 4 instead of 6. Thiemo