Differences

This shows you the differences between two versions of the page.

 psx:cpu:division [2012/10/23 13:12]amidog psx:cpu:division [2012/10/23 13:17]amidog Both sides previous revision Previous revision 2012/10/23 13:17 amidog 2012/10/23 13:12 amidog 2012/10/23 13:07 amidog created 2012/10/23 13:17 amidog 2012/10/23 13:12 amidog 2012/10/23 13:07 amidog created Line 1: Line 1: - The PSX has a few undefined cases when it comes to division. It's important to remeber ​than undefined isn't the same as inconsistent or unstable, and as a result, there are games out the which relies on this undefined behavior. + The PSX has a few undefined cases when it comes to division. It's important to remeber ​that undefined isn't the same as inconsistent or unstable, and as a result, there are games out there which relies on this undefined behavior. ====== Signed division by zero ====== ====== Signed division by zero ====== - The result of a division by zero is consistent with the result of a smiple ​radix-2 ("one bit at a time") implementation. That is, if the dividend is negative, the quotient is 1 (0x00000001),​ and if the dividend is positive or zero, the quotient is -1 (0xffffffff). In both cases the remainder equals the dividend. + The result of a division by zero is consistent with the result of a simple ​radix-2 ("one bit at a time") implementation. That is, if the dividend is negative, the quotient is 1 (0x00000001),​ and if the dividend is positive or zero, the quotient is -1 (0xffffffff). In both cases the remainder equals the dividend. ====== Unsigned division by zero ====== ====== Unsigned division by zero ====== Line 8: Line 8: ====== Signed division of most negative by minus one ====== ====== Signed division of most negative by minus one ====== - This is actually quite interesting,​ not the result of the operation, but the fact that some CPUs (x86 for example) will trigger an arithmetic exception when dividing 0x80000000 by 0xffffffff. Thus you may be able to crash your favourite (x86) PSX emulator ​by a few lines of MIPS code. The result of the operation ​is a quotient of 0x80000000 and a remainder of 0x00000000. + This is actually quite interesting,​ not the result of the operation, but the fact that some CPUs (x86 for example) will trigger an arithmetic exception when dividing 0x80000000 by 0xffffffff. Thus, unless ​your favourite (x86) emulator ​handles this case, you may be able to crash it with a few lines of MIPS code. The result of the division ​is a quotient of 0x80000000 and a remainder of 0x00000000.