基本上,该问题与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;
}
答案 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
。