xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/select-icc-int.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4
5;; Test integers selection after integers comparison
6
7define i32 @select_eq(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
8; LA32-LABEL: select_eq:
9; LA32:       # %bb.0:
10; LA32-NEXT:    xor $a0, $a0, $a1
11; LA32-NEXT:    sltui $a0, $a0, 1
12; LA32-NEXT:    masknez $a1, $a3, $a0
13; LA32-NEXT:    maskeqz $a0, $a2, $a0
14; LA32-NEXT:    or $a0, $a0, $a1
15; LA32-NEXT:    ret
16;
17; LA64-LABEL: select_eq:
18; LA64:       # %bb.0:
19; LA64-NEXT:    xor $a0, $a0, $a1
20; LA64-NEXT:    sltui $a0, $a0, 1
21; LA64-NEXT:    masknez $a1, $a3, $a0
22; LA64-NEXT:    maskeqz $a0, $a2, $a0
23; LA64-NEXT:    or $a0, $a0, $a1
24; LA64-NEXT:    ret
25  %cond = icmp eq i32 %a, %b
26  %res = select i1 %cond, i32 %x, i32 %y
27  ret i32 %res
28}
29
30define i32 @select_ne(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
31; LA32-LABEL: select_ne:
32; LA32:       # %bb.0:
33; LA32-NEXT:    xor $a0, $a0, $a1
34; LA32-NEXT:    sltu $a0, $zero, $a0
35; LA32-NEXT:    masknez $a1, $a3, $a0
36; LA32-NEXT:    maskeqz $a0, $a2, $a0
37; LA32-NEXT:    or $a0, $a0, $a1
38; LA32-NEXT:    ret
39;
40; LA64-LABEL: select_ne:
41; LA64:       # %bb.0:
42; LA64-NEXT:    xor $a0, $a0, $a1
43; LA64-NEXT:    sltu $a0, $zero, $a0
44; LA64-NEXT:    masknez $a1, $a3, $a0
45; LA64-NEXT:    maskeqz $a0, $a2, $a0
46; LA64-NEXT:    or $a0, $a0, $a1
47; LA64-NEXT:    ret
48  %cond = icmp ne i32 %a, %b
49  %res = select i1 %cond, i32 %x, i32 %y
50  ret i32 %res
51}
52
53define i32 @select_ugt(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
54; LA32-LABEL: select_ugt:
55; LA32:       # %bb.0:
56; LA32-NEXT:    sltu $a0, $a1, $a0
57; LA32-NEXT:    masknez $a1, $a3, $a0
58; LA32-NEXT:    maskeqz $a0, $a2, $a0
59; LA32-NEXT:    or $a0, $a0, $a1
60; LA32-NEXT:    ret
61;
62; LA64-LABEL: select_ugt:
63; LA64:       # %bb.0:
64; LA64-NEXT:    sltu $a0, $a1, $a0
65; LA64-NEXT:    masknez $a1, $a3, $a0
66; LA64-NEXT:    maskeqz $a0, $a2, $a0
67; LA64-NEXT:    or $a0, $a0, $a1
68; LA64-NEXT:    ret
69  %cond = icmp ugt i32 %a, %b
70  %res = select i1 %cond, i32 %x, i32 %y
71  ret i32 %res
72}
73
74define i32 @select_uge(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
75; LA32-LABEL: select_uge:
76; LA32:       # %bb.0:
77; LA32-NEXT:    sltu $a0, $a0, $a1
78; LA32-NEXT:    xori $a0, $a0, 1
79; LA32-NEXT:    masknez $a1, $a3, $a0
80; LA32-NEXT:    maskeqz $a0, $a2, $a0
81; LA32-NEXT:    or $a0, $a0, $a1
82; LA32-NEXT:    ret
83;
84; LA64-LABEL: select_uge:
85; LA64:       # %bb.0:
86; LA64-NEXT:    sltu $a0, $a0, $a1
87; LA64-NEXT:    xori $a0, $a0, 1
88; LA64-NEXT:    masknez $a1, $a3, $a0
89; LA64-NEXT:    maskeqz $a0, $a2, $a0
90; LA64-NEXT:    or $a0, $a0, $a1
91; LA64-NEXT:    ret
92  %cond = icmp uge i32 %a, %b
93  %res = select i1 %cond, i32 %x, i32 %y
94  ret i32 %res
95}
96
97define i32 @select_ult(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
98; LA32-LABEL: select_ult:
99; LA32:       # %bb.0:
100; LA32-NEXT:    sltu $a0, $a0, $a1
101; LA32-NEXT:    masknez $a1, $a3, $a0
102; LA32-NEXT:    maskeqz $a0, $a2, $a0
103; LA32-NEXT:    or $a0, $a0, $a1
104; LA32-NEXT:    ret
105;
106; LA64-LABEL: select_ult:
107; LA64:       # %bb.0:
108; LA64-NEXT:    sltu $a0, $a0, $a1
109; LA64-NEXT:    masknez $a1, $a3, $a0
110; LA64-NEXT:    maskeqz $a0, $a2, $a0
111; LA64-NEXT:    or $a0, $a0, $a1
112; LA64-NEXT:    ret
113  %cond = icmp ult i32 %a, %b
114  %res = select i1 %cond, i32 %x, i32 %y
115  ret i32 %res
116}
117
118define i32 @select_ule(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
119; LA32-LABEL: select_ule:
120; LA32:       # %bb.0:
121; LA32-NEXT:    sltu $a0, $a1, $a0
122; LA32-NEXT:    xori $a0, $a0, 1
123; LA32-NEXT:    masknez $a1, $a3, $a0
124; LA32-NEXT:    maskeqz $a0, $a2, $a0
125; LA32-NEXT:    or $a0, $a0, $a1
126; LA32-NEXT:    ret
127;
128; LA64-LABEL: select_ule:
129; LA64:       # %bb.0:
130; LA64-NEXT:    sltu $a0, $a1, $a0
131; LA64-NEXT:    xori $a0, $a0, 1
132; LA64-NEXT:    masknez $a1, $a3, $a0
133; LA64-NEXT:    maskeqz $a0, $a2, $a0
134; LA64-NEXT:    or $a0, $a0, $a1
135; LA64-NEXT:    ret
136  %cond = icmp ule i32 %a, %b
137  %res = select i1 %cond, i32 %x, i32 %y
138  ret i32 %res
139}
140
141define i32 @select_sgt(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
142; LA32-LABEL: select_sgt:
143; LA32:       # %bb.0:
144; LA32-NEXT:    slt $a0, $a1, $a0
145; LA32-NEXT:    masknez $a1, $a3, $a0
146; LA32-NEXT:    maskeqz $a0, $a2, $a0
147; LA32-NEXT:    or $a0, $a0, $a1
148; LA32-NEXT:    ret
149;
150; LA64-LABEL: select_sgt:
151; LA64:       # %bb.0:
152; LA64-NEXT:    slt $a0, $a1, $a0
153; LA64-NEXT:    masknez $a1, $a3, $a0
154; LA64-NEXT:    maskeqz $a0, $a2, $a0
155; LA64-NEXT:    or $a0, $a0, $a1
156; LA64-NEXT:    ret
157  %cond = icmp sgt i32 %a, %b
158  %res = select i1 %cond, i32 %x, i32 %y
159  ret i32 %res
160}
161
162define i32 @select_sge(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
163; LA32-LABEL: select_sge:
164; LA32:       # %bb.0:
165; LA32-NEXT:    slt $a0, $a0, $a1
166; LA32-NEXT:    xori $a0, $a0, 1
167; LA32-NEXT:    masknez $a1, $a3, $a0
168; LA32-NEXT:    maskeqz $a0, $a2, $a0
169; LA32-NEXT:    or $a0, $a0, $a1
170; LA32-NEXT:    ret
171;
172; LA64-LABEL: select_sge:
173; LA64:       # %bb.0:
174; LA64-NEXT:    slt $a0, $a0, $a1
175; LA64-NEXT:    xori $a0, $a0, 1
176; LA64-NEXT:    masknez $a1, $a3, $a0
177; LA64-NEXT:    maskeqz $a0, $a2, $a0
178; LA64-NEXT:    or $a0, $a0, $a1
179; LA64-NEXT:    ret
180  %cond = icmp sge i32 %a, %b
181  %res = select i1 %cond, i32 %x, i32 %y
182  ret i32 %res
183}
184
185define i32 @select_slt(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
186; LA32-LABEL: select_slt:
187; LA32:       # %bb.0:
188; LA32-NEXT:    slt $a0, $a0, $a1
189; LA32-NEXT:    masknez $a1, $a3, $a0
190; LA32-NEXT:    maskeqz $a0, $a2, $a0
191; LA32-NEXT:    or $a0, $a0, $a1
192; LA32-NEXT:    ret
193;
194; LA64-LABEL: select_slt:
195; LA64:       # %bb.0:
196; LA64-NEXT:    slt $a0, $a0, $a1
197; LA64-NEXT:    masknez $a1, $a3, $a0
198; LA64-NEXT:    maskeqz $a0, $a2, $a0
199; LA64-NEXT:    or $a0, $a0, $a1
200; LA64-NEXT:    ret
201  %cond = icmp slt i32 %a, %b
202  %res = select i1 %cond, i32 %x, i32 %y
203  ret i32 %res
204}
205
206define i32 @select_sle(i32 signext %a, i32 signext %b, i32 %x, i32 %y) {
207; LA32-LABEL: select_sle:
208; LA32:       # %bb.0:
209; LA32-NEXT:    slt $a0, $a1, $a0
210; LA32-NEXT:    xori $a0, $a0, 1
211; LA32-NEXT:    masknez $a1, $a3, $a0
212; LA32-NEXT:    maskeqz $a0, $a2, $a0
213; LA32-NEXT:    or $a0, $a0, $a1
214; LA32-NEXT:    ret
215;
216; LA64-LABEL: select_sle:
217; LA64:       # %bb.0:
218; LA64-NEXT:    slt $a0, $a1, $a0
219; LA64-NEXT:    xori $a0, $a0, 1
220; LA64-NEXT:    masknez $a1, $a3, $a0
221; LA64-NEXT:    maskeqz $a0, $a2, $a0
222; LA64-NEXT:    or $a0, $a0, $a1
223; LA64-NEXT:    ret
224  %cond = icmp sle i32 %a, %b
225  %res = select i1 %cond, i32 %x, i32 %y
226  ret i32 %res
227}
228