操作数的顺序会影响 MUL 运算的性能吗?

Does the order of operands affect performance of MUL operation?

我听说 MUL 中的操作数顺序会影响性能。
ARM汇编中,操作数的顺序会影响MUL运算的性能吗?

性能,不(据我所知)。但是,在某些 ARM 架构上,操作数顺序可能因其他原因而变得重要。来自 ARM7TDMI 指令集手册(DDI 0029E):

4.7.1 Operand restrictions
The destination register Rd must not be the same as the operand register Rm. R15 must not be used as an operand or as the destination register.

所以,比如不写mul r1,r1,r2,写mul r1,r2,r1就可以了。该手册似乎没有具体说明如果您对 RdRm 使用相同的寄存器会发生什么,它可能取决于具体的实现。 ARM ARM (DDI 0100E) 说结果是 UNPREDICTABLE.

这个概念,连同操作数限制 , is a result of the early ARM cores using Booth's algorithm 来实现乘法器。 very 早期的那些直接使用目标寄存器作为工作寄存器,因此如果在这个过程中破坏了你的一个输入操作数,你最终会得到一个无意义的结果——后来的内核有更好的乘法器(我认为从 ARM7TDMI 开始)将工作保留在乘法器单元内部,并且只在末尾回写到寄存器,因此最终在 ARMv6 架构中完全取消了特定限制。然而,这样的迭代算法也可能能够提前终止,并且 v6 架构仍然形式化了早期实现的行为,并注意任何提前终止的实现必须基于 second操作数。

实际上这意味着,在一个合适的古老内核上,操作 MUL Rd, Rm, Rs 所需的周期数可能 depend on how many non-sign bits Rs has,但在 ARMv5 和更高版本的设计上,您几乎可以肯定地假设快速固定时间乘法器,它没有任何区别。