以下 ARM 汇编:
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 register-double 归零,以便将其用于双精度 VFP 指令?
VMOV 只能接受一组有限的浮点立即数,而且令人惊讶的是,0 不是其中之一:
任何可以表示为 +/-n * 2 -r的数字,其中 n 和 r 是整数,16 <= n <= 31, 0 <= r <= 7。
您可以按照 BitBank 的建议进行操作,或者使用整数移动,这也会将寄存器归零。
vmov.i64 d16, #0
NEON 指令不允许您将 64 位或 128 位立即数加载到寄存器中。浮点值 0.0 也恰好是 0x0000000000000000,所以另一种实现方法是使用整数运算:
veor.i64 d16,d16,d16
或者您可以从内存中加载值(慢得多)
double zero[] = {0.0};
vld1.64 d16,[zero]