为什么不能在 mul 指令中使用立即数?

Why cant an immediate value be used in mul instruction?

我正在为 ARMv7 处理器编写指令。我想知道为什么我不允许在 MUL 指令本身中有一个常量值?您可以使用 ADD 和 SUB 指令,为什么不能使用 MUL?

干杯

这就是处理器架构的工作原理。不同的架构有不同的要求。

通常,这样的选择是为了优化其他 operations/memory access/cache 利用率而做出的折衷决定。权衡通常比在硅片上包含该指令更有利。

如果你看 instruction encoding table of the ARM ISA you'll see that only data processing instructions support immediate operands (with an interesting encoding, by the way);它们是唯一具有 12 位 operand2 的,所有其他的最多只有 4 位 Rs 和 Rm 字段(保留在两者之间的 space用于消除与其他指令类别的歧义)。

这个决定可能是因为在乘法指令中嵌入立即数并不是特别有趣;如果乘数已知,mul 通常是一个糟糕的选择,因为 add/shift/sub 通常有更快的序列。此外,乘法指令的成本可能是这样的,即在指令中直接直接获得的延迟增益不能证明 "stealing" 在数据处理指令编码中可用的 16 个槽中的一个槽是合理的。

因为 arm 使用有点固定的指令长度,所以没有剩下那么多位,尽管有一个桶形移位器,所以想想科学记数法,你可以移动一簇位而不是散开位(除了围绕顶部移动),因此 0x00000099、0x00099000、0x09900000 通常可以,具体取决于 instruction/set,但 0x00900090 可能不行,当然 0x12345678 也行,那是没有意义的。是 RISC 不是 CISC 并不意味着让每条指令都能做所有事情,认为加载存储架构比 CISC 更多...