xref: /llvm-project/llvm/test/CodeGen/LoongArch/select-const.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1e5489f72Sgonglingqin; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3*9d4f7f44Swanglei; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4e5489f72Sgonglingqin
5e5489f72Sgonglingqindefine signext i32 @select_const_int_one_away(i1 zeroext %a) nounwind {
6e5489f72Sgonglingqin; LA32-LABEL: select_const_int_one_away:
7e5489f72Sgonglingqin; LA32:       # %bb.0:
8e5489f72Sgonglingqin; LA32-NEXT:    ori $a1, $zero, 4
99d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $a1, $a0
10e5489f72Sgonglingqin; LA32-NEXT:    ret
11e5489f72Sgonglingqin;
12e5489f72Sgonglingqin; LA64-LABEL: select_const_int_one_away:
13e5489f72Sgonglingqin; LA64:       # %bb.0:
14e5489f72Sgonglingqin; LA64-NEXT:    ori $a1, $zero, 4
159d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $a1, $a0
16e5489f72Sgonglingqin; LA64-NEXT:    ret
17e5489f72Sgonglingqin  %1 = select i1 %a, i32 3, i32 4
18e5489f72Sgonglingqin  ret i32 %1
19e5489f72Sgonglingqin}
20e5489f72Sgonglingqin
21e5489f72Sgonglingqindefine signext i32 @select_const_int_pow2_zero(i1 zeroext %a) nounwind {
22e5489f72Sgonglingqin; LA32-LABEL: select_const_int_pow2_zero:
23e5489f72Sgonglingqin; LA32:       # %bb.0:
249d8a7f78Sgonglingqin; LA32-NEXT:    slli.w $a0, $a0, 2
25e5489f72Sgonglingqin; LA32-NEXT:    ret
26e5489f72Sgonglingqin;
27e5489f72Sgonglingqin; LA64-LABEL: select_const_int_pow2_zero:
28e5489f72Sgonglingqin; LA64:       # %bb.0:
299d8a7f78Sgonglingqin; LA64-NEXT:    slli.d $a0, $a0, 2
30e5489f72Sgonglingqin; LA64-NEXT:    ret
31e5489f72Sgonglingqin  %1 = select i1 %a, i32 4, i32 0
32e5489f72Sgonglingqin  ret i32 %1
33e5489f72Sgonglingqin}
34e5489f72Sgonglingqin
35e5489f72Sgonglingqindefine signext i32 @select_eq_zero_negone(i32 signext %a, i32 signext %b) nounwind {
36e5489f72Sgonglingqin; LA32-LABEL: select_eq_zero_negone:
37e5489f72Sgonglingqin; LA32:       # %bb.0:
38e5489f72Sgonglingqin; LA32-NEXT:    xor $a0, $a0, $a1
39e5489f72Sgonglingqin; LA32-NEXT:    sltui $a0, $a0, 1
409d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
41e5489f72Sgonglingqin; LA32-NEXT:    ret
42e5489f72Sgonglingqin;
43e5489f72Sgonglingqin; LA64-LABEL: select_eq_zero_negone:
44e5489f72Sgonglingqin; LA64:       # %bb.0:
45e5489f72Sgonglingqin; LA64-NEXT:    xor $a0, $a0, $a1
46e5489f72Sgonglingqin; LA64-NEXT:    sltui $a0, $a0, 1
479d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
48e5489f72Sgonglingqin; LA64-NEXT:    ret
49e5489f72Sgonglingqin  %1 = icmp eq i32 %a, %b
50e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
51e5489f72Sgonglingqin  ret i32 %2
52e5489f72Sgonglingqin}
53e5489f72Sgonglingqin
54e5489f72Sgonglingqindefine signext i32 @select_ne_zero_negone(i32 signext %a, i32 signext %b) nounwind {
55e5489f72Sgonglingqin; LA32-LABEL: select_ne_zero_negone:
56e5489f72Sgonglingqin; LA32:       # %bb.0:
57e5489f72Sgonglingqin; LA32-NEXT:    xor $a0, $a0, $a1
58e5489f72Sgonglingqin; LA32-NEXT:    sltu $a0, $zero, $a0
599d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
60e5489f72Sgonglingqin; LA32-NEXT:    ret
61e5489f72Sgonglingqin;
62e5489f72Sgonglingqin; LA64-LABEL: select_ne_zero_negone:
63e5489f72Sgonglingqin; LA64:       # %bb.0:
64e5489f72Sgonglingqin; LA64-NEXT:    xor $a0, $a0, $a1
65e5489f72Sgonglingqin; LA64-NEXT:    sltu $a0, $zero, $a0
669d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
67e5489f72Sgonglingqin; LA64-NEXT:    ret
68e5489f72Sgonglingqin  %1 = icmp ne i32 %a, %b
69e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
70e5489f72Sgonglingqin  ret i32 %2
71e5489f72Sgonglingqin}
72e5489f72Sgonglingqin
73e5489f72Sgonglingqindefine signext i32 @select_sgt_zero_negone(i32 signext %a, i32 signext %b) nounwind {
74e5489f72Sgonglingqin; LA32-LABEL: select_sgt_zero_negone:
75e5489f72Sgonglingqin; LA32:       # %bb.0:
76e5489f72Sgonglingqin; LA32-NEXT:    slt $a0, $a1, $a0
779d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
78e5489f72Sgonglingqin; LA32-NEXT:    ret
79e5489f72Sgonglingqin;
80e5489f72Sgonglingqin; LA64-LABEL: select_sgt_zero_negone:
81e5489f72Sgonglingqin; LA64:       # %bb.0:
82e5489f72Sgonglingqin; LA64-NEXT:    slt $a0, $a1, $a0
839d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
84e5489f72Sgonglingqin; LA64-NEXT:    ret
85e5489f72Sgonglingqin  %1 = icmp sgt i32 %a, %b
86e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
87e5489f72Sgonglingqin  ret i32 %2
88e5489f72Sgonglingqin}
89e5489f72Sgonglingqin
90e5489f72Sgonglingqindefine signext i32 @select_slt_zero_negone(i32 signext %a, i32 signext %b) nounwind {
91e5489f72Sgonglingqin; LA32-LABEL: select_slt_zero_negone:
92e5489f72Sgonglingqin; LA32:       # %bb.0:
93e5489f72Sgonglingqin; LA32-NEXT:    slt $a0, $a0, $a1
949d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
95e5489f72Sgonglingqin; LA32-NEXT:    ret
96e5489f72Sgonglingqin;
97e5489f72Sgonglingqin; LA64-LABEL: select_slt_zero_negone:
98e5489f72Sgonglingqin; LA64:       # %bb.0:
99e5489f72Sgonglingqin; LA64-NEXT:    slt $a0, $a0, $a1
1009d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
101e5489f72Sgonglingqin; LA64-NEXT:    ret
102e5489f72Sgonglingqin  %1 = icmp slt i32 %a, %b
103e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
104e5489f72Sgonglingqin  ret i32 %2
105e5489f72Sgonglingqin}
106e5489f72Sgonglingqin
107e5489f72Sgonglingqindefine signext i32 @select_sge_zero_negone(i32 signext %a, i32 signext %b) nounwind {
108e5489f72Sgonglingqin; LA32-LABEL: select_sge_zero_negone:
109e5489f72Sgonglingqin; LA32:       # %bb.0:
110e5489f72Sgonglingqin; LA32-NEXT:    slt $a0, $a0, $a1
111e5489f72Sgonglingqin; LA32-NEXT:    xori $a0, $a0, 1
1129d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
113e5489f72Sgonglingqin; LA32-NEXT:    ret
114e5489f72Sgonglingqin;
115e5489f72Sgonglingqin; LA64-LABEL: select_sge_zero_negone:
116e5489f72Sgonglingqin; LA64:       # %bb.0:
117e5489f72Sgonglingqin; LA64-NEXT:    slt $a0, $a0, $a1
118e5489f72Sgonglingqin; LA64-NEXT:    xori $a0, $a0, 1
1199d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
120e5489f72Sgonglingqin; LA64-NEXT:    ret
121e5489f72Sgonglingqin  %1 = icmp sge i32 %a, %b
122e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
123e5489f72Sgonglingqin  ret i32 %2
124e5489f72Sgonglingqin}
125e5489f72Sgonglingqin
126e5489f72Sgonglingqindefine signext i32 @select_sle_zero_negone(i32 signext %a, i32 signext %b) nounwind {
127e5489f72Sgonglingqin; LA32-LABEL: select_sle_zero_negone:
128e5489f72Sgonglingqin; LA32:       # %bb.0:
129e5489f72Sgonglingqin; LA32-NEXT:    slt $a0, $a1, $a0
130e5489f72Sgonglingqin; LA32-NEXT:    xori $a0, $a0, 1
1319d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
132e5489f72Sgonglingqin; LA32-NEXT:    ret
133e5489f72Sgonglingqin;
134e5489f72Sgonglingqin; LA64-LABEL: select_sle_zero_negone:
135e5489f72Sgonglingqin; LA64:       # %bb.0:
136e5489f72Sgonglingqin; LA64-NEXT:    slt $a0, $a1, $a0
137e5489f72Sgonglingqin; LA64-NEXT:    xori $a0, $a0, 1
1389d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
139e5489f72Sgonglingqin; LA64-NEXT:    ret
140e5489f72Sgonglingqin  %1 = icmp sle i32 %a, %b
141e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
142e5489f72Sgonglingqin  ret i32 %2
143e5489f72Sgonglingqin}
144e5489f72Sgonglingqin
145e5489f72Sgonglingqindefine signext i32 @select_ugt_zero_negone(i32 signext %a, i32 signext %b) nounwind {
146e5489f72Sgonglingqin; LA32-LABEL: select_ugt_zero_negone:
147e5489f72Sgonglingqin; LA32:       # %bb.0:
148e5489f72Sgonglingqin; LA32-NEXT:    sltu $a0, $a1, $a0
1499d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
150e5489f72Sgonglingqin; LA32-NEXT:    ret
151e5489f72Sgonglingqin;
152e5489f72Sgonglingqin; LA64-LABEL: select_ugt_zero_negone:
153e5489f72Sgonglingqin; LA64:       # %bb.0:
154e5489f72Sgonglingqin; LA64-NEXT:    sltu $a0, $a1, $a0
1559d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
156e5489f72Sgonglingqin; LA64-NEXT:    ret
157e5489f72Sgonglingqin  %1 = icmp ugt i32 %a, %b
158e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
159e5489f72Sgonglingqin  ret i32 %2
160e5489f72Sgonglingqin}
161e5489f72Sgonglingqin
162e5489f72Sgonglingqindefine signext i32 @select_ult_zero_negone(i32 signext %a, i32 signext %b) nounwind {
163e5489f72Sgonglingqin; LA32-LABEL: select_ult_zero_negone:
164e5489f72Sgonglingqin; LA32:       # %bb.0:
165e5489f72Sgonglingqin; LA32-NEXT:    sltu $a0, $a0, $a1
1669d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
167e5489f72Sgonglingqin; LA32-NEXT:    ret
168e5489f72Sgonglingqin;
169e5489f72Sgonglingqin; LA64-LABEL: select_ult_zero_negone:
170e5489f72Sgonglingqin; LA64:       # %bb.0:
171e5489f72Sgonglingqin; LA64-NEXT:    sltu $a0, $a0, $a1
1729d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
173e5489f72Sgonglingqin; LA64-NEXT:    ret
174e5489f72Sgonglingqin  %1 = icmp ult i32 %a, %b
175e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
176e5489f72Sgonglingqin  ret i32 %2
177e5489f72Sgonglingqin}
178e5489f72Sgonglingqin
179e5489f72Sgonglingqindefine signext i32 @select_uge_zero_negone(i32 signext %a, i32 signext %b) nounwind {
180e5489f72Sgonglingqin; LA32-LABEL: select_uge_zero_negone:
181e5489f72Sgonglingqin; LA32:       # %bb.0:
182e5489f72Sgonglingqin; LA32-NEXT:    sltu $a0, $a0, $a1
183e5489f72Sgonglingqin; LA32-NEXT:    xori $a0, $a0, 1
1849d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
185e5489f72Sgonglingqin; LA32-NEXT:    ret
186e5489f72Sgonglingqin;
187e5489f72Sgonglingqin; LA64-LABEL: select_uge_zero_negone:
188e5489f72Sgonglingqin; LA64:       # %bb.0:
189e5489f72Sgonglingqin; LA64-NEXT:    sltu $a0, $a0, $a1
190e5489f72Sgonglingqin; LA64-NEXT:    xori $a0, $a0, 1
1919d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
192e5489f72Sgonglingqin; LA64-NEXT:    ret
193e5489f72Sgonglingqin  %1 = icmp uge i32 %a, %b
194e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
195e5489f72Sgonglingqin  ret i32 %2
196e5489f72Sgonglingqin}
197e5489f72Sgonglingqin
198e5489f72Sgonglingqindefine signext i32 @select_ule_zero_negone(i32 signext %a, i32 signext %b) nounwind {
199e5489f72Sgonglingqin; LA32-LABEL: select_ule_zero_negone:
200e5489f72Sgonglingqin; LA32:       # %bb.0:
201e5489f72Sgonglingqin; LA32-NEXT:    sltu $a0, $a1, $a0
202e5489f72Sgonglingqin; LA32-NEXT:    xori $a0, $a0, 1
2039d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $zero, $a0
204e5489f72Sgonglingqin; LA32-NEXT:    ret
205e5489f72Sgonglingqin;
206e5489f72Sgonglingqin; LA64-LABEL: select_ule_zero_negone:
207e5489f72Sgonglingqin; LA64:       # %bb.0:
208e5489f72Sgonglingqin; LA64-NEXT:    sltu $a0, $a1, $a0
209e5489f72Sgonglingqin; LA64-NEXT:    xori $a0, $a0, 1
2109d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $zero, $a0
211e5489f72Sgonglingqin; LA64-NEXT:    ret
212e5489f72Sgonglingqin  %1 = icmp ule i32 %a, %b
213e5489f72Sgonglingqin  %2 = select i1 %1, i32 -1, i32 0
214e5489f72Sgonglingqin  ret i32 %2
215e5489f72Sgonglingqin}
216e5489f72Sgonglingqin
217e5489f72Sgonglingqindefine i32 @select_eq_1_2(i32 signext %a, i32 signext %b) {
218e5489f72Sgonglingqin; LA32-LABEL: select_eq_1_2:
219e5489f72Sgonglingqin; LA32:       # %bb.0:
220e5489f72Sgonglingqin; LA32-NEXT:    xor $a0, $a0, $a1
221e5489f72Sgonglingqin; LA32-NEXT:    sltui $a0, $a0, 1
222e5489f72Sgonglingqin; LA32-NEXT:    ori $a1, $zero, 2
2239d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $a1, $a0
224e5489f72Sgonglingqin; LA32-NEXT:    ret
225e5489f72Sgonglingqin;
226e5489f72Sgonglingqin; LA64-LABEL: select_eq_1_2:
227e5489f72Sgonglingqin; LA64:       # %bb.0:
228e5489f72Sgonglingqin; LA64-NEXT:    xor $a0, $a0, $a1
229e5489f72Sgonglingqin; LA64-NEXT:    sltui $a0, $a0, 1
230e5489f72Sgonglingqin; LA64-NEXT:    ori $a1, $zero, 2
2319d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $a1, $a0
232e5489f72Sgonglingqin; LA64-NEXT:    ret
233e5489f72Sgonglingqin  %1 = icmp eq i32 %a, %b
234e5489f72Sgonglingqin  %2 = select i1 %1, i32 1, i32 2
235e5489f72Sgonglingqin  ret i32 %2
236e5489f72Sgonglingqin}
237e5489f72Sgonglingqin
238e5489f72Sgonglingqindefine i32 @select_ne_1_2(i32 signext %a, i32 signext %b) {
239e5489f72Sgonglingqin; LA32-LABEL: select_ne_1_2:
240e5489f72Sgonglingqin; LA32:       # %bb.0:
241e5489f72Sgonglingqin; LA32-NEXT:    xor $a0, $a0, $a1
242e5489f72Sgonglingqin; LA32-NEXT:    sltu $a0, $zero, $a0
243e5489f72Sgonglingqin; LA32-NEXT:    ori $a1, $zero, 2
2449d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $a1, $a0
245e5489f72Sgonglingqin; LA32-NEXT:    ret
246e5489f72Sgonglingqin;
247e5489f72Sgonglingqin; LA64-LABEL: select_ne_1_2:
248e5489f72Sgonglingqin; LA64:       # %bb.0:
249e5489f72Sgonglingqin; LA64-NEXT:    xor $a0, $a0, $a1
250e5489f72Sgonglingqin; LA64-NEXT:    sltu $a0, $zero, $a0
251e5489f72Sgonglingqin; LA64-NEXT:    ori $a1, $zero, 2
2529d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $a1, $a0
253e5489f72Sgonglingqin; LA64-NEXT:    ret
254e5489f72Sgonglingqin  %1 = icmp ne i32 %a, %b
255e5489f72Sgonglingqin  %2 = select i1 %1, i32 1, i32 2
256e5489f72Sgonglingqin  ret i32 %2
257e5489f72Sgonglingqin}
258e5489f72Sgonglingqin
259e5489f72Sgonglingqindefine i32 @select_eq_10000_10001(i32 signext %a, i32 signext %b) {
260e5489f72Sgonglingqin; LA32-LABEL: select_eq_10000_10001:
261e5489f72Sgonglingqin; LA32:       # %bb.0:
262e5489f72Sgonglingqin; LA32-NEXT:    xor $a0, $a0, $a1
263e5489f72Sgonglingqin; LA32-NEXT:    sltui $a0, $a0, 1
264e5489f72Sgonglingqin; LA32-NEXT:    lu12i.w $a1, 2
2659d8a7f78Sgonglingqin; LA32-NEXT:    ori $a1, $a1, 1810
2669d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $a1, $a0
267e5489f72Sgonglingqin; LA32-NEXT:    ret
268e5489f72Sgonglingqin;
269e5489f72Sgonglingqin; LA64-LABEL: select_eq_10000_10001:
270e5489f72Sgonglingqin; LA64:       # %bb.0:
271e5489f72Sgonglingqin; LA64-NEXT:    xor $a0, $a0, $a1
272e5489f72Sgonglingqin; LA64-NEXT:    sltui $a0, $a0, 1
273e5489f72Sgonglingqin; LA64-NEXT:    lu12i.w $a1, 2
2749d8a7f78Sgonglingqin; LA64-NEXT:    ori $a1, $a1, 1810
2759d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $a1, $a0
276e5489f72Sgonglingqin; LA64-NEXT:    ret
277e5489f72Sgonglingqin  %1 = icmp eq i32 %a, %b
278e5489f72Sgonglingqin  %2 = select i1 %1, i32 10001, i32 10002
279e5489f72Sgonglingqin  ret i32 %2
280e5489f72Sgonglingqin}
281e5489f72Sgonglingqin
282e5489f72Sgonglingqindefine i32 @select_ne_10001_10002(i32 signext %a, i32 signext %b) {
283e5489f72Sgonglingqin; LA32-LABEL: select_ne_10001_10002:
284e5489f72Sgonglingqin; LA32:       # %bb.0:
285e5489f72Sgonglingqin; LA32-NEXT:    xor $a0, $a0, $a1
286e5489f72Sgonglingqin; LA32-NEXT:    sltu $a0, $zero, $a0
287e5489f72Sgonglingqin; LA32-NEXT:    lu12i.w $a1, 2
2889d8a7f78Sgonglingqin; LA32-NEXT:    ori $a1, $a1, 1810
2899d8a7f78Sgonglingqin; LA32-NEXT:    sub.w $a0, $a1, $a0
290e5489f72Sgonglingqin; LA32-NEXT:    ret
291e5489f72Sgonglingqin;
292e5489f72Sgonglingqin; LA64-LABEL: select_ne_10001_10002:
293e5489f72Sgonglingqin; LA64:       # %bb.0:
294e5489f72Sgonglingqin; LA64-NEXT:    xor $a0, $a0, $a1
295e5489f72Sgonglingqin; LA64-NEXT:    sltu $a0, $zero, $a0
296e5489f72Sgonglingqin; LA64-NEXT:    lu12i.w $a1, 2
2979d8a7f78Sgonglingqin; LA64-NEXT:    ori $a1, $a1, 1810
2989d8a7f78Sgonglingqin; LA64-NEXT:    sub.d $a0, $a1, $a0
299e5489f72Sgonglingqin; LA64-NEXT:    ret
300e5489f72Sgonglingqin  %1 = icmp ne i32 %a, %b
301e5489f72Sgonglingqin  %2 = select i1 %1, i32 10001, i32 10002
302e5489f72Sgonglingqin  ret i32 %2
303e5489f72Sgonglingqin}
304