/* { dg-do run } */ /* { dg-require-effective-target vsx_hw } */ /* { dg-options "-O2 -mvsx" } */ #include #include #include #define ELEMENTS -1.0f, 2.0f, 0.0f, -1234.0f #define SPLAT 2345.0f vector float sv = (vector float) { ELEMENTS }; vector float splat = (vector float) { SPLAT, SPLAT, SPLAT, SPLAT }; vector float sv_global, sp_global; static vector float sv_static, sp_static; static const float expected[] = { ELEMENTS }; extern void check (vector float a) __attribute__((__noinline__)); extern void check_splat (vector float a) __attribute__((__noinline__)); extern vector float pack_reg (float a, float b, float c, float d) __attribute__((__noinline__)); extern vector float pack_from_ptr (float *p_a, float *p_b, float *p_c, float *p_d) __attribute__((__noinline__)); extern vector float pack_const (void) __attribute__((__noinline__)); extern void pack_ptr (vector float *p, float a, float b, float c, float d) __attribute__((__noinline__)); extern void pack_static (float a, float b, float c, float d) __attribute__((__noinline__)); extern void pack_global (float a, float b, float c, float d) __attribute__((__noinline__)); extern vector float splat_reg (float a) __attribute__((__noinline__)); extern vector float splat_from_ptr (float *p) __attribute__((__noinline__)); extern vector float splat_const (void) __attribute__((__noinline__)); extern void splat_ptr (vector float *p, float a) __attribute__((__noinline__)); extern void splat_static (float a) __attribute__((__noinline__)); extern void splat_global (float a) __attribute__((__noinline__)); void check (vector float a) { size_t i; for (i = 0; i < 4; i++) if (vec_extract (a, i) != expected[i]) abort (); } void check_splat (vector float a) { size_t i; for (i = 0; i < 4; i++) if (vec_extract (a, i) != SPLAT) abort (); } vector float pack_reg (float a, float b, float c, float d) { return (vector float) { a, b, c, d }; } vector float pack_from_ptr (float *p_a, float *p_b, float *p_c, float *p_d) { return (vector float) { *p_a, *p_b, *p_c, *p_d }; } vector float pack_const (void) { return (vector float) { ELEMENTS }; } void pack_ptr (vector float *p, float a, float b, float c, float d) { *p = (vector float) { a, b, c, d }; } void pack_static (float a, float b, float c, float d) { sv_static = (vector float) { a, b, c, d }; } void pack_global (float a, float b, float c, float d) { sv_global = (vector float) { a, b, c, d }; } vector float splat_reg (float a) { return (vector float) { a, a, a, a }; } vector float splat_from_ptr (float *p) { return (vector float) { *p, *p, *p, *p }; } vector float splat_const (void) { return (vector float) { SPLAT, SPLAT, SPLAT, SPLAT }; } void splat_ptr (vector float *p, float a) { *p = (vector float) { a, a, a, a }; } void splat_static (float a) { sp_static = (vector float) { a, a, a, a }; } void splat_global (float a) { sp_global = (vector float) { a, a, a, a }; } int main (void) { vector float sv2, sv3; float mem = SPLAT; float mem2[4] = { ELEMENTS }; check (sv); check (pack_reg (ELEMENTS)); check (pack_from_ptr (&mem2[0], &mem2[1], &mem2[2], &mem2[3])); check (pack_const ()); pack_ptr (&sv2, ELEMENTS); check (sv2); pack_static (ELEMENTS); check (sv_static); pack_global (ELEMENTS); check (sv_global); check_splat (splat); check_splat (splat_reg (SPLAT)); check_splat (splat_from_ptr (&mem)); check_splat (splat_const ()); splat_ptr (&sv2, SPLAT); check_splat (sv2); splat_static (SPLAT); check_splat (sp_static); splat_global (SPLAT); check_splat (sp_global); return 0; }