簡體   English   中英

SSE內在函數:屏蔽浮點數並使用按位和?

[英]SSE intrinsics: masking a float and using bitwise and?

基本上,問題是有關,你必須要設置為零或使用數字本身的一些 x86匯編and 如果你and負一個號碼 ,你回來本身的數量 ,但是,如果你and它與零你為零。

現在我對SSE instrinsics的問題是浮點數和二進制數不一樣(或者我錯了)。 無論如何這里的代碼,我已經嘗試使用各種浮動來掩蓋第二和第三個數字(分別為127.0f和99.0f),但沒有運氣。

#include <xmmintrin.h>
#include <stdio.h>

void print_4_bit_num(const char * label, __m128 var)
{
    float *val = (float *) &var;
    printf("%s: %f %f %f %f\n",
       label, val[3], val[2], val[1], val[0]);
}
int main()
{
    __m128 v1 = _mm_set_ps(1.0f, 127.0f,  99.0f, 1.0f);
    __m128 v2 = _mm_set_ps(1.0f, 65535.0f, 127.0f, 0.0f);
    __m128 v = _mm_and_ps(v1, v2);

    print_4_bit_num("v1", v1);
    print_4_bit_num("v2", v2);
    print_4_bit_num("v ", v);

    return 0;
}

AND時需要使用按位(整數)掩碼,因此要清除向量中的替換值,可以執行以下操作:

__m128 v1 = _mm_set_ps(1.0f, 127.0f,  99.0f, 1.0f);
__m128 v2 = _mm_castsi128_ps(_mm_set_epi32(0, -1, 0, -1));
__m128 v = _mm_and_ps(v1, v2); // => v = { 0.0f, 127.0f, 0.0f, 1.0f }

您可以將任何SSE向量轉換為相同大小(128位或256位)的任何SSE向量類型,並且您將獲得與以前完全相同的 ; 沒有任何實際的代碼。 顯然,如果你將4浮點數轉換為2倍,你會得到廢話,但是對於你的情況你將浮點數轉換為某種整數類型,然后執行和,將結果轉換回來。

如果你有SSE4.1(我打賭你這樣做),你應該考慮_mm_blendv_ps(a,b,mask) 這只使用其mask參數的符號位,並基本上實現了矢量化mask<0?b:a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM