我正在尝试将ARM汇编代码转换为使用浮点寄存器而不是ARM寄存器(由于性能问题,我希望避免使用push和pop来保存当前寄存器的状态。)
以下代码将在一些ARM汇编指令之前添加(在bl,blx,bx,b之前准确)
push {r0, r1, r2, r3, r4}
MOV R2, #0x22
MOV R1, #0x33
MUL R3, R2, R1
movw r4, #:lower16:Global
movt r4, #:upper16:Global
movs r2, #0
str r2, [r4]
movs r4, r3
pop {r0, r1, r2, r3, r4}
你可以看到我正在做一些计算。在运行b,bl,bx,blx之前。 但是由于性能损失(我猜它是由推和弹出引起的)我想避免使用push和pop。相反,我想在ARM中使用浮点寄存器(使用VFP 2.0指令)。
这是我的第一个挑战。我可以将立即值复制到arm中的浮点寄存器吗?
首先,我想知道是否可以使用VMOV将立即值复制到浮点寄存器。如果是,那么我可以使用ARM命令对浮点寄存器进行数学运算吗?如果没有,那么MUL的替代方案是什么,
VMOV S2, #0x22
VMOV S1, #0x33
VFMA R3, S2, S1
movw S4, #:lower16:Global
movt S4, #:upper16:Global
movs S2, #0
VSTR S2, [S4]
movs S4, S3
我从ARM指令到VFP2.0指令集的转换是不正确的。因为我在VFP2.0中找不到movt和movs的替代指令
有什么方法可以使用浮点寄存器而不是原始的ARM汇编代码来降低性能损失。如果是,那我怎么能正确转换代码呢?
我使用的是Raspberry Pi(BCM 2835)平台。
有关ARM CPU中浮点指令的详细信息: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/CHDHHAJF.html https://www.arm.com/products/processors/technologies/vector-floating-point.php