2012-02-06 5 views
3

これはthis oneへのフォローアップの質問です。今私は逆方向float - >符号なし intに変換したいと思います。 次のスカラー演算の最適で正確なベクトルシーケンスは何ですか?floatのベクトルをuint32のベクトルに変換する最も効率的な方法は?

float x = ... 
unsigned int res = (unsigned int)x; 
+0

http://stackoverflow.com/questions/ 78619 /最速のway-to-convert-floatからint-on-x86へ – Anycorn

+0

同じ質問ではありません!私は** unsigned ** int –

+0

に変換したいと思います。負の符号で何をしたいですか? – Anycorn

答えて

2

これは残念ながらhttp://developer.apple.comでご利用いただけなくなりました今ある古いが便利なアップルのAltiVec-SSEの移行のドキュメントからの例に基づいています。

inline __m128i _mm_ctu_ps(const __m128 f) 
{ 
    const __m128 two31 = _mm_set1_ps(0x1.0p31f); 
    const __m128 two32 = _mm_add_ps(two31, two31); 
    const __m128 zero = _mm_xor_ps(f,f); 

    // check for overflow before conversion to int 
    const __m128 overflow = _mm_cmpge_ps(f, two31); 
    const __m128 overflow2 = _mm_cmpge_ps(f, two32); 
    const __m128 subval = _mm_and_ps(overflow, two31); 
    const __m128i addval = _mm_slli_epi32((__m128i)overflow, 31); 
    __m128i result; 

    // bias the value to signed space if it is >= 2**31 
    f = _mm_sub_ps(f, subval); 

    // clip at zero 
    f = _mm_max_ps(f, zero); 

    // convert to int with saturation 
    result = _mm_cvtps_epi32(f); // rounding mode should be round to nearest 

    // unbias 
    result = _mm_add_epi32(result, addval); 

    // patch up the overflow case 
    result = _mm_or_si128(result, (__m128i)overflow2); 

    return result; 
} 
関連する問題