c++: Fix crash during NRV optimization with invalid input [PR117099, PR117129]
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / mmx-packssdw-1.c
blobdff0e3cd573cb7ab26f4a1d309956f4129478dc3
1 /* { dg-do run } */
2 /* { dg-options "-O3 -mvsx" } */
3 /* { dg-additional-options "-mdejagnu-cpu=power8" { target { ! has_arch_pwr8 } } } */
4 /* { dg-require-effective-target p8vector_hw } */
6 #define NO_WARN_X86_INTRINSICS 1
7 #ifndef CHECK_H
8 #define CHECK_H "mmx-check.h"
9 #endif
11 #ifndef TEST
12 #define TEST mmx_test
13 #endif
15 #include CHECK_H
17 #include <mmintrin.h>
19 static __m64
20 __attribute__((noinline, unused))
21 test (__m64 s1, __m64 s2)
23 return _mm_packs_pi32 (s1, s2);
26 static short
27 saturate (int val)
29 if (val > 32767)
30 return 32767;
31 else if (val < -32768)
32 return -32768;
33 else
34 return val;
37 static inline int
38 l_mm_extract_pi32 (__m64 b, int imm8)
40 unsigned int shift = imm8 & 0x1;
41 #ifdef __BIG_ENDIAN__
42 shift = 1 - shift;
43 #endif
44 return ((long long)b >> (shift * 32)) & 0xffffffff;
47 static void
48 TEST (void)
50 __m64_union s1, s2;
51 __m64_union u;
52 __m64_union e;
53 int start, end, inc;
55 s1.as_m64 = _mm_set_pi32 (2134, -128);
56 s2.as_m64 = _mm_set_pi32 (41124, 234);
57 u.as_m64 = test (s1.as_m64, s2.as_m64);
59 #ifdef __LITTLE_ENDIAN__
60 e.as_m64 = _mm_set_pi16 (saturate (l_mm_extract_pi32 (s2.as_m64, 1)),
61 saturate (l_mm_extract_pi32 (s2.as_m64, 0)),
62 saturate (l_mm_extract_pi32 (s1.as_m64, 1)),
63 saturate (l_mm_extract_pi32 (s1.as_m64, 0)));
64 #else
65 e.as_m64 = _mm_set_pi16 (saturate (l_mm_extract_pi32 (s1.as_m64, 1)),
66 saturate (l_mm_extract_pi32 (s1.as_m64, 0)),
67 saturate (l_mm_extract_pi32 (s2.as_m64, 1)),
68 saturate (l_mm_extract_pi32 (s2.as_m64, 0)));
69 #endif
71 if (u.as_m64 != e.as_m64)
72 abort ();