1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32
2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64
3
4;; Exercise the 'icmp' LLVM IR: https://llvm.org/docs/LangRef.html#icmp-instruction
5
6define i1 @icmp_eq(i32 signext %a, i32 signext %b) {
7; LA32-LABEL: icmp_eq:
8; LA32:       # %bb.0:
9; LA32-NEXT:    xor $a0, $a0, $a1
10; LA32-NEXT:    sltui $a0, $a0, 1
11; LA32-NEXT:    jirl $zero, $ra, 0
12;
13; LA64-LABEL: icmp_eq:
14; LA64:       # %bb.0:
15; LA64-NEXT:    xor $a0, $a0, $a1
16; LA64-NEXT:    sltui $a0, $a0, 1
17; LA64-NEXT:    jirl $zero, $ra, 0
18  %res = icmp eq i32 %a, %b
19  ret i1 %res
20}
21
22define i1 @icmp_ne(i32 signext %a, i32 signext %b) {
23; LA32-LABEL: icmp_ne:
24; LA32:       # %bb.0:
25; LA32-NEXT:    xor $a0, $a0, $a1
26; LA32-NEXT:    sltu $a0, $zero, $a0
27; LA32-NEXT:    jirl $zero, $ra, 0
28;
29; LA64-LABEL: icmp_ne:
30; LA64:       # %bb.0:
31; LA64-NEXT:    xor $a0, $a0, $a1
32; LA64-NEXT:    sltu $a0, $zero, $a0
33; LA64-NEXT:    jirl $zero, $ra, 0
34  %res = icmp ne i32 %a, %b
35  ret i1 %res
36}
37
38define i1 @icmp_ugt(i32 signext %a, i32 signext %b) {
39; LA32-LABEL: icmp_ugt:
40; LA32:       # %bb.0:
41; LA32-NEXT:    sltu $a0, $a1, $a0
42; LA32-NEXT:    jirl $zero, $ra, 0
43;
44; LA64-LABEL: icmp_ugt:
45; LA64:       # %bb.0:
46; LA64-NEXT:    sltu $a0, $a1, $a0
47; LA64-NEXT:    jirl $zero, $ra, 0
48  %res = icmp ugt i32 %a, %b
49  ret i1 %res
50}
51
52define i1 @icmp_uge(i32 signext %a, i32 signext %b) {
53; LA32-LABEL: icmp_uge:
54; LA32:       # %bb.0:
55; LA32-NEXT:    sltu $a0, $a0, $a1
56; LA32-NEXT:    xori $a0, $a0, 1
57; LA32-NEXT:    jirl $zero, $ra, 0
58;
59; LA64-LABEL: icmp_uge:
60; LA64:       # %bb.0:
61; LA64-NEXT:    sltu $a0, $a0, $a1
62; LA64-NEXT:    xori $a0, $a0, 1
63; LA64-NEXT:    jirl $zero, $ra, 0
64  %res = icmp uge i32 %a, %b
65  ret i1 %res
66}
67
68define i1 @icmp_ult(i32 signext %a, i32 signext %b) {
69; LA32-LABEL: icmp_ult:
70; LA32:       # %bb.0:
71; LA32-NEXT:    sltu $a0, $a0, $a1
72; LA32-NEXT:    jirl $zero, $ra, 0
73;
74; LA64-LABEL: icmp_ult:
75; LA64:       # %bb.0:
76; LA64-NEXT:    sltu $a0, $a0, $a1
77; LA64-NEXT:    jirl $zero, $ra, 0
78  %res = icmp ult i32 %a, %b
79  ret i1 %res
80}
81
82define i1 @icmp_ule(i32 signext %a, i32 signext %b) {
83; LA32-LABEL: icmp_ule:
84; LA32:       # %bb.0:
85; LA32-NEXT:    sltu $a0, $a1, $a0
86; LA32-NEXT:    xori $a0, $a0, 1
87; LA32-NEXT:    jirl $zero, $ra, 0
88;
89; LA64-LABEL: icmp_ule:
90; LA64:       # %bb.0:
91; LA64-NEXT:    sltu $a0, $a1, $a0
92; LA64-NEXT:    xori $a0, $a0, 1
93; LA64-NEXT:    jirl $zero, $ra, 0
94  %res = icmp ule i32 %a, %b
95  ret i1 %res
96}
97
98define i1 @icmp_sgt(i32 signext %a, i32 signext %b) {
99; LA32-LABEL: icmp_sgt:
100; LA32:       # %bb.0:
101; LA32-NEXT:    slt $a0, $a1, $a0
102; LA32-NEXT:    jirl $zero, $ra, 0
103;
104; LA64-LABEL: icmp_sgt:
105; LA64:       # %bb.0:
106; LA64-NEXT:    slt $a0, $a1, $a0
107; LA64-NEXT:    jirl $zero, $ra, 0
108  %res = icmp sgt i32 %a, %b
109  ret i1 %res
110}
111
112define i1 @icmp_sge(i32 signext %a, i32 signext %b) {
113; LA32-LABEL: icmp_sge:
114; LA32:       # %bb.0:
115; LA32-NEXT:    slt $a0, $a0, $a1
116; LA32-NEXT:    xori $a0, $a0, 1
117; LA32-NEXT:    jirl $zero, $ra, 0
118;
119; LA64-LABEL: icmp_sge:
120; LA64:       # %bb.0:
121; LA64-NEXT:    slt $a0, $a0, $a1
122; LA64-NEXT:    xori $a0, $a0, 1
123; LA64-NEXT:    jirl $zero, $ra, 0
124  %res = icmp sge i32 %a, %b
125  ret i1 %res
126}
127
128define i1 @icmp_slt(i32 signext %a, i32 signext %b) {
129; LA32-LABEL: icmp_slt:
130; LA32:       # %bb.0:
131; LA32-NEXT:    slt $a0, $a0, $a1
132; LA32-NEXT:    jirl $zero, $ra, 0
133;
134; LA64-LABEL: icmp_slt:
135; LA64:       # %bb.0:
136; LA64-NEXT:    slt $a0, $a0, $a1
137; LA64-NEXT:    jirl $zero, $ra, 0
138  %res = icmp slt i32 %a, %b
139  ret i1 %res
140}
141
142define i1 @icmp_sle(i32 signext %a, i32 signext %b) {
143; LA32-LABEL: icmp_sle:
144; LA32:       # %bb.0:
145; LA32-NEXT:    slt $a0, $a1, $a0
146; LA32-NEXT:    xori $a0, $a0, 1
147; LA32-NEXT:    jirl $zero, $ra, 0
148;
149; LA64-LABEL: icmp_sle:
150; LA64:       # %bb.0:
151; LA64-NEXT:    slt $a0, $a1, $a0
152; LA64-NEXT:    xori $a0, $a0, 1
153; LA64-NEXT:    jirl $zero, $ra, 0
154  %res = icmp sle i32 %a, %b
155  ret i1 %res
156}
157
158define i1 @icmp_slt_3(i32 signext %a) {
159; LA32-LABEL: icmp_slt_3:
160; LA32:       # %bb.0:
161; LA32-NEXT:    slti $a0, $a0, 3
162; LA32-NEXT:    jirl $zero, $ra, 0
163;
164; LA64-LABEL: icmp_slt_3:
165; LA64:       # %bb.0:
166; LA64-NEXT:    slti $a0, $a0, 3
167; LA64-NEXT:    jirl $zero, $ra, 0
168  %res = icmp slt i32 %a, 3
169  ret i1 %res
170}
171
172define i1 @icmp_ult_3(i32 signext %a) {
173; LA32-LABEL: icmp_ult_3:
174; LA32:       # %bb.0:
175; LA32-NEXT:    sltui $a0, $a0, 3
176; LA32-NEXT:    jirl $zero, $ra, 0
177;
178; LA64-LABEL: icmp_ult_3:
179; LA64:       # %bb.0:
180; LA64-NEXT:    sltui $a0, $a0, 3
181; LA64-NEXT:    jirl $zero, $ra, 0
182  %res = icmp ult i32 %a, 3
183  ret i1 %res
184}
185
186define i1 @icmp_eq_0(i32 signext %a) {
187; LA32-LABEL: icmp_eq_0:
188; LA32:       # %bb.0:
189; LA32-NEXT:    sltui $a0, $a0, 1
190; LA32-NEXT:    jirl $zero, $ra, 0
191;
192; LA64-LABEL: icmp_eq_0:
193; LA64:       # %bb.0:
194; LA64-NEXT:    sltui $a0, $a0, 1
195; LA64-NEXT:    jirl $zero, $ra, 0
196  %res = icmp eq i32 %a, 0
197  ret i1 %res
198}
199
200define i1 @icmp_eq_3(i32 signext %a) {
201; LA32-LABEL: icmp_eq_3:
202; LA32:       # %bb.0:
203; LA32-NEXT:    addi.w $a0, $a0, -3
204; LA32-NEXT:    sltui $a0, $a0, 1
205; LA32-NEXT:    jirl $zero, $ra, 0
206;
207; LA64-LABEL: icmp_eq_3:
208; LA64:       # %bb.0:
209; LA64-NEXT:    addi.d $a0, $a0, -3
210; LA64-NEXT:    sltui $a0, $a0, 1
211; LA64-NEXT:    jirl $zero, $ra, 0
212  %res = icmp eq i32 %a, 3
213  ret i1 %res
214}
215
216define i1 @icmp_ne_0(i32 signext %a) {
217; LA32-LABEL: icmp_ne_0:
218; LA32:       # %bb.0:
219; LA32-NEXT:    sltu $a0, $zero, $a0
220; LA32-NEXT:    jirl $zero, $ra, 0
221;
222; LA64-LABEL: icmp_ne_0:
223; LA64:       # %bb.0:
224; LA64-NEXT:    sltu $a0, $zero, $a0
225; LA64-NEXT:    jirl $zero, $ra, 0
226  %res = icmp ne i32 %a, 0
227  ret i1 %res
228}
229
230define i1 @icmp_ne_3(i32 signext %a) {
231; LA32-LABEL: icmp_ne_3:
232; LA32:       # %bb.0:
233; LA32-NEXT:    addi.w $a0, $a0, -3
234; LA32-NEXT:    sltu $a0, $zero, $a0
235; LA32-NEXT:    jirl $zero, $ra, 0
236;
237; LA64-LABEL: icmp_ne_3:
238; LA64:       # %bb.0:
239; LA64-NEXT:    addi.d $a0, $a0, -3
240; LA64-NEXT:    sltu $a0, $zero, $a0
241; LA64-NEXT:    jirl $zero, $ra, 0
242  %res = icmp ne i32 %a, 3
243  ret i1 %res
244}
245