4

次の 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

倍精度 VFP 命令に使用できるように、d16 register-double をゼロにするにはどうすればよいですか?

4

2 に答える 2

6

VMOVは、限られた浮動小数点イミディエートのセットのみを受け入れることができます。驚くべきことに、0はそれらの1つではありません。

+/- 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 に答える