在ARM寄存器中加载立即浮点

时间:2013-07-23 10:14:36

标签: assembly arm neon

我需要使用汇编在NEON寄存器(或ARM寄存器,而不是VMOV)中加载立即值0.5f(= HEX中的0.8)。

我读过ARM文档:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204h/Bcfjicfj.html 链接到:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204h/CIHGGEEB.html

他们说你可以加载浮点数:

  

任何可以表示为+/- n * 2-r的数字,其中n和r是整数,16 <= n <= 31,0 <= r <= 7。

因为0.8超出范围,我希望我需要加载HEX 1.8并减去1.0但是以下指令对于编译器来说不行:

VMOV.F32 d10, #0x1.0 \n\t
VMOV.F32 d10, #0x1.8 \n\t

然而,使用0.5十进制值可以解决问题,即使它应该超出范围:

VMOV.F32 d10, #0.5 \n\t

使用HEX值如何进行相同的操作?

还有一个问题:以前的VMOV.F32指令是否会在寄存器d10 [0]和d10 [1]的32位部分中加载该值?

1 个答案:

答案 0 :(得分:2)

0.5正是+16*(2^-5)(n = 16,r = 5,请注意手册中不是2-r,它是2提升到-r),所以移动的值是可以的。

换句话说,0x0.8也应该工作(虽然我不能测试那个非常汇编,但是hex float语法不同)

手册也说;

  

imm是由datatype指定的类型的常量。复制它以填充目标寄存器。

当我读到它时,会填满寄存器的整个(两部分)。