I've writen the following MIPS assembly code to test for arithmetic overflow
.text add $s0, $zero, 0x80000000 add $s1, $zero, 0xD0000000 add $t0, $s0, $s1
MARS is translates the code above into this:
lui $1, 0xffff8000 ori $1, $1, 0x00000000 add $16, $0, $1 lui $1, 0xffffd000 ori $1, $1, 0x00000000 add $17, $0, $1 add $8, $16, $17
I can't undertand why the add instructions got transformed into a lui/ori/add instrution since the constant added is 32bit and as far as I know $s0 is also 32bit. Also, where did 0xffff8000 come from? A constant in assembly is always assumed to be in two's complement, right? So why the conversion?
Thanks for the help.