为什么 _mm_extract_epi16 没有得到预期的结果?
why _mm_extract_epi16 doesn't get expected result?
我在我的程序中发现错误是由误用 SSE '_mm_extract_epi16' 指令引起的,如下面的代码:
#include <smmintrin.h>
#include <iostream>
int main(int argc, const char * argv[]) {
int16_t test_input[8] = {-1, 2, -3, -4, -5, -6, -7, -8};
__m128i v_input = _mm_load_si128((__m128i *)test_input);
int32_t extract = (int32_t)(_mm_extract_epi16(v_input, 1));
return 0;
}
如果提取的值为正数,则我得到正确的值 2。相反,我得到错误的值“65533”。或者我可以使用下面的代码获取正确的值。
#include <smmintrin.h>
#include <iostream>
int main(int argc, const char * argv[]) {
int16_t test_input[8] = {-1, 2, -3, -4, -5, -6, -7, -8};
__m128i v_input = _mm_load_si128((__m128i *)test_input);
int16_t extract = (_mm_extract_epi16(v_input, 1));
int32_t result = extract;
return 0;
}
我不知道为什么会这样。
int _mm_extract_epi16 ( __m128i a, int imm)
将 zero-extending 的 pextrw
instruction 的 asm 行为匹配到 32 位寄存器中。
英特尔的内在函数 API 在所有地方使用 int
即使无符号类型更合适。
如果你想对结果做16位符号扩展,
使用(int16_t)_mm_extract_epi16(v,1)
。或者将其分配给一个 int16_t
变量,这样结果的高位字节将被忽略。
无符号 65533
= 2 的补码 -3
。这个是正常的。 (216 - 3 = 65533 = 0xfffd
)
我在我的程序中发现错误是由误用 SSE '_mm_extract_epi16' 指令引起的,如下面的代码:
#include <smmintrin.h>
#include <iostream>
int main(int argc, const char * argv[]) {
int16_t test_input[8] = {-1, 2, -3, -4, -5, -6, -7, -8};
__m128i v_input = _mm_load_si128((__m128i *)test_input);
int32_t extract = (int32_t)(_mm_extract_epi16(v_input, 1));
return 0;
}
如果提取的值为正数,则我得到正确的值 2。相反,我得到错误的值“65533”。或者我可以使用下面的代码获取正确的值。
#include <smmintrin.h>
#include <iostream>
int main(int argc, const char * argv[]) {
int16_t test_input[8] = {-1, 2, -3, -4, -5, -6, -7, -8};
__m128i v_input = _mm_load_si128((__m128i *)test_input);
int16_t extract = (_mm_extract_epi16(v_input, 1));
int32_t result = extract;
return 0;
}
我不知道为什么会这样。
int _mm_extract_epi16 ( __m128i a, int imm)
将 zero-extending 的 pextrw
instruction 的 asm 行为匹配到 32 位寄存器中。
英特尔的内在函数 API 在所有地方使用 int
即使无符号类型更合适。
如果你想对结果做16位符号扩展,
使用(int16_t)_mm_extract_epi16(v,1)
。或者将其分配给一个 int16_t
变量,这样结果的高位字节将被忽略。
无符号 65533
= 2 的补码 -3
。这个是正常的。 (216 - 3 = 65533 = 0xfffd
)