为什么VMOV.F64不允许我加载零?

时间:2012-06-26 10:45:30

标签: assembly arm

以下ARM asm:

vmov.f64 d16, #0

失败,出现以下错误:

/tmp/ccZD4Iex.s:121: Error: immediate out of range -- `vmov.f64 d16,#0'

使用arm-none-linux-gnueabi-g ++编译(Sourcery CodeBench Lite 2012.03-57)4.6.3

如何将d16寄存器 - 双倍归零,以便将其用于双精度VFP指令?

2 个答案:

答案 0 :(得分:5)

VMOV只能接受limited set个浮点数,而且,令人惊讶的是,0不是其中之一:

  

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

您可以执行BitBank建议的操作,或使用整数移动,这也会将寄存器清零。

vmov.i64 d16, #0

答案 1 :(得分:2)

NEON指令不允许您将64位或128位立即值加载到寄存器中。浮点值0.0恰好也是0x0000000000000000,所以另一种方法是使用整数运算:

   veor.i64 d16,d16,d16

或者您可以从内存加载值(慢得多)

 double zero[] = {0.0};

   vld1.64 d16,[zero]