259 lines
7.2 KiB
C
259 lines
7.2 KiB
C
|
/* { 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;
|
||
|
}
|