blob: a135279b1d7f4e9fa516f21aba039683ac364140 [file] [log] [blame]
/* { dg-do run { target { power10_hw } } } */
/* { dg-do link { target { ! power10_hw } } } */
/* { dg-require-effective-target power10_ok } */
/* { dg-options "-mdejagnu-cpu=power10 -save-temps -O2" } */
#include <altivec.h>
#define DEBUG 0
#if DEBUG
#include <stdio.h>
#endif
extern void abort (void);
volatile vector double vresult_d_undefined;
int
main (int argc, char *argv [])
{
int i;
vector int vsrc_a_int;
vector int vresult_int;
vector int expected_vresult_int;
int src_a_int = 13;
vector unsigned int vsrc_a_uint;
vector unsigned int vresult_uint;
vector unsigned int expected_vresult_uint;
unsigned int src_a_uint = 7;
vector float vresult_f;
vector float expected_vresult_f;
vector float vsrc_a_f;
float src_a_f = 23.0;
vector double vsrc_a_d;
vector double vresult_d;
vector double expected_vresult_d;
/* Vector splati word */
vresult_int = (vector signed int) { 1, 2, 3, 4 };
expected_vresult_int = (vector signed int) { -13, -13, -13, -13 };
vresult_int = vec_splati ( -13 );
if (!vec_all_eq (vresult_int, expected_vresult_int)) {
#if DEBUG
printf("ERROR, vec_splati (src_a_int)\n");
for(i = 0; i < 4; i++)
printf(" vresult_int[%d] = %d, expected_vresult_int[%d] = %d\n",
i, vresult_int[i], i, expected_vresult_int[i]);
#else
abort();
#endif
}
vresult_f = (vector float) { 1.0, 2.0, 3.0, 4.0 };
expected_vresult_f = (vector float) { 23.0, 23.0, 23.0, 23.0 };
vresult_f = vec_splati (23.0f);
if (!vec_all_eq (vresult_f, expected_vresult_f)) {
#if DEBUG
printf("ERROR, vec_splati (src_a_f)\n");
for(i = 0; i < 4; i++)
printf(" vresult_f[%d] = %f, expected_vresult_f[%d] = %f\n",
i, vresult_f[i], i, expected_vresult_f[i]);
#else
abort();
#endif
}
/* Vector splati double */
vresult_d = (vector double) { 2.0, 3.0 };
expected_vresult_d = (vector double) { -31.0, -31.0 };
vresult_d = vec_splatid (-31.0f);
if (!vec_all_eq (vresult_d, expected_vresult_d)) {
#if DEBUG
printf("ERROR, vec_splati (-31.0f)\n");
for(i = 0; i < 2; i++)
printf(" vresult_d[%i] = %f, expected_vresult_d[%i] = %f\n",
i, vresult_d[i], i, expected_vresult_d[i]);
#else
abort();
#endif
}
/* This test will generate a "note" to the user that the argument is
subnormal. It is not an error, but results are not defined. Because this
is undefined, we cannot check that any value is correct. Just store it in
a volatile variable so the XXSPLTIDP instruction gets generated and the
warning message printed. */
vresult_d_undefined = vec_splatid (6.6E-42f);
/* Vector splat immediate */
vsrc_a_int = (vector int) { 2, 3, 4, 5 };
vresult_int = (vector int) { 1, 1, 1, 1 };
expected_vresult_int = (vector int) { 2, 20, 4, 20 };
vresult_int = vec_splati_ins (vsrc_a_int, 1, 20);
if (!vec_all_eq (vresult_int, expected_vresult_int)) {
#if DEBUG
printf("ERROR, vec_splati_ins (vsrc_a_int, 1, 20)\n");
for(i = 0; i < 4; i++)
printf(" vresult_int[%i] = %d, expected_vresult_int[%i] = %d\n",
i, vresult_int[i], i, expected_vresult_int[i]);
#else
abort();
#endif
}
vsrc_a_uint = (vector unsigned int) { 4, 5, 6, 7 };
vresult_uint = (vector unsigned int) { 1, 1, 1, 1 };
expected_vresult_uint = (vector unsigned int) { 4, 40, 6, 40 };
vresult_uint = vec_splati_ins (vsrc_a_uint, 1, 40);
if (!vec_all_eq (vresult_uint, expected_vresult_uint)) {
#if DEBUG
printf("ERROR, vec_splati_ins (vsrc_a_uint, 1, 40)\n");
for(i = 0; i < 4; i++)
printf(" vresult_uint[%i] = %d, expected_vresult_uint[%i] = %d\n",
i, vresult_uint[i], i, expected_vresult_uint[i]);
#else
abort();
#endif
}
vsrc_a_f = (vector float) { 2.0, 3.0, 4.0, 5.0 };
vresult_f = (vector float) { 1.0, 1.0, 1.0, 1.0 };
expected_vresult_f = (vector float) { 2.0, 20.1, 4.0, 20.1 };
vresult_f = vec_splati_ins (vsrc_a_f, 1, 20.1f);
if (!vec_all_eq (vresult_f, expected_vresult_f)) {
#if DEBUG
printf("ERROR, vec_splati_ins (vsrc_a_f, 1, 20.1)\n");
for(i = 0; i < 4; i++)
printf(" vresult_f[%i] = %f, expected_vresult_f[%i] = %f\n",
i, vresult_f[i], i, expected_vresult_f[i]);
#else
abort();
#endif
}
return 0;
}
/* { dg-final { scan-assembler-times {\mxxspltiw\M} 2 } } */
/* { dg-final { scan-assembler-times {\mxxspltidp\M} 2 } } */
/* { dg-final { scan-assembler-times {\mxxsplti32dx\M} 3 } } */