SSE内在函数:屏蔽浮点数并使用按位和?

时间:2014-12-15 14:12:06

标签: c++ sse intrinsics

基本上,该问题与x86汇编程序有关,您可以使用and编号设置为零或编号。如果and 数字为负数,则会返回数字本身,但如果and为零则为零。

现在我遇到SSE教义问题的问题是浮点数与二进制数的二进制数相同(或者我错了)。无论如何这里的代码,我尝试使用各种浮动来掩盖第二和第三个数字(分别为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;
}

3 个答案:

答案 0 :(得分:4)

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 }

答案 1 :(得分:3)

您可以将任何SSE向量转换为相同大小(128位或256位)的任何SSE向量类型,并且您将获得与以前完全相同的;不会有任何实际的代码。显然,如果你将4浮点数转换为2倍,你会得到废话,但是对于你的情况你将浮点数转换为某种整数类型,然后执行和,将结果转换回来。

答案 2 :(得分:0)

如果你有SSE4.1(我打赌你这样做),你应该考虑_mm_blendv_ps(a,b,mask)。这只使用其mask参数的符号位,基本上实现了矢量化mask<0?b:a