为何ARM架构有FMLA/FMLS却仅实现FCMLA,无FCMLS指令?
为什么ARM A架构没有FCMLS指令?
首先明确相关指令的定义:
FMLA:浮点融合乘加(Floating-point fused multiply-add)FMLS:浮点融合乘减(Floating-point fused multiply-subtract)FCMLA:浮点复数乘累加(Floating-point complex multiply accumulate)
核心原因:可通过现有指令复用实现等效功能,节省指令编码空间
ARM指令集设计的核心原则之一是用最少的指令覆盖尽可能多的运算场景,避免指令数量过度膨胀导致编码空间紧张。对于复数乘减(即FCMLS预期实现的功能),完全可以通过对FCMLA的操作数取负来达到等效效果:
复数乘法的本质是两组实数运算:假设要计算复数(x + yi) * (u + vi),结果为(xu - yv) + (xv + yu)i。如果需要实现“乘减”(从目标寄存器中减去该乘积),只需将其中一个输入复数取负后传入FCMLA即可——比如将第二个复数取负为(-u - vi),此时乘积变为(-xu + yv) + (-xv - yu)i,将其累加至目标寄存器,就等价于从原目标值中减去原乘积的结果。
而FMLA和FMLS并存的原因,是浮点融合乘减的精度需求:直接执行(a*b)-c的融合运算,精度高于先计算a*b再减c的拆分操作,无法简单通过对FMLA的操作数取负来保证精度(浮点取负是精确操作,但融合运算的精度特性是单独优化的)。但复数乘累加场景中,通过操作数取负再调用FCMLA不会损失精度,因此无需单独增设FCMLS指令。
补充说明
注意:FCMLA的全称是“Floating-point complex multiply accumulate”,而非“浮点复数融合乘加”或类似表述,其核心是完成复数乘法后进行累加操作,而非融合式的乘加运算。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

