В основном проблема связана с ассемблером x86, где у вас есть номер, который вы хотите установить либо на нуль, либо на номер с номером, используя and
. Если вы , то номер с отрицательным вы получите номер сам, но если вы and
с нулем, вы получите нуль.SSE intrinsics: маскирование поплавка и использование побитового и?
Теперь проблема, с которой я столкнулась в 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;
}
Каковы заголовки '_mm_castsi128_ps' и' _mm_set_epi32'? Спасибо. – pandoragami
Это просто базовый материал SSE2, поэтому '#include" emmintrin.h "'. См. Очень полезное [Intel Intrinsics Guide] (https://software.intel.com/sites/landingpage/IntrinsicsGuide/) для дальнейшего использования. –
Большое спасибо! – pandoragami