0

floatSSE4.1 以前の SIMD を使用して床/天井を計算する高速な方法を提案できる人はいますか? float32 ビット int で表現できない値がある場合など、すべてのコーナー ケースを正しく処理する必要があります。

現在、次のコードに似たものを使用しています (明確にするために asm に変換された C 組み込み関数を使用しています)。

;make many copies of the data
movaps       xmm0,   [float_value]
movaps       xmm1,   xmm0
movaps       xmm2,   xmm0

;check if the value is not too large in magnitude
andps        xmm1,   [exp_mask]
pcmpgtd      xmm1,   [max_exp]

;calculate the floor()
cvttps2dq    xmm3,   xmm2
psrld        xmm2,   31
psubd        xmm3,   xmm2
cvtsq2ps     xmm2,   xmm3

;combine the results
andps        xmm0,   xmm1
andnps       xmm1,   xmm2
orps         xmm0,   xmm1

float 値が 32 ビット int に対して大きすぎないかどうかを確認するより効率的な方法はありますか?

4

1 に答える 1

0

ベクトル命令に直接変換できる単一要素の疑似コードを次に示します。

float f;
int i = (int)f; /* 0x80000000 if out of range (as from cvtps2dq) */
if (i == 0x80000000)
    return f;
else
    return (float)i;

int2 行目のキャストに丸めモードを使用します。IEフラグをテストMXCSRして、範囲外の値を検出することもできます。

于 2011-03-11T01:46:47.173 に答える