/* { dg-do run } */ /* { dg-require-effective-target vsx_hw } */ /* { dg-options "-O2 -mvsx" } */ #include #include #include #define ELEMENTS -1, 2, 0, -32768, 32767, 53, 1, 16000 #define SPLAT 0x0123 vector short sv = (vector short) { ELEMENTS }; vector short splat = (vector short) { SPLAT, SPLAT, SPLAT, SPLAT, SPLAT, SPLAT, SPLAT, SPLAT }; vector short sv_global, sp_global; static vector short sv_static, sp_static; static short expected[] = { ELEMENTS }; static short splat_expected = SPLAT; extern void check (vector short a) __attribute__((__noinline__)); extern void check_splat (vector short a) __attribute__((__noinline__)); extern vector short pack_reg (short a, short b, short c, short d, short e, short f, short g, short h) __attribute__((__noinline__)); extern vector short pack_from_ptr (short *p_a, short *p_b, short *p_c, short *p_d, short *p_e, short *p_f, short *p_g, short *p_h) __attribute__((__noinline__)); extern vector short pack_const (void) __attribute__((__noinline__)); extern void pack_ptr (vector short *p, short a, short b, short c, short d, short e, short f, short g, short h) __attribute__((__noinline__)); extern void pack_static (short a, short b, short c, short d, short e, short f, short g, short h) __attribute__((__noinline__)); extern void pack_global (short a, short b, short c, short d, short e, short f, short g, short h) __attribute__((__noinline__)); extern vector short splat_reg (short a) __attribute__((__noinline__)); extern vector short splat_from_ptr (short *p_a) __attribute__((__noinline__)); extern vector short splat_const (void) __attribute__((__noinline__)); extern void splat_ptr (vector short *p, short a) __attribute__((__noinline__)); extern void splat_static (short a) __attribute__((__noinline__)); extern void splat_global (short a) __attribute__((__noinline__)); void check (vector short a) { size_t i; for (i = 0; i < 8; i++) if (vec_extract (a, i) != expected[i]) abort (); } void check_splat (vector short a) { size_t i; for (i = 0; i < 8; i++) if (vec_extract (a, i) != SPLAT) abort (); } vector short pack_reg (short a, short b, short c, short d, short e, short f, short g, short h) { return (vector short) { a, b, c, d, e, f, g, h }; } vector short pack_from_ptr (short *p_a, short *p_b, short *p_c, short *p_d, short *p_e, short *p_f, short *p_g, short *p_h) { return (vector short) { *p_a, *p_b, *p_c, *p_d, *p_e, *p_f, *p_g, *p_h }; } vector short pack_const (void) { return (vector short) { ELEMENTS }; } void pack_ptr (vector short *p, short a, short b, short c, short d, short e, short f, short g, short h) { *p = (vector short) { a, b, c, d, e, f, g, h }; } void pack_static (short a, short b, short c, short d, short e, short f, short g, short h) { sv_static = (vector short) { a, b, c, d, e, f, g, h }; } void pack_global (short a, short b, short c, short d, short e, short f, short g, short h) { sv_global = (vector short) { a, b, c, d, e, f, g, h }; } vector short splat_reg (short a) { return (vector short) { a, a, a, a, a, a, a, a }; } vector short splat_from_ptr (short *p_a) { return (vector short) { *p_a, *p_a, *p_a, *p_a, *p_a, *p_a, *p_a, *p_a }; } vector short splat_const (void) { return (vector short) { SPLAT, SPLAT, SPLAT, SPLAT, SPLAT, SPLAT, SPLAT, SPLAT }; } void splat_ptr (vector short *p, short a) { *p = (vector short) { a, a, a, a, a, a, a, a }; } void splat_static (short a) { sp_static = (vector short) { a, a, a, a, a, a, a, a }; } void splat_global (short a) { sp_global = (vector short) { a, a, a, a, a, a, a, a }; } int main (void) { vector short sv2, sv3; check (sv); check (pack_reg (ELEMENTS)); check (pack_from_ptr (&expected[0], &expected[1], &expected[2], &expected[3], &expected[4], &expected[5], &expected[6], &expected[7])); 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 (&splat_expected)); 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; }