xref: /llvm-project/llvm/test/CodeGen/RISCV/ucmp.ll (revision 14c4f28ec109ec84158d60a74d3d1b7bfa411c77)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc < %s -mtriple=riscv32 | FileCheck %s --check-prefix=RV32I
3; RUN: llc < %s -mtriple=riscv64 | FileCheck %s --check-prefix=RV64I
4
5define i8 @ucmp.8.8(i8 zeroext %x, i8 zeroext %y) nounwind {
6; RV32I-LABEL: ucmp.8.8:
7; RV32I:       # %bb.0:
8; RV32I-NEXT:    sltu a2, a0, a1
9; RV32I-NEXT:    sltu a0, a1, a0
10; RV32I-NEXT:    sub a0, a0, a2
11; RV32I-NEXT:    ret
12;
13; RV64I-LABEL: ucmp.8.8:
14; RV64I:       # %bb.0:
15; RV64I-NEXT:    sltu a2, a0, a1
16; RV64I-NEXT:    sltu a0, a1, a0
17; RV64I-NEXT:    sub a0, a0, a2
18; RV64I-NEXT:    ret
19  %1 = call i8 @llvm.ucmp(i8 %x, i8 %y)
20  ret i8 %1
21}
22
23define i8 @ucmp.8.16(i16 zeroext %x, i16 zeroext %y) nounwind {
24; RV32I-LABEL: ucmp.8.16:
25; RV32I:       # %bb.0:
26; RV32I-NEXT:    sltu a2, a0, a1
27; RV32I-NEXT:    sltu a0, a1, a0
28; RV32I-NEXT:    sub a0, a0, a2
29; RV32I-NEXT:    ret
30;
31; RV64I-LABEL: ucmp.8.16:
32; RV64I:       # %bb.0:
33; RV64I-NEXT:    sltu a2, a0, a1
34; RV64I-NEXT:    sltu a0, a1, a0
35; RV64I-NEXT:    sub a0, a0, a2
36; RV64I-NEXT:    ret
37  %1 = call i8 @llvm.ucmp(i16 %x, i16 %y)
38  ret i8 %1
39}
40
41define i8 @ucmp.8.32(i32 %x, i32 %y) nounwind {
42; RV32I-LABEL: ucmp.8.32:
43; RV32I:       # %bb.0:
44; RV32I-NEXT:    sltu a2, a0, a1
45; RV32I-NEXT:    sltu a0, a1, a0
46; RV32I-NEXT:    sub a0, a0, a2
47; RV32I-NEXT:    ret
48;
49; RV64I-LABEL: ucmp.8.32:
50; RV64I:       # %bb.0:
51; RV64I-NEXT:    sext.w a1, a1
52; RV64I-NEXT:    sext.w a0, a0
53; RV64I-NEXT:    sltu a2, a0, a1
54; RV64I-NEXT:    sltu a0, a1, a0
55; RV64I-NEXT:    sub a0, a0, a2
56; RV64I-NEXT:    ret
57  %1 = call i8 @llvm.ucmp(i32 %x, i32 %y)
58  ret i8 %1
59}
60
61define i8 @ucmp.8.64(i64 %x, i64 %y) nounwind {
62; RV32I-LABEL: ucmp.8.64:
63; RV32I:       # %bb.0:
64; RV32I-NEXT:    beq a1, a3, .LBB3_2
65; RV32I-NEXT:  # %bb.1:
66; RV32I-NEXT:    sltu a4, a1, a3
67; RV32I-NEXT:    sltu a0, a3, a1
68; RV32I-NEXT:    sub a0, a0, a4
69; RV32I-NEXT:    ret
70; RV32I-NEXT:  .LBB3_2:
71; RV32I-NEXT:    sltu a4, a0, a2
72; RV32I-NEXT:    sltu a0, a2, a0
73; RV32I-NEXT:    sub a0, a0, a4
74; RV32I-NEXT:    ret
75;
76; RV64I-LABEL: ucmp.8.64:
77; RV64I:       # %bb.0:
78; RV64I-NEXT:    sltu a2, a0, a1
79; RV64I-NEXT:    sltu a0, a1, a0
80; RV64I-NEXT:    sub a0, a0, a2
81; RV64I-NEXT:    ret
82  %1 = call i8 @llvm.ucmp(i64 %x, i64 %y)
83  ret i8 %1
84}
85
86define i8 @ucmp.8.128(i128 %x, i128 %y) nounwind {
87; RV32I-LABEL: ucmp.8.128:
88; RV32I:       # %bb.0:
89; RV32I-NEXT:    lw a2, 4(a1)
90; RV32I-NEXT:    lw a4, 8(a1)
91; RV32I-NEXT:    lw a5, 12(a1)
92; RV32I-NEXT:    lw a6, 12(a0)
93; RV32I-NEXT:    lw a3, 4(a0)
94; RV32I-NEXT:    lw a7, 8(a0)
95; RV32I-NEXT:    beq a6, a5, .LBB4_2
96; RV32I-NEXT:  # %bb.1:
97; RV32I-NEXT:    sltu t2, a6, a5
98; RV32I-NEXT:    j .LBB4_3
99; RV32I-NEXT:  .LBB4_2:
100; RV32I-NEXT:    sltu t2, a7, a4
101; RV32I-NEXT:  .LBB4_3:
102; RV32I-NEXT:    lw a1, 0(a1)
103; RV32I-NEXT:    lw t0, 0(a0)
104; RV32I-NEXT:    beq a3, a2, .LBB4_5
105; RV32I-NEXT:  # %bb.4:
106; RV32I-NEXT:    sltu a0, a3, a2
107; RV32I-NEXT:    j .LBB4_6
108; RV32I-NEXT:  .LBB4_5:
109; RV32I-NEXT:    sltu a0, t0, a1
110; RV32I-NEXT:  .LBB4_6:
111; RV32I-NEXT:    xor t1, a6, a5
112; RV32I-NEXT:    xor t3, a7, a4
113; RV32I-NEXT:    or t1, t3, t1
114; RV32I-NEXT:    beqz t1, .LBB4_8
115; RV32I-NEXT:  # %bb.7:
116; RV32I-NEXT:    mv a0, t2
117; RV32I-NEXT:  .LBB4_8:
118; RV32I-NEXT:    beq a6, a5, .LBB4_11
119; RV32I-NEXT:  # %bb.9:
120; RV32I-NEXT:    sltu a4, a5, a6
121; RV32I-NEXT:    bne a3, a2, .LBB4_12
122; RV32I-NEXT:  .LBB4_10:
123; RV32I-NEXT:    sltu a1, a1, t0
124; RV32I-NEXT:    bnez t1, .LBB4_13
125; RV32I-NEXT:    j .LBB4_14
126; RV32I-NEXT:  .LBB4_11:
127; RV32I-NEXT:    sltu a4, a4, a7
128; RV32I-NEXT:    beq a3, a2, .LBB4_10
129; RV32I-NEXT:  .LBB4_12:
130; RV32I-NEXT:    sltu a1, a2, a3
131; RV32I-NEXT:    beqz t1, .LBB4_14
132; RV32I-NEXT:  .LBB4_13:
133; RV32I-NEXT:    mv a1, a4
134; RV32I-NEXT:  .LBB4_14:
135; RV32I-NEXT:    sub a0, a1, a0
136; RV32I-NEXT:    ret
137;
138; RV64I-LABEL: ucmp.8.128:
139; RV64I:       # %bb.0:
140; RV64I-NEXT:    beq a1, a3, .LBB4_2
141; RV64I-NEXT:  # %bb.1:
142; RV64I-NEXT:    sltu a4, a1, a3
143; RV64I-NEXT:    sltu a0, a3, a1
144; RV64I-NEXT:    sub a0, a0, a4
145; RV64I-NEXT:    ret
146; RV64I-NEXT:  .LBB4_2:
147; RV64I-NEXT:    sltu a4, a0, a2
148; RV64I-NEXT:    sltu a0, a2, a0
149; RV64I-NEXT:    sub a0, a0, a4
150; RV64I-NEXT:    ret
151  %1 = call i8 @llvm.ucmp(i128 %x, i128 %y)
152  ret i8 %1
153}
154
155define i32 @ucmp.32.32(i32 %x, i32 %y) nounwind {
156; RV32I-LABEL: ucmp.32.32:
157; RV32I:       # %bb.0:
158; RV32I-NEXT:    sltu a2, a0, a1
159; RV32I-NEXT:    sltu a0, a1, a0
160; RV32I-NEXT:    sub a0, a0, a2
161; RV32I-NEXT:    ret
162;
163; RV64I-LABEL: ucmp.32.32:
164; RV64I:       # %bb.0:
165; RV64I-NEXT:    sext.w a1, a1
166; RV64I-NEXT:    sext.w a0, a0
167; RV64I-NEXT:    sltu a2, a0, a1
168; RV64I-NEXT:    sltu a0, a1, a0
169; RV64I-NEXT:    sub a0, a0, a2
170; RV64I-NEXT:    ret
171  %1 = call i32 @llvm.ucmp(i32 %x, i32 %y)
172  ret i32 %1
173}
174
175define i32 @ucmp.32.32_sext(i32 signext %x, i32 signext %y) nounwind {
176; RV32I-LABEL: ucmp.32.32_sext:
177; RV32I:       # %bb.0:
178; RV32I-NEXT:    sltu a2, a0, a1
179; RV32I-NEXT:    sltu a0, a1, a0
180; RV32I-NEXT:    sub a0, a0, a2
181; RV32I-NEXT:    ret
182;
183; RV64I-LABEL: ucmp.32.32_sext:
184; RV64I:       # %bb.0:
185; RV64I-NEXT:    sltu a2, a0, a1
186; RV64I-NEXT:    sltu a0, a1, a0
187; RV64I-NEXT:    sub a0, a0, a2
188; RV64I-NEXT:    ret
189  %1 = call i32 @llvm.ucmp(i32 %x, i32 %y)
190  ret i32 %1
191}
192
193define i32 @ucmp.32.32_zext(i32 zeroext %x, i32 zeroext %y) nounwind {
194; RV32I-LABEL: ucmp.32.32_zext:
195; RV32I:       # %bb.0:
196; RV32I-NEXT:    sltu a2, a0, a1
197; RV32I-NEXT:    sltu a0, a1, a0
198; RV32I-NEXT:    sub a0, a0, a2
199; RV32I-NEXT:    ret
200;
201; RV64I-LABEL: ucmp.32.32_zext:
202; RV64I:       # %bb.0:
203; RV64I-NEXT:    sltu a2, a0, a1
204; RV64I-NEXT:    sltu a0, a1, a0
205; RV64I-NEXT:    sub a0, a0, a2
206; RV64I-NEXT:    ret
207  %1 = call i32 @llvm.ucmp(i32 %x, i32 %y)
208  ret i32 %1
209}
210
211define i32 @ucmp.32.64(i64 %x, i64 %y) nounwind {
212; RV32I-LABEL: ucmp.32.64:
213; RV32I:       # %bb.0:
214; RV32I-NEXT:    beq a1, a3, .LBB8_2
215; RV32I-NEXT:  # %bb.1:
216; RV32I-NEXT:    sltu a4, a1, a3
217; RV32I-NEXT:    sltu a0, a3, a1
218; RV32I-NEXT:    sub a0, a0, a4
219; RV32I-NEXT:    ret
220; RV32I-NEXT:  .LBB8_2:
221; RV32I-NEXT:    sltu a4, a0, a2
222; RV32I-NEXT:    sltu a0, a2, a0
223; RV32I-NEXT:    sub a0, a0, a4
224; RV32I-NEXT:    ret
225;
226; RV64I-LABEL: ucmp.32.64:
227; RV64I:       # %bb.0:
228; RV64I-NEXT:    sltu a2, a0, a1
229; RV64I-NEXT:    sltu a0, a1, a0
230; RV64I-NEXT:    sub a0, a0, a2
231; RV64I-NEXT:    ret
232  %1 = call i32 @llvm.ucmp(i64 %x, i64 %y)
233  ret i32 %1
234}
235
236define i64 @ucmp.64.64(i64 %x, i64 %y) nounwind {
237; RV32I-LABEL: ucmp.64.64:
238; RV32I:       # %bb.0:
239; RV32I-NEXT:    beq a1, a3, .LBB9_2
240; RV32I-NEXT:  # %bb.1:
241; RV32I-NEXT:    sltu a4, a1, a3
242; RV32I-NEXT:    sltu a0, a3, a1
243; RV32I-NEXT:    j .LBB9_3
244; RV32I-NEXT:  .LBB9_2:
245; RV32I-NEXT:    sltu a4, a0, a2
246; RV32I-NEXT:    sltu a0, a2, a0
247; RV32I-NEXT:  .LBB9_3:
248; RV32I-NEXT:    sub a0, a0, a4
249; RV32I-NEXT:    srai a1, a0, 31
250; RV32I-NEXT:    ret
251;
252; RV64I-LABEL: ucmp.64.64:
253; RV64I:       # %bb.0:
254; RV64I-NEXT:    sltu a2, a0, a1
255; RV64I-NEXT:    sltu a0, a1, a0
256; RV64I-NEXT:    sub a0, a0, a2
257; RV64I-NEXT:    ret
258  %1 = call i64 @llvm.ucmp(i64 %x, i64 %y)
259  ret i64 %1
260}
261