1 /* { dg-do run } */
2 /* { dg-require-effective-target ssse3 } */
3 /* { dg-options "-O -mssse3" } */
4 
5 #ifndef CHECK_H
6 #define CHECK_H "ssse3-check.h"
7 #endif
8 
9 #ifndef TEST
10 #define TEST ssse3_test
11 #endif
12 
13 #include CHECK_H
14 
15 typedef char __attribute__ ((__vector_size__ (8))) v8qi;
16 typedef short __attribute__ ((__vector_size__ (8))) v4hi;
17 typedef int __attribute__ ((__vector_size__ (8))) v2si;
18 typedef long long __attribute__ ((__vector_size__ (8))) v1di;
19 typedef unsigned long long u64;
20 u64 k, c;
21 
22 v8qi g, h, p, q;
23 v4hi d, e, f, l, n, o;
24 v2si j;
25 
26 u64
foo(v4hi r)27 foo (v4hi r)
28 {
29   v8qi s;
30   f = (v4hi) j;
31   e = __builtin_ia32_psrlwi ((v4hi) k, c);
32   s = __builtin_ia32_pavgb (h, h);
33   n = __builtin_ia32_pabsw (f);
34   o = __builtin_ia32_psubusw (n, l);
35   p = __builtin_ia32_packsswb (r, o);
36   q = __builtin_ia32_pshufb (p, s);
37   g = __builtin_ia32_punpcklbw (q, (v8qi) r);
38   d = r;
39   return (u64) g + (u64) h + (u64) j;
40 }
41 
42 static void
ssse3_test(void)43 ssse3_test (void)
44 {
45   u64 x = foo ((v4hi) { 5 });
46   if (x != 0x0005000500050505)
47     __builtin_abort ();
48 }
49