| /* { dg-do run { target le } } */ |
| /* { dg-require-effective-target powerpc_p8vector_ok } */ |
| /* { dg-options "-mdejagnu-cpu=power8 -O2 " } */ |
| |
| typedef __attribute__ ((__aligned__ (8))) unsigned long long __m64; |
| typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); |
| |
| /* PR84033. Extracted from xmmintrin.h but with a pointer param to |
| allow swaps to happen when not inline. */ |
| int __attribute__ ((__noinline__)) |
| _mm_movemask_ps (__m128 *__A) |
| { |
| __vector __m64 result; |
| static const __vector unsigned int perm_mask = |
| { |
| 0x00204060, 0x80808080, 0x80808080, 0x80808080 |
| }; |
| |
| result = (__vector __m64) |
| __builtin_vec_vbpermq ((__vector unsigned char) (*__A), |
| (__vector unsigned char) perm_mask); |
| return result[1]; |
| } |
| |
| int |
| main (void) |
| { |
| union { unsigned int i[4]; __m128 m; } x |
| = { 0x80000000, 0x80000000, 0x7fffffff, 0x7fffffff }; |
| if (_mm_movemask_ps (&x.m) != 3) |
| __builtin_abort (); |
| return 0; |
| } |