1

私が正しく理解していれば、ARM命令は32ビット長であるため、即時値の非常に多くのビットしか保持できません。私がやろうとしているのは、ですvmov.f32 s0, #0.0、そして私は" immediate out of range"コンパイラエラーを受け取ります。#0.5奇妙なことに、たとえば、または(すべて非常にきれいにバイナリで表されている)の即値を使用すると#0.25、コードがコンパイルされます。のイミディエート値を割り当てようとすると#0.1、 " garbage after following instruction"エラーが発生します。これは、ARM命令に収まるより多くのビットでそれらの値を表現しようとしている場合に意味があります。「」が出るの#0.0はケースだけimmediate out of rangeなので、他に説明がなければバグだと思います。

#0.0他の場所から変換せずに、のイミディエート値を1ワード浮動小数点レジスタに割り当てる方法を知っている人はいますか?そもそもうまくいかないという正当な理由がある場合は、私にも知らせてください。AndroidNDKビルドツールでGNUアセンブラを使用しています。

更新vmov.f32 d0, #0.0 動作します。それはますます意味をなさなくなり続けます。

アップデート2:これも機能しません:vmov.s32 s0, #0

4

4 に答える 4

3

0.0VFP/NEON浮動小数点イミディエートとして表すことはできません。表現可能な浮動小数点イミディエートの大きさは1/8から31の間ですが、ゼロは明らかにそうではありません。

ただし、対応するビットパターンは整数のNEONイミディエートとして表すことができます。アセンブラは役に立ち、(不可能な)浮動小数点の即時ではなく、このエンコーディングを生成します。あなたが書くとき、vmov.f32 d0, #0.0それは実際に放出しますvmov.s32 d0, #0、それはあなたがやろうとしているように見えることと同じ効果がありますが、実際には合法的な指示です。

vmov.s32 s0, #0意味がありません。sNEONは、レジスタを操作する命令を提供していません。

ただし、NEONレジスタをゼロにしたいだけの場合は、通常、推奨されるイディオムはveor d0, d0です。それを使わない理由はありますか?

于 2011-10-11T20:41:43.483 に答える
1

sレジスタに0を割り当てたい場合は、次の命令を使用して簡単に行うことができます:vsub f32 s0、s0、s0

于 2011-12-16T05:15:36.777 に答える
1

レジスタに「0」を割り当てるには(一般的なレジスタであるかNEONベクトルであるかは関係ありません)、次のようにします。

"eor s0, s0, s0 \n\t"
于 2016-03-02T19:24:23.420 に答える
0

あなたは単にこれを使うことができます:vmov.u32 d0、#0

0x00000000も0.0fとして解釈されるためです。

参考までに、フロートに「真の」ゼロはあり得ません。実際には1.0*(2 ^ -128)

または1.0*(2 ^ -129)、正確には覚えていません。

于 2011-11-01T07:12:49.837 に答える