1 /* { dg-do run } */
2 /* { dg-options "-O3 -mpower8-vector" } */
3 /* { dg-require-effective-target p8vector_hw } */
4
5 #define NO_WARN_X86_INTRINSICS 1
6 #ifndef CHECK_H
7 #define CHECK_H "mmx-check.h"
8 #endif
9
10 #ifndef TEST
11 #define TEST mmx_test
12 #endif
13
14 #include CHECK_H
15
16 #include <mmintrin.h>
17
18 static __m64
19 __attribute__((noinline, unused))
20 test (__m64 s1, __m64 s2)
21 {
22 return _mm_packs_pi32 (s1, s2);
23 }
24
25 static short
26 saturate (int val)
27 {
28 if (val > 32767)
29 return 32767;
30 else if (val < -32768)
31 return -32768;
32 else
33 return val;
34 }
35
36 static inline int
37 l_mm_extract_pi32 (__m64 b, int imm8)
38 {
39 unsigned int shift = imm8 & 0x1;
40 #ifdef __BIG_ENDIAN__
41 shift = 1 - shift;
42 #endif
43 return ((long long)b >> (shift * 32)) & 0xffffffff;
44 }
45
46 static void
47 TEST (void)
48 {
49 __m64_union s1, s2;
50 __m64_union u;
51 __m64_union e;
52 int start, end, inc;
53
54 s1.as_m64 = _mm_set_pi32 (2134, -128);
55 s2.as_m64 = _mm_set_pi32 (41124, 234);
56 u.as_m64 = test (s1.as_m64, s2.as_m64);
57
58 #ifdef __LITTLE_ENDIAN__
59 e.as_m64 = _mm_set_pi16 (saturate (l_mm_extract_pi32 (s2.as_m64, 1)),
60 saturate (l_mm_extract_pi32 (s2.as_m64, 0)),
61 saturate (l_mm_extract_pi32 (s1.as_m64, 1)),
62 saturate (l_mm_extract_pi32 (s1.as_m64, 0)));
63 #else
64 e.as_m64 = _mm_set_pi16 (saturate (l_mm_extract_pi32 (s1.as_m64, 1)),
65 saturate (l_mm_extract_pi32 (s1.as_m64, 0)),
66 saturate (l_mm_extract_pi32 (s2.as_m64, 1)),
67 saturate (l_mm_extract_pi32 (s2.as_m64, 0)));
68 #endif
69
70 if (u.as_m64 != e.as_m64)
71 abort ();
72 }