为什么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.