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

时间:2018-03-13 11:16:24

标签: assembly arm armv7 instruction-set

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

干杯

3 个答案:

答案 0 :(得分:5)

如果查看instruction encoding table of the ARM ISA,您会发现只有数据处理指令支持立即操作数(with an interesting encoding, by the way);他们是唯一拥有12位 operand2 的人,所有其他人最多只有Rs和Rm的4位字段(其间保留的空间用于消除其他指令类别的歧义) )。

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

答案 1 :(得分:1)

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

通常,这样的选择是为了优化其他操作/内存访问/缓存利用率而做出的折衷决定。这种权衡通常比在硅片上包含该指令更有益。

答案 2 :(得分:0)

因为arm使用了一些固定的指令长度,并没有剩下很多位,但是有一个桶形移位器,所以想想科学记数法,你可以有一组位移位而不是位扩展(除了在顶部移位),所以0x00000099,0x00099000,0x09900000一般都可以,这取决于指令/设置,但0x00900090可能不是,当然不是0x12345678,这是没有意义的。它是RISC而不是CISC并不意味着每个指令都能够做到一切,认为加载存储架构比CISC更多......