xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/xop-pcmov.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s
4
5define <4 x double> @pcmov_4f64(<4 x double> %a, <4 x double> %b, <4 x double> %m) {
6; CHECK-LABEL: pcmov_4f64:
7; CHECK:       # BB#0:
8; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
9; CHECK-NEXT:    retq
10  %1 = bitcast <4 x double> %m to <4 x i64>
11  %2 = bitcast <4 x double> %a to <4 x i64>
12  %3 = and <4 x i64> %1, %2
13  %4 = xor <4 x i64> %1, <i64 -1, i64 -1, i64 -1, i64 -1>
14  %5 = bitcast <4 x double> %b to <4 x i64>
15  %6 = and <4 x i64> %4, %5
16  %7 = or <4 x i64> %3, %6
17  %8 = bitcast <4 x i64> %7 to <4 x double>
18  ret <4 x double> %8
19}
20
21define <2 x double> @pcmov_2f64(<2 x double> %a, <2 x double> %b, <2 x double> %m) {
22; CHECK-LABEL: pcmov_2f64:
23; CHECK:       # BB#0:
24; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
25; CHECK-NEXT:    retq
26  %1 = bitcast <2 x double> %m to <2 x i64>
27  %2 = bitcast <2 x double> %a to <2 x i64>
28  %3 = and <2 x i64> %1, %2
29  %4 = xor <2 x i64> %1, <i64 -1, i64 -1>
30  %5 = bitcast <2 x double> %b to <2 x i64>
31  %6 = and <2 x i64> %4, %5
32  %7 = or <2 x i64> %3, %6
33  %8 = bitcast <2 x i64> %7 to <2 x double>
34  ret <2 x double> %8
35}
36
37define <8 x float> @pcmov_8f32(<8 x float> %a, <8 x float> %b, <8 x float> %m) {
38; CHECK-LABEL: pcmov_8f32:
39; CHECK:       # BB#0:
40; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
41; CHECK-NEXT:    retq
42  %1 = bitcast <8 x float> %m to <8 x i32>
43  %2 = bitcast <8 x float> %a to <8 x i32>
44  %3 = and <8 x i32> %1, %2
45  %4 = xor <8 x i32> %1, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
46  %5 = bitcast <8 x float> %b to <8 x i32>
47  %6 = and <8 x i32> %4, %5
48  %7 = or <8 x i32> %3, %6
49  %8 = bitcast <8 x i32> %7 to <8 x float>
50  ret <8 x float> %8
51}
52
53define <4 x float> @pcmov_4f32(<4 x float> %a, <4 x float> %b, <4 x float> %m) {
54; CHECK-LABEL: pcmov_4f32:
55; CHECK:       # BB#0:
56; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
57; CHECK-NEXT:    retq
58  %1 = bitcast <4 x float> %m to <4 x i32>
59  %2 = bitcast <4 x float> %a to <4 x i32>
60  %3 = and <4 x i32> %1, %2
61  %4 = xor <4 x i32> %1, <i32 -1, i32 -1, i32 -1, i32 -1>
62  %5 = bitcast <4 x float> %b to <4 x i32>
63  %6 = and <4 x i32> %4, %5
64  %7 = or <4 x i32> %3, %6
65  %8 = bitcast <4 x i32> %7 to <4 x float>
66  ret <4 x float> %8
67}
68
69define <4 x i64> @pcmov_4i64(<4 x i64> %a, <4 x i64> %b, <4 x i64> %m) {
70; CHECK-LABEL: pcmov_4i64:
71; CHECK:       # BB#0:
72; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
73; CHECK-NEXT:    retq
74  %1 = and <4 x i64> %a, %m
75  %2 = xor <4 x i64> %m, <i64 -1, i64 -1, i64 -1, i64 -1>
76  %3 = and <4 x i64> %b, %2
77  %4 = or <4 x i64> %1, %3
78  ret <4 x i64> %4
79}
80
81define <2 x i64> @pcmov_2i64(<2 x i64> %a, <2 x i64> %b, <2 x i64> %m) {
82; CHECK-LABEL: pcmov_2i64:
83; CHECK:       # BB#0:
84; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
85; CHECK-NEXT:    retq
86  %1 = and <2 x i64> %a, %m
87  %2 = xor <2 x i64> %m, <i64 -1, i64 -1>
88  %3 = and <2 x i64> %b, %2
89  %4 = or <2 x i64> %1, %3
90  ret <2 x i64> %4
91}
92
93define <8 x i32> @pcmov_8i32(<8 x i32> %a, <8 x i32> %b, <8 x i32> %m) {
94; CHECK-LABEL: pcmov_8i32:
95; CHECK:       # BB#0:
96; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
97; CHECK-NEXT:    retq
98  %1 = and <8 x i32> %a, %m
99  %2 = xor <8 x i32> %m, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
100  %3 = and <8 x i32> %b, %2
101  %4 = or <8 x i32> %1, %3
102  ret <8 x i32> %4
103}
104
105define <4 x i32> @pcmov_4i32(<4 x i32> %a, <4 x i32> %b, <4 x i32> %m) {
106; CHECK-LABEL: pcmov_4i32:
107; CHECK:       # BB#0:
108; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
109; CHECK-NEXT:    retq
110  %1 = and <4 x i32> %a, %m
111  %2 = xor <4 x i32> %m, <i32 -1, i32 -1, i32 -1, i32 -1>
112  %3 = and <4 x i32> %b, %2
113  %4 = or <4 x i32> %1, %3
114  ret <4 x i32> %4
115}
116
117define <16 x i16> @pcmov_16i16(<16 x i16> %a, <16 x i16> %b, <16 x i16> %m) {
118; CHECK-LABEL: pcmov_16i16:
119; CHECK:       # BB#0:
120; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
121; CHECK-NEXT:    retq
122  %1 = and <16 x i16> %a, %m
123  %2 = xor <16 x i16> %m, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
124  %3 = and <16 x i16> %b, %2
125  %4 = or <16 x i16> %1, %3
126  ret <16 x i16> %4
127}
128
129define <8 x i16> @pcmov_8i16(<8 x i16> %a, <8 x i16> %b, <8 x i16> %m) {
130; CHECK-LABEL: pcmov_8i16:
131; CHECK:       # BB#0:
132; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
133; CHECK-NEXT:    retq
134  %1 = and <8 x i16> %a, %m
135  %2 = xor <8 x i16> %m, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
136  %3 = and <8 x i16> %b, %2
137  %4 = or <8 x i16> %1, %3
138  ret <8 x i16> %4
139}
140
141define <32 x i8> @pcmov_32i8(<32 x i8> %a, <32 x i8> %b, <32 x i8> %m) {
142; CHECK-LABEL: pcmov_32i8:
143; CHECK:       # BB#0:
144; CHECK-NEXT:    vpcmov %ymm2, %ymm1, %ymm0, %ymm0
145; CHECK-NEXT:    retq
146  %1 = and <32 x i8> %a, %m
147  %2 = xor <32 x i8> %m, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
148  %3 = and <32 x i8> %b, %2
149  %4 = or <32 x i8> %1, %3
150  ret <32 x i8> %4
151}
152
153define <16 x i8> @pcmov_16i8(<16 x i8> %a, <16 x i8> %b, <16 x i8> %m) {
154; CHECK-LABEL: pcmov_16i8:
155; CHECK:       # BB#0:
156; CHECK-NEXT:    vpcmov %xmm2, %xmm1, %xmm0, %xmm0
157; CHECK-NEXT:    retq
158  %1 = and <16 x i8> %a, %m
159  %2 = xor <16 x i8> %m, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
160  %3 = and <16 x i8> %b, %2
161  %4 = or <16 x i8> %1, %3
162  ret <16 x i8> %4
163}
164