[testsuite] require sqrt_insn effective target where needed
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / sse4_1-pblendw-2.c
blob20a6650d898d0e4016d3c16358ba10adc5b1644a
1 /* { dg-do run } */
2 /* { dg-options "-O2 -mvsx -Wno-psabi" } */
3 /* { dg-additional-options "-mdejagnu-cpu=power8" { target { ! has_arch_pwr8 } } } */
4 /* { dg-require-effective-target p8vector_hw } */
6 #define NO_WARN_X86_INTRINSICS 1
7 #include "sse4_1-check.h"
9 #include <smmintrin.h>
10 #include <string.h>
12 #define NUM 20
14 #undef MASK
15 #define MASK 0xfe
17 static void
18 init_pblendw (short *src1, short *src2)
20 int i, sign = 1;
22 for (i = 0; i < NUM * 8; i++)
24 src1[i] = i * i * sign;
25 src2[i] = (i + 20) * sign;
26 sign = -sign;
30 static int
31 check_pblendw (__m128i *dst, short *src1, short *src2)
33 short tmp[8];
34 int j;
36 memcpy (&tmp[0], src1, sizeof (tmp));
37 for (j = 0; j < 8; j++)
38 if ((MASK & (1 << j)))
39 tmp[j] = src2[j];
41 return memcmp (dst, &tmp[0], sizeof (tmp));
44 static void
45 sse4_1_test (void)
47 __m128i x, y;
48 union
50 __m128i x[NUM];
51 short s[NUM * 8];
52 } dst, src1, src2;
53 union
55 __m128i x;
56 short s[8];
57 } src3;
58 int i;
60 init_pblendw (src1.s, src2.s);
62 /* Check pblendw imm8, m128, xmm */
63 for (i = 0; i < NUM; i++)
65 dst.x[i] = _mm_blend_epi16 (src1.x[i], src2.x[i], MASK);
66 if (check_pblendw (&dst.x[i], &src1.s[i * 8], &src2.s[i * 8]))
67 abort ();
70 /* Check pblendw imm8, xmm, xmm */
71 src3.x = _mm_setzero_si128 ();
73 x = _mm_blend_epi16 (dst.x[2], src3.x, MASK);
74 y = _mm_blend_epi16 (src3.x, dst.x[2], MASK);
76 if (check_pblendw (&x, &dst.s[16], &src3.s[0]))
77 abort ();
79 if (check_pblendw (&y, &src3.s[0], &dst.s[16]))
80 abort ();