以下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指令?
答案 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]