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

Sam*_*lls 1 assembly arm instruction-set armv7

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

干杯

Mat*_*lia 5

如果你看看ARM ISA指令编码表,你会发现只有数据处理指令支持立即操作数(顺便说一下,有一个有趣的编码); 它们是唯一拥有12位操作数2的实例,所有其他操作数最多只有Rs和Rm的4位字段(其间保留的空间用于消除其他指令类别的歧义).

这个决定可能来自这样一个事实,即在乘法指令中嵌入immediates不是特别有趣; 如果乘数是已知的,mul通常是一个糟糕的选择,因为通常有更快的add/shift/sub序列.而且,乘法指令的成本可以使得从在指令中具有直接直接获得的等待时间的增益不能证明"窃取"在数据处理指令的编码中可用的16的时隙.

  • 现代x86通常具有疯狂强大的整数乘法(例如,对于任何操作数大小高达64位的3周期延迟).我假设ARM没有花那么多晶体管,但这些天它有多慢?*当ARM ISA设计为*时,乘数可能比现在慢.我猜想使用ARM的内置桶形移位器,移位和增加或减少带有几个设置位的乘法器是非常有效的,但是在典型的ARM CPU上,什么是收支平衡?在x86上,如果吞吐量比延迟更重要,则使用2个LEA指令而不是"imul r32,r/m32,imm8"是值得的,但3 LEA不值得. (2认同)