| /* { 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 (); |
| } |