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
      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
      43  ssse3_test (void)
      44  {
      45    u64 x = foo ((v4hi) { 5 });
      46    if (x != 0x0005000500050505)
      47      __builtin_abort ();
      48  }