blob: cc925315b377bb85ea81d5e87c7279c1dc84ee01 [file] [log] [blame]
/* { dg-do run { target { s390*-*-* } } } */
/* { dg-options "-O3 -mzarch -march=z14 -mzvector --save-temps" } */
/* { dg-final { scan-assembler-times "\tvmrhg\t" 3 } } */
/* { dg-final { scan-assembler-times "\tvmrlg\t" 3 } } */
/* { dg-final { scan-assembler-times "\tvpdi\t" 6 } } */
#include "vec-types.h"
#include <vecintrin.h>
#define GEN_PERMI_BITS(VEC_TYPE, BITS) \
VEC_TYPE __attribute__((noinline)) \
permi_##BITS##_##VEC_TYPE(VEC_TYPE a, VEC_TYPE b) { \
return (VEC_TYPE){a[((BITS) & 2) >> 1], b[(BITS) & 1] }; }
#define GEN_PERMI(VEC_TYPE) \
GEN_PERMI_BITS(VEC_TYPE, 0); \
GEN_PERMI_BITS(VEC_TYPE, 1); \
GEN_PERMI_BITS(VEC_TYPE, 2); \
GEN_PERMI_BITS(VEC_TYPE, 3); \
GEN_PERMI(v2di)
GEN_PERMI(uv2di)
GEN_PERMI(v2df)
#define CHECK_PERMI_BITS(VEC_TYPE, BITS) \
VEC_TYPE r##BITS = permi_##BITS##_##VEC_TYPE (a, b); \
if (r##BITS[0] != ((BITS) & 2) >> 1 \
|| r##BITS[1] != ((BITS) & 1) + 2) \
__builtin_abort();
#define CHECK_PERMI(VEC_TYPE) \
{ \
VEC_TYPE a = GEN_SEQ_VEC (VEC_TYPE, 0); \
VEC_TYPE b = GEN_SEQ_VEC (VEC_TYPE, 2); \
CHECK_PERMI_BITS (VEC_TYPE, 0); \
CHECK_PERMI_BITS (VEC_TYPE, 1); \
CHECK_PERMI_BITS (VEC_TYPE, 2); \
CHECK_PERMI_BITS (VEC_TYPE, 3); \
}
int
main ()
{
CHECK_PERMI (v2di);
CHECK_PERMI (uv2di);
CHECK_PERMI (v2df);
}