blob: fdcad019b9697c296947d9d35f6b88420d3b2900 [file] [log] [blame]
/* { dg-do run { target { *-*-linux* && { lp64 && p9vector_hw } } } } */
/* { dg-require-effective-target powerpc_p9vector_ok } */
/* { dg-options "-O2 -mdejagnu-cpu=power9 -save-temps" } */
/* These builtins were not defined until ISA 3.1 but only require ISA 3.0
support. */
/* { dg-final { scan-assembler-times {\mvextsb2w\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvextsb2d\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvextsh2w\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvextsh2d\M} 1 } } */
/* { dg-final { scan-assembler-times {\mvextsw2d\M} 1 } } */
#include <altivec.h>
#define DEBUG 0
#if DEBUG
#include <stdio.h>
#include <stdlib.h>
#endif
void abort (void);
int main ()
{
int i;
vector signed char vec_arg_qi, vec_result_qi;
vector signed short int vec_arg_hi, vec_result_hi, vec_expected_hi;
vector signed int vec_arg_wi, vec_result_wi, vec_expected_wi;
vector signed long long vec_result_di, vec_expected_di;
/* test sign extend byte to word */
vec_arg_qi = (vector signed char) {1, 2, 3, 4, 5, 6, 7, 8,
-1, -2, -3, -4, -5, -6, -7, -8};
vec_expected_wi = (vector signed int) {1, 5, -1, -5};
vec_result_wi = vec_signexti (vec_arg_qi);
for (i = 0; i < 4; i++)
if (vec_result_wi[i] != vec_expected_wi[i]) {
#if DEBUG
printf("ERROR: vec_signexti(char, int): ");
printf("vec_result_wi[%d] != vec_expected_wi[%d]\n",
i, i);
printf("vec_result_wi[%d] = %d\n", i, vec_result_wi[i]);
printf("vec_expected_wi[%d] = %d\n", i, vec_expected_wi[i]);
#else
abort();
#endif
}
/* test sign extend byte to double */
vec_arg_qi = (vector signed char){1, 2, 3, 4, 5, 6, 7, 8,
-1, -2, -3, -4, -5, -6, -7, -8};
vec_expected_di = (vector signed long long int){1, -1};
vec_result_di = vec_signextll(vec_arg_qi);
for (i = 0; i < 2; i++)
if (vec_result_di[i] != vec_expected_di[i]) {
#if DEBUG
printf("ERROR: vec_signextll(byte, long long int): ");
printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
#else
abort();
#endif
}
/* test sign extend short to word */
vec_arg_hi = (vector signed short int){1, 2, 3, 4, -1, -2, -3, -4};
vec_expected_wi = (vector signed int){1, 3, -1, -3};
vec_result_wi = vec_signexti(vec_arg_hi);
for (i = 0; i < 4; i++)
if (vec_result_wi[i] != vec_expected_wi[i]) {
#if DEBUG
printf("ERROR: vec_signexti(short, int): ");
printf("vec_result_wi[%d] != vec_expected_wi[%d]\n", i, i);
printf("vec_result_wi[%d] = %d\n", i, vec_result_wi[i]);
printf("vec_expected_wi[%d] = %d\n", i, vec_expected_wi[i]);
#else
abort();
#endif
}
/* test sign extend short to double word */
vec_arg_hi = (vector signed short int ){1, 3, 5, 7, -1, -3, -5, -7};
vec_expected_di = (vector signed long long int){1, -1};
vec_result_di = vec_signextll(vec_arg_hi);
for (i = 0; i < 2; i++)
if (vec_result_di[i] != vec_expected_di[i]) {
#if DEBUG
printf("ERROR: vec_signextll(short, double): ");
printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
#else
abort();
#endif
}
/* test sign extend word to double word */
vec_arg_wi = (vector signed int ){1, 3, -1, -3};
vec_expected_di = (vector signed long long int){1, -1};
vec_result_di = vec_signextll(vec_arg_wi);
for (i = 0; i < 2; i++)
if (vec_result_di[i] != vec_expected_di[i]) {
#if DEBUG
printf("ERROR: vec_signextll(word, double): ");
printf("vec_result_di[%d] != vec_expected_di[%d]\n", i, i);
printf("vec_result_di[%d] = %lld\n", i, vec_result_di[i]);
printf("vec_expected_di[%d] = %lld\n", i, vec_expected_di[i]);
#else
abort();
#endif
}
return 0;
}