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