Hi Tim, > 86 0030 4AAE 0008 tst.l 8(%fp) > 87 0034 56C0 sne %d0 > 88 0036 4E5E unlk %fp > 89 .cfi_offset 14, -8 > 90 0038 7100 mvs.b %d0,%d0 > 91 003a 4480 neg.l %d0 > 92 003c 4E75 rts
I don't know 68000/Coldfire so I'm enjoying this. :-) tst.l 8(%fp) ; compare x to 0. sne %d0 ; if x != 0: d0 = 0xff. unlk %fp ; prepare for return. mvs.b %d0,%d0 ; sign-extend the byte in d0 to be 32-bit. neg.l %d0 ; d0 = 0 - d0. 0 stays 0, -1 becomes 1. rts ; return. > At first glance not sure why the mvs.b is necessary. I agree. It could be (* marks change) tst.l 8(%fp) ; compare x to 0. sne %d0 ; if x != 0: d0 = 0xff. unlk %fp ; prepare for return. * neg.b %d0 ; d0 = 0 - d0. 0 stays 0, -1 becomes 1. rts ; return. if the neg.l became a neg.b. I guess it's because it knows it's returning a 32-bit int and doesn't see it can stick with 8-bit. Cheers, Ralph. -- Next meeting: Bournemouth? TBD, Wednesday 2010-10-06 20:00 Meets, Mailing list, IRC, LinkedIn, ... http://dorset.lug.org.uk/ How to Report Bugs Effectively: http://bit.ly/4sACa