| /* { dg-do run } */ |
| /* { dg-require-effective-target vsx_hw } */ |
| /* { dg-options "-O2 -mvsx" } */ |
| |
| #include <stdlib.h> |
| #include <stddef.h> |
| #include <altivec.h> |
| |
| #define ELEMENTS 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 127, -1, -128 |
| #define SPLAT 0x12 |
| |
| vector signed char sv = (vector signed char) { ELEMENTS }; |
| vector signed char splat = (vector signed char) { SPLAT, SPLAT, SPLAT, SPLAT, |
| SPLAT, SPLAT, SPLAT, SPLAT, |
| SPLAT, SPLAT, SPLAT, SPLAT, |
| SPLAT, SPLAT, SPLAT, SPLAT }; |
| vector signed char sv_global, sp_global; |
| static vector signed char sv_static, sp_static; |
| static signed char expected[] = { ELEMENTS }; |
| static signed char splat_expected = SPLAT; |
| |
| extern void check (vector signed char a) |
| __attribute__((__noinline__)); |
| |
| extern void check_splat (vector signed char a) |
| __attribute__((__noinline__)); |
| |
| extern vector signed char pack_reg (signed char a, signed char b, |
| signed char c, signed char d, |
| signed char e, signed char f, |
| signed char g, signed char h, |
| signed char i, signed char j, |
| signed char k, signed char l, |
| signed char m, signed char n, |
| signed char o, signed char p) |
| __attribute__((__noinline__)); |
| |
| extern vector signed char pack_from_ptr (signed char *p_a, signed char *p_b, |
| signed char *p_c, signed char *p_d, |
| signed char *p_e, signed char *p_f, |
| signed char *p_g, signed char *p_h, |
| signed char *p_i, signed char *p_j, |
| signed char *p_k, signed char *p_l, |
| signed char *p_m, signed char *p_n, |
| signed char *p_o, signed char *p_p) |
| __attribute__((__noinline__)); |
| |
| extern vector signed char pack_const (void) |
| __attribute__((__noinline__)); |
| |
| extern void pack_ptr (vector signed char *q, |
| signed char a, signed char b, signed char c, signed char d, |
| signed char e, signed char f, signed char g, signed char h, |
| signed char i, signed char j, signed char k, signed char l, |
| signed char m, signed char n, signed char o, signed char p) |
| __attribute__((__noinline__)); |
| |
| extern void pack_static (signed char a, signed char b, signed char c, signed char d, |
| signed char e, signed char f, signed char g, signed char h, |
| signed char i, signed char j, signed char k, signed char l, |
| signed char m, signed char n, signed char o, signed char p) |
| __attribute__((__noinline__)); |
| |
| extern void pack_global (signed char a, signed char b, signed char c, signed char d, |
| signed char e, signed char f, signed char g, signed char h, |
| signed char i, signed char j, signed char k, signed char l, |
| signed char m, signed char n, signed char o, signed char p) |
| __attribute__((__noinline__)); |
| |
| extern vector signed char splat_reg (signed char a) |
| __attribute__((__noinline__)); |
| |
| extern vector signed char splat_from_ptr (signed char *p_a) |
| __attribute__((__noinline__)); |
| |
| extern vector signed char splat_const (void) |
| __attribute__((__noinline__)); |
| |
| extern void splat_ptr (vector signed char *p, signed char a) |
| __attribute__((__noinline__)); |
| |
| extern void splat_static (signed char a) |
| __attribute__((__noinline__)); |
| |
| extern void splat_global (signed char a) |
| __attribute__((__noinline__)); |
| |
| void |
| check (vector signed char a) |
| { |
| size_t i; |
| |
| for (i = 0; i < 16; i++) |
| if (vec_extract (a, i) != expected[i]) |
| abort (); |
| } |
| |
| void |
| check_splat (vector signed char a) |
| { |
| size_t i; |
| |
| for (i = 0; i < 16; i++) |
| if (vec_extract (a, i) != SPLAT) |
| abort (); |
| } |
| |
| vector signed char |
| pack_reg (signed char a, signed char b, signed char c, signed char d, |
| signed char e, signed char f, signed char g, signed char h, |
| signed char i, signed char j, signed char k, signed char l, |
| signed char m, signed char n, signed char o, signed char p) |
| { |
| return (vector signed char) { a, b, c, d, e, f, g, h, |
| i, j, k, l, m, n, o, p }; |
| } |
| |
| vector signed char |
| pack_from_ptr (signed char *p_a, signed char *p_b, signed char *p_c, signed char *p_d, |
| signed char *p_e, signed char *p_f, signed char *p_g, signed char *p_h, |
| signed char *p_i, signed char *p_j, signed char *p_k, signed char *p_l, |
| signed char *p_m, signed char *p_n, signed char *p_o, signed char *p_p) |
| { |
| return (vector signed char) { *p_a, *p_b, *p_c, *p_d, |
| *p_e, *p_f, *p_g, *p_h, |
| *p_i, *p_j, *p_k, *p_l, |
| *p_m, *p_n, *p_o, *p_p }; |
| |
| } |
| |
| vector signed char |
| pack_const (void) |
| { |
| return (vector signed char) { ELEMENTS }; |
| } |
| |
| void |
| pack_ptr (vector signed char *q, |
| signed char a, signed char b, signed char c, signed char d, |
| signed char e, signed char f, signed char g, signed char h, |
| signed char i, signed char j, signed char k, signed char l, |
| signed char m, signed char n, signed char o, signed char p) |
| { |
| *q = (vector signed char) { a, b, c, d, e, f, g, h, |
| i, j, k, l, m, n, o, p }; |
| } |
| |
| void |
| pack_static (signed char a, signed char b, signed char c, signed char d, |
| signed char e, signed char f, signed char g, signed char h, |
| signed char i, signed char j, signed char k, signed char l, |
| signed char m, signed char n, signed char o, signed char p) |
| { |
| sv_static = (vector signed char) { a, b, c, d, e, f, g, h, |
| i, j, k, l, m, n, o, p }; |
| } |
| |
| void |
| pack_global (signed char a, signed char b, signed char c, signed char d, |
| signed char e, signed char f, signed char g, signed char h, |
| signed char i, signed char j, signed char k, signed char l, |
| signed char m, signed char n, signed char o, signed char p) |
| { |
| sv_global = (vector signed char) { a, b, c, d, e, f, g, h, |
| i, j, k, l, m, n, o, p }; |
| } |
| |
| vector signed char |
| splat_reg (signed char a) |
| { |
| return (vector signed char) { a, a, a, a, a, a, a, a, |
| a, a, a, a, a, a, a, a }; |
| } |
| |
| vector signed char |
| splat_from_ptr (signed char *p_a) |
| { |
| return (vector signed char) { *p_a, *p_a, *p_a, *p_a, |
| *p_a, *p_a, *p_a, *p_a, |
| *p_a, *p_a, *p_a, *p_a, |
| *p_a, *p_a, *p_a, *p_a }; |
| } |
| |
| vector signed char |
| splat_const (void) |
| { |
| return (vector signed char) { SPLAT, SPLAT, SPLAT, SPLAT, |
| SPLAT, SPLAT, SPLAT, SPLAT, |
| SPLAT, SPLAT, SPLAT, SPLAT, |
| SPLAT, SPLAT, SPLAT, SPLAT }; |
| } |
| |
| void |
| splat_ptr (vector signed char *p, signed char a) |
| { |
| *p = (vector signed char) { a, a, a, a, a, a, a, a, |
| a, a, a, a, a, a, a, a }; |
| } |
| |
| void |
| splat_static (signed char a) |
| { |
| sp_static = (vector signed char) { a, a, a, a, a, a, a, a, |
| a, a, a, a, a, a, a, a }; |
| } |
| |
| void |
| splat_global (signed char a) |
| { |
| sp_global = (vector signed char) { a, a, a, a, a, a, a, a, |
| a, a, a, a, a, a, a, a }; |
| } |
| |
| int main (void) |
| { |
| vector signed char 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], &expected[8], |
| &expected[9], &expected[10], &expected[11], |
| &expected[12], &expected[13], &expected[14], |
| &expected[15])); |
| |
| 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; |
| } |