4

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

4

2 回答 2

6

VMOV 只能接受一组有限的浮点立即数,而且令人惊讶的是,0 不是其中之一:

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

您可以按照 BitBank 的建议进行操作,或者使用整数移动,这也会将寄存器归零。

vmov.i64 d16, #0
于 2012-06-26T12:42:31.640 回答
3

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

   veor.i64 d16,d16,d16

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

 double zero[] = {0.0};

   vld1.64 d16,[zero]
于 2012-06-26T12:12:21.740 回答