blob: 8128be325e46b51a036eac9b3ade349a8ce0ca2e [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target ssse3 } */
/* { dg-options "-O -mssse3" } */
#ifndef CHECK_H
#define CHECK_H "ssse3-check.h"
#endif
#ifndef TEST
#define TEST ssse3_test
#endif
#include CHECK_H
typedef char __attribute__ ((__vector_size__ (8))) v8qi;
typedef short __attribute__ ((__vector_size__ (8))) v4hi;
typedef int __attribute__ ((__vector_size__ (8))) v2si;
typedef long long __attribute__ ((__vector_size__ (8))) v1di;
typedef unsigned long long u64;
u64 k, c;
v8qi g, h, p, q;
v4hi d, e, f, l, n, o;
v2si j;
u64
foo (v4hi r)
{
v8qi s;
f = (v4hi) j;
e = __builtin_ia32_psrlwi ((v4hi) k, c);
s = __builtin_ia32_pavgb (h, h);
n = __builtin_ia32_pabsw (f);
o = __builtin_ia32_psubusw (n, l);
p = __builtin_ia32_packsswb (r, o);
q = __builtin_ia32_pshufb (p, s);
g = __builtin_ia32_punpcklbw (q, (v8qi) r);
d = r;
return (u64) g + (u64) h + (u64) j;
}
static void
ssse3_test (void)
{
u64 x = foo ((v4hi) { 5 });
if (x != 0x0005000500050505)
__builtin_abort ();
}