将立即值移至浮点寄存器和性能问题

时间:2015-10-26 12:55:40

标签: assembly floating-point arm

我正在尝试将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

0 个答案:

没有答案