Viewing file: vec_permi.c (1.84 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { dg-do compile } */ /* { dg-options "-O3 -mzarch -march=z13 -mzvector --save-temps" } */ /* { dg-do run { target { s390_z13_hw } } } */
/* * The vector intrinsic vec_permi(a, b, c) chooses one of the two eight-byte * vector elements in each of a and b, depending on the value of c. The valid * values for c differ from the encoding for the M4 field in assembly and in the * binary instruction. * * selection | c | encoding in assembly * a[0] b[0] | 0 | 0 -> vmrhg * a[0] b[1] | 1 | 1 * a[1] b[0] | 2 | 4 * a[1] b[1] | 3 | 5 -> vmrlg * * (i.e., indices a[i] b[j] are encoded for c as (i<<1) | j, yet for the * M4 field as (i<<2) | j. */
/* { 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_permi (a, b, (BITS)); }
#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); }
|