1

現在、ARMアセンブリコードを使用してiPhoneのVFPユニット用のプログラムを作成しようとしています。VFPは浮動小数点計算を実行できますが、AFAIKは整数演算を実行できません。ただし、floatを符号付き整数(4バイト)に変換できます。また、このクイックリファレンスによると:http ://www.voti.nl/hvu/arm/ARMquickref.pdf シフト操作をサポートしていないようです

私がやりたいのは、それぞれが-127より大きく127より小さいと確信している4つのfloatを4つの符号付きバイトに変換することです。

シフト操作を使用できる場合は、floatを符号付き整数に変換してから、値を左に12バイト(次の2つの値はそれぞれ8バイトと4バイト)シフトし、4つすべてをビット単位でORします。

ただし、シフトは利用できないため、別の方法を見つける必要があります。また、整数演算を使用することはできません(したがって、シフトするために、すでに変換された整数に2 ^ nを掛けることはできませんが、代わりにfloatで作業する必要があります)。

誰もが私がそれを達成する方法を知っていますか?

ところで、ARMアーキテクチャに精通している人のために-これは多くの要素で動作するループで行われ、このループ内でサム命令とアーム命令を切り替えたくないので、サム命令に切り替えたくありません(それは高価な)

ありがとう!

編集:

追加の質問:3つの要素でベクトルを正規化するにはどうすればよいですか?

4

1 に答える 1

2

ftosis単精度FP値を4バイト整数に変換するVFP命令が必要です。s0-s3に4つのフロートがある場合は、次のようにします。

ftosis s0, s0
ftosis s1, s1
ftosis s2, s2
ftosis s3, s3

s0〜s3には4つの4バイト整数があり、。を使用してメモリに連続して格納できますfstm

NEONをサポートするARMプロセッサではvcvt.s32.f32 q0, q0、1つの命令で4つの変換を実行するために使用できます。


フォローアップの質問に答えるために編集します。これは、メモリ内の4つのfloatへのポインタを入力として受け取り、変換された値を1つのint32_tにパックして返す簡単なサンプル関数です。

_floatToPackedInt:
    fldmias   r0,  {s4-s7}
    ftosizs   s0,   s4
    ftosizs   s1,   s5
    ftosizs   s2,   s6
    ftosizs   s3,   s7
    fmrrs r0, r1,  {s0,s1}
    fmrrs r2, r3,  {s2,s3}
    uxtb      r0,   r0
    uxtb      r1,   r1
    uxtb      r2,   r2
    orr       r0,   r0, r1, lsl #8
    orr       r0,   r0, r2, lsl #16
    orr       r0,   r0, r3, lsl #24
    bx        lr

パフォーマンスが重要な場合は、この方法で変換を実行したくないため、これを調整するために実際には何の努力もしませんでした。値の大きな配列を操作し、このコードをパイプラインして複数の変換が同時に実行されるようにするか、同様に有用な作業を行っている他の操作とインターリーブすることをお勧めします。

ssatsの前にsを挿入uxtbして、範囲外の値を折り返す代わりに飽和させることもできます。

また、このコードはARMv7コアではパフォーマンスが低下することに注意してください。そのプラットフォームでNEONベクトル演算を使用することをお勧めします。

于 2010-01-18T23:25:41.410 に答える