| /* { dg-require-effective-target vect_float } */ |
| |
| #include "tree-vect.h" |
| |
| extern void abort (void); |
| |
| #define NOINLINE __attribute__((noinline)) |
| |
| typedef float float32x4_t __attribute__ ((__vector_size__ (16))); |
| typedef float float32x2_t __attribute__ ((__vector_size__ (8))); |
| |
| NOINLINE float |
| foo32x4_be (float32x4_t x) |
| { |
| return x[3]; |
| } |
| |
| NOINLINE float |
| foo32x4_le (float32x4_t x) |
| { |
| return x[0]; |
| } |
| |
| NOINLINE float |
| bar (float a) |
| { |
| return a; |
| } |
| |
| NOINLINE float |
| foo32x2_be (float32x2_t x) |
| { |
| #ifdef __i386__ |
| /* ix86 passes float32x2 vector arguments in mmx registers. We need to |
| emit emms to empty MMS state and reenable x87 stack before float value |
| can be loaded to and passed in x87 floating-point return register. */ |
| __builtin_ia32_emms (); |
| #endif |
| return bar (x[1]); |
| } |
| |
| NOINLINE float |
| foo32x2_le (float32x2_t x) |
| { |
| #ifdef __i386__ |
| __builtin_ia32_emms (); |
| #endif |
| return bar (x[0]); |
| } |
| |
| NOINLINE int |
| test (void) |
| { |
| float32x4_t a = { 0.0f, 1.0f, 2.0f, 3.0f }; |
| float32x2_t b = { 0.0f, 1.0f }; |
| |
| if (foo32x2_be (b) != 1.0f) |
| abort (); |
| |
| if (foo32x2_le (b) != 0.0f) |
| abort (); |
| |
| if (foo32x4_be (a) != 3.0f) |
| abort (); |
| |
| if (foo32x4_le (a) != 0.0f) |
| abort (); |
| |
| return 0; |
| } |
| |
| int |
| main () |
| { |
| check_vect (); |
| return test (); |
| } |