1
1
#include <assert.h>
2
+ #include <limits.h>
3
+
2
4
#ifdef _MSC_VER
3
5
# include <intrin.h>
6
+ # ifdef _WIN64
7
+ # define _mm_extract_pi16 (a , b ) _mm_extract_epi16(a, b)
8
+ # endif
4
9
#else
5
10
# include <immintrin.h>
6
11
#endif
@@ -10,5 +15,44 @@ int main()
10
15
__m128i values = _mm_setr_epi32 (0x1234 , 0x2345 , 0x3456 , 0x4567 );
11
16
int val1 = _mm_extract_epi32 (values , 0 );
12
17
assert (val1 == 0x1234 );
18
+
19
+ #ifndef _WIN64
20
+ __m64 a = _mm_setr_pi16 (SHRT_MIN , 10 , SHRT_MIN + 1 , SHRT_MAX );
21
+ __m64 b = _mm_set_pi16 (1 , 1 , 10 , 1 );
22
+ __m64 result = _mm_subs_pi16 (a , b );
23
+ #else
24
+ __m128i a = _mm_setr_epi16 (SHRT_MIN , 10 , SHRT_MIN + 1 , SHRT_MAX , 0 , 0 , 0 , 0 );
25
+ __m128i b = _mm_set_epi16 (0 , 0 , 0 , 0 , 1 , 1 , 10 , 1 );
26
+ __m128i result = _mm_subs_epi16 (a , b );
27
+ #endif
28
+ short s1 = _mm_extract_pi16 (result , 0 );
29
+ assert (s1 == SHRT_MIN );
30
+ short s2 = _mm_extract_pi16 (result , 1 );
31
+ assert (s2 == 0 );
32
+ short s3 = _mm_extract_pi16 (result , 2 );
33
+ assert (s3 == SHRT_MIN );
34
+ short s4 = _mm_extract_pi16 (result , 3 );
35
+ assert (s4 == SHRT_MAX - 1 );
36
+
37
+ #ifndef _WIN64
38
+ result = _mm_adds_pi16 (a , b );
39
+ #else
40
+ result = _mm_adds_epi16 (a , b );
41
+ #endif
42
+ s1 = _mm_extract_pi16 (result , 0 );
43
+ assert (s1 == SHRT_MIN + 1 );
44
+ s2 = _mm_extract_pi16 (result , 1 );
45
+ assert (s2 == 20 );
46
+ s3 = _mm_extract_pi16 (result , 2 );
47
+ assert (s3 == SHRT_MIN + 2 );
48
+ s4 = _mm_extract_pi16 (result , 3 );
49
+ assert (s4 == SHRT_MAX );
50
+
51
+ __m128i x = _mm_set_epi16 (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
52
+ __m128i y = _mm_setr_epi16 (1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
53
+ __m128i result128 = _mm_subs_epu16 (x , y );
54
+ short s = _mm_extract_epi16 (result128 , 0 );
55
+ assert (s == 0 );
56
+
13
57
return 0 ;
14
58
}
0 commit comments