1 /* { dg-do compile { target { powerpc64le-*-* } } } */
2 /* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
3 /* { dg-options "-mcpu=power8 -O3 " } */
4 /* { dg-final { scan-assembler-times "lxvd2x" 2 } } */
5 /* { dg-final { scan-assembler-times "stxvd2x" 1 } } */
6 /* { dg-final { scan-assembler-times "xxpermdi" 3 } } */
8 /* Verify that swap optimization works correctly for a VSX direct splat.
9 The three xxpermdi's that are generated correspond to two splats
10 and the __builtin_vsx_xxpermdi. */
12 int printf (const char *__restrict __format
, ...);
13 typedef double __m128d
__attribute__ ((__vector_size__ (16), __may_alias__
));
15 double s1
[] = {2134.3343, 6678.346};
16 double s2
[] = {41124.234, 6678.346};
17 long long dd
[] = {1, 2}, d
[2];
18 union{long long l
[2]; double d
[2];} e
;
23 __m128d source1
, source2
, dest
;
27 e
.l
[0] = !__builtin_isunordered(s1
[0], s2
[0])
28 && s1
[0] == s2
[0] ? -1 : 0;
29 source1
= __builtin_vec_vsx_ld (0, s1
);
30 source2
= __builtin_vec_vsx_ld (0, s2
);
31 a
= __builtin_vec_splat (source1
, 0);
32 b
= __builtin_vec_splat (source2
, 0);
33 c
= (__m128d
)__builtin_vec_cmpeq (a
, b
);
34 dest
= __builtin_vsx_xxpermdi (source1
, c
, 1);