为什么ARM区分SDIV和UDIV而不区分ADD、SUB和MUL?
Why does ARM distinguish between SDIV and UDIV but not with ADD, SUB and MUL?
如题所述,为什么ARM指令集只在除法上区分有符号和无符号?
SDIV 和 UDIV 可用,但 ADD、SUB 和 MUL 不可用。
相同大小的有符号数和无符号数的加法和减法在二进制补码数学(ARM 使用的)中产生完全相同的位模式,因此不需要单独的指令。
例如,如果我们采用字节大小的值:
0xFC +4
signed: -4+4 = 0
unsigned: 252 +4 = 256 = 0x100 = 0x00 (truncated to byte)
乘法结果确实会根据操作数被解释为有符号还是无符号而改变,但是 MUL
指令产生 仅结果的低 32 位 ,这在这两种情况下都是一样的。
在最近的 ARM 处理器中,有一些指令可以产生完整的 64 位结果,并且这些指令成对出现,就像 SDIV 和 UDIV:
UMULL, UMLAL, SSMULL, SMLAL:
Signed and Unsigned Long Multiply, with optional Accumulate, with
32-bit operands, and 64-bit result and accumulator.
如题所述,为什么ARM指令集只在除法上区分有符号和无符号?
SDIV 和 UDIV 可用,但 ADD、SUB 和 MUL 不可用。
相同大小的有符号数和无符号数的加法和减法在二进制补码数学(ARM 使用的)中产生完全相同的位模式,因此不需要单独的指令。
例如,如果我们采用字节大小的值:
0xFC +4
signed: -4+4 = 0
unsigned: 252 +4 = 256 = 0x100 = 0x00 (truncated to byte)
乘法结果确实会根据操作数被解释为有符号还是无符号而改变,但是 MUL
指令产生 仅结果的低 32 位 ,这在这两种情况下都是一样的。
在最近的 ARM 处理器中,有一些指令可以产生完整的 64 位结果,并且这些指令成对出现,就像 SDIV 和 UDIV:
UMULL, UMLAL, SSMULL, SMLAL:
Signed and Unsigned Long Multiply, with optional Accumulate, with 32-bit operands, and 64-bit result and accumulator.