Revert rGe6ccb57bb3f6b761f2310e97fd6ca99eff42f73e "[SLP] Add cost model for `llvm...
[llvm-project.git] / llvm / test / CodeGen / RISCV / alu16.ll
bloba46af2053ae03d4a6598afa3dfc2642f4ddcde57
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck %s -check-prefix=RV32I
4 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck %s -check-prefix=RV64I
7 ; These tests are identical to those in alu32.ll but operate on i16. They check
8 ; that legalisation of these non-native types doesn't introduce unnecessary
9 ; inefficiencies.
11 define i16 @addi(i16 %a) nounwind {
12 ; RV32I-LABEL: addi:
13 ; RV32I:       # %bb.0:
14 ; RV32I-NEXT:    addi a0, a0, 1
15 ; RV32I-NEXT:    ret
17 ; RV64I-LABEL: addi:
18 ; RV64I:       # %bb.0:
19 ; RV64I-NEXT:    addi a0, a0, 1
20 ; RV64I-NEXT:    ret
21   %1 = add i16 %a, 1
22   ret i16 %1
25 define i16 @slti(i16 %a) nounwind {
26 ; RV32I-LABEL: slti:
27 ; RV32I:       # %bb.0:
28 ; RV32I-NEXT:    slli a0, a0, 16
29 ; RV32I-NEXT:    srai a0, a0, 16
30 ; RV32I-NEXT:    slti a0, a0, 2
31 ; RV32I-NEXT:    ret
33 ; RV64I-LABEL: slti:
34 ; RV64I:       # %bb.0:
35 ; RV64I-NEXT:    slli a0, a0, 48
36 ; RV64I-NEXT:    srai a0, a0, 48
37 ; RV64I-NEXT:    slti a0, a0, 2
38 ; RV64I-NEXT:    ret
39   %1 = icmp slt i16 %a, 2
40   %2 = zext i1 %1 to i16
41   ret i16 %2
44 define i16 @sltiu(i16 %a) nounwind {
45 ; RV32I-LABEL: sltiu:
46 ; RV32I:       # %bb.0:
47 ; RV32I-NEXT:    slli a0, a0, 16
48 ; RV32I-NEXT:    srli a0, a0, 16
49 ; RV32I-NEXT:    sltiu a0, a0, 3
50 ; RV32I-NEXT:    ret
52 ; RV64I-LABEL: sltiu:
53 ; RV64I:       # %bb.0:
54 ; RV64I-NEXT:    slli a0, a0, 48
55 ; RV64I-NEXT:    srli a0, a0, 48
56 ; RV64I-NEXT:    sltiu a0, a0, 3
57 ; RV64I-NEXT:    ret
58   %1 = icmp ult i16 %a, 3
59   %2 = zext i1 %1 to i16
60   ret i16 %2
63 ; Make sure we avoid an AND, if the input of an unsigned compare is known
64 ; to be sign extended. This can occur due to InstCombine canonicalizing
65 ; x s>= 0 && x s< 10 to x u< 10.
66 define i16 @sltiu_signext(i16 signext %a) nounwind {
67 ; RV32I-LABEL: sltiu_signext:
68 ; RV32I:       # %bb.0:
69 ; RV32I-NEXT:    sltiu a0, a0, 10
70 ; RV32I-NEXT:    ret
72 ; RV64I-LABEL: sltiu_signext:
73 ; RV64I:       # %bb.0:
74 ; RV64I-NEXT:    sltiu a0, a0, 10
75 ; RV64I-NEXT:    ret
76   %1 = icmp ult i16 %a, 10
77   %2 = zext i1 %1 to i16
78   ret i16 %2
81 define i16 @xori(i16 %a) nounwind {
82 ; RV32I-LABEL: xori:
83 ; RV32I:       # %bb.0:
84 ; RV32I-NEXT:    xori a0, a0, 4
85 ; RV32I-NEXT:    ret
87 ; RV64I-LABEL: xori:
88 ; RV64I:       # %bb.0:
89 ; RV64I-NEXT:    xori a0, a0, 4
90 ; RV64I-NEXT:    ret
91   %1 = xor i16 %a, 4
92   ret i16 %1
95 define i16 @ori(i16 %a) nounwind {
96 ; RV32I-LABEL: ori:
97 ; RV32I:       # %bb.0:
98 ; RV32I-NEXT:    ori a0, a0, 5
99 ; RV32I-NEXT:    ret
101 ; RV64I-LABEL: ori:
102 ; RV64I:       # %bb.0:
103 ; RV64I-NEXT:    ori a0, a0, 5
104 ; RV64I-NEXT:    ret
105   %1 = or i16 %a, 5
106   ret i16 %1
109 define i16 @andi(i16 %a) nounwind {
110 ; RV32I-LABEL: andi:
111 ; RV32I:       # %bb.0:
112 ; RV32I-NEXT:    andi a0, a0, 6
113 ; RV32I-NEXT:    ret
115 ; RV64I-LABEL: andi:
116 ; RV64I:       # %bb.0:
117 ; RV64I-NEXT:    andi a0, a0, 6
118 ; RV64I-NEXT:    ret
119   %1 = and i16 %a, 6
120   ret i16 %1
123 define i16 @slli(i16 %a) nounwind {
124 ; RV32I-LABEL: slli:
125 ; RV32I:       # %bb.0:
126 ; RV32I-NEXT:    slli a0, a0, 7
127 ; RV32I-NEXT:    ret
129 ; RV64I-LABEL: slli:
130 ; RV64I:       # %bb.0:
131 ; RV64I-NEXT:    slli a0, a0, 7
132 ; RV64I-NEXT:    ret
133   %1 = shl i16 %a, 7
134   ret i16 %1
137 define i16 @srli(i16 %a) nounwind {
138 ; RV32I-LABEL: srli:
139 ; RV32I:       # %bb.0:
140 ; RV32I-NEXT:    slli a0, a0, 16
141 ; RV32I-NEXT:    srli a0, a0, 22
142 ; RV32I-NEXT:    ret
144 ; RV64I-LABEL: srli:
145 ; RV64I:       # %bb.0:
146 ; RV64I-NEXT:    slli a0, a0, 48
147 ; RV64I-NEXT:    srli a0, a0, 54
148 ; RV64I-NEXT:    ret
149   %1 = lshr i16 %a, 6
150   ret i16 %1
153 define i16 @srai(i16 %a) nounwind {
154 ; RV32I-LABEL: srai:
155 ; RV32I:       # %bb.0:
156 ; RV32I-NEXT:    slli a0, a0, 16
157 ; RV32I-NEXT:    srai a0, a0, 25
158 ; RV32I-NEXT:    ret
160 ; RV64I-LABEL: srai:
161 ; RV64I:       # %bb.0:
162 ; RV64I-NEXT:    slli a0, a0, 48
163 ; RV64I-NEXT:    srai a0, a0, 57
164 ; RV64I-NEXT:    ret
165   %1 = ashr i16 %a, 9
166   ret i16 %1
170 define i16 @add(i16 %a, i16 %b) nounwind {
171 ; RV32I-LABEL: add:
172 ; RV32I:       # %bb.0:
173 ; RV32I-NEXT:    add a0, a0, a1
174 ; RV32I-NEXT:    ret
176 ; RV64I-LABEL: add:
177 ; RV64I:       # %bb.0:
178 ; RV64I-NEXT:    add a0, a0, a1
179 ; RV64I-NEXT:    ret
180   %1 = add i16 %a, %b
181   ret i16 %1
184 define i16 @sub(i16 %a, i16 %b) nounwind {
185 ; RV32I-LABEL: sub:
186 ; RV32I:       # %bb.0:
187 ; RV32I-NEXT:    sub a0, a0, a1
188 ; RV32I-NEXT:    ret
190 ; RV64I-LABEL: sub:
191 ; RV64I:       # %bb.0:
192 ; RV64I-NEXT:    sub a0, a0, a1
193 ; RV64I-NEXT:    ret
194   %1 = sub i16 %a, %b
195   ret i16 %1
198 define i16 @sll(i16 %a, i16 %b) nounwind {
199 ; RV32I-LABEL: sll:
200 ; RV32I:       # %bb.0:
201 ; RV32I-NEXT:    sll a0, a0, a1
202 ; RV32I-NEXT:    ret
204 ; RV64I-LABEL: sll:
205 ; RV64I:       # %bb.0:
206 ; RV64I-NEXT:    sll a0, a0, a1
207 ; RV64I-NEXT:    ret
208   %1 = shl i16 %a, %b
209   ret i16 %1
212 define i16 @slt(i16 %a, i16 %b) nounwind {
213 ; RV32I-LABEL: slt:
214 ; RV32I:       # %bb.0:
215 ; RV32I-NEXT:    slli a1, a1, 16
216 ; RV32I-NEXT:    srai a1, a1, 16
217 ; RV32I-NEXT:    slli a0, a0, 16
218 ; RV32I-NEXT:    srai a0, a0, 16
219 ; RV32I-NEXT:    slt a0, a0, a1
220 ; RV32I-NEXT:    ret
222 ; RV64I-LABEL: slt:
223 ; RV64I:       # %bb.0:
224 ; RV64I-NEXT:    slli a1, a1, 48
225 ; RV64I-NEXT:    srai a1, a1, 48
226 ; RV64I-NEXT:    slli a0, a0, 48
227 ; RV64I-NEXT:    srai a0, a0, 48
228 ; RV64I-NEXT:    slt a0, a0, a1
229 ; RV64I-NEXT:    ret
230   %1 = icmp slt i16 %a, %b
231   %2 = zext i1 %1 to i16
232   ret i16 %2
235 define i16 @sltu(i16 %a, i16 %b) nounwind {
236 ; RV32I-LABEL: sltu:
237 ; RV32I:       # %bb.0:
238 ; RV32I-NEXT:    lui a2, 16
239 ; RV32I-NEXT:    addi a2, a2, -1
240 ; RV32I-NEXT:    and a1, a1, a2
241 ; RV32I-NEXT:    and a0, a0, a2
242 ; RV32I-NEXT:    sltu a0, a0, a1
243 ; RV32I-NEXT:    ret
245 ; RV64I-LABEL: sltu:
246 ; RV64I:       # %bb.0:
247 ; RV64I-NEXT:    lui a2, 16
248 ; RV64I-NEXT:    addiw a2, a2, -1
249 ; RV64I-NEXT:    and a1, a1, a2
250 ; RV64I-NEXT:    and a0, a0, a2
251 ; RV64I-NEXT:    sltu a0, a0, a1
252 ; RV64I-NEXT:    ret
253   %1 = icmp ult i16 %a, %b
254   %2 = zext i1 %1 to i16
255   ret i16 %2
258 define i16 @xor(i16 %a, i16 %b) nounwind {
259 ; RV32I-LABEL: xor:
260 ; RV32I:       # %bb.0:
261 ; RV32I-NEXT:    xor a0, a0, a1
262 ; RV32I-NEXT:    ret
264 ; RV64I-LABEL: xor:
265 ; RV64I:       # %bb.0:
266 ; RV64I-NEXT:    xor a0, a0, a1
267 ; RV64I-NEXT:    ret
268   %1 = xor i16 %a, %b
269   ret i16 %1
272 define i16 @srl(i16 %a, i16 %b) nounwind {
273 ; RV32I-LABEL: srl:
274 ; RV32I:       # %bb.0:
275 ; RV32I-NEXT:    slli a0, a0, 16
276 ; RV32I-NEXT:    srli a0, a0, 16
277 ; RV32I-NEXT:    srl a0, a0, a1
278 ; RV32I-NEXT:    ret
280 ; RV64I-LABEL: srl:
281 ; RV64I:       # %bb.0:
282 ; RV64I-NEXT:    slli a0, a0, 48
283 ; RV64I-NEXT:    srli a0, a0, 48
284 ; RV64I-NEXT:    srl a0, a0, a1
285 ; RV64I-NEXT:    ret
286   %1 = lshr i16 %a, %b
287   ret i16 %1
290 define i16 @sra(i16 %a, i16 %b) nounwind {
291 ; RV32I-LABEL: sra:
292 ; RV32I:       # %bb.0:
293 ; RV32I-NEXT:    slli a0, a0, 16
294 ; RV32I-NEXT:    srai a0, a0, 16
295 ; RV32I-NEXT:    sra a0, a0, a1
296 ; RV32I-NEXT:    ret
298 ; RV64I-LABEL: sra:
299 ; RV64I:       # %bb.0:
300 ; RV64I-NEXT:    slli a0, a0, 48
301 ; RV64I-NEXT:    srai a0, a0, 48
302 ; RV64I-NEXT:    sra a0, a0, a1
303 ; RV64I-NEXT:    ret
304   %1 = ashr i16 %a, %b
305   ret i16 %1
308 define i16 @or(i16 %a, i16 %b) nounwind {
309 ; RV32I-LABEL: or:
310 ; RV32I:       # %bb.0:
311 ; RV32I-NEXT:    or a0, a0, a1
312 ; RV32I-NEXT:    ret
314 ; RV64I-LABEL: or:
315 ; RV64I:       # %bb.0:
316 ; RV64I-NEXT:    or a0, a0, a1
317 ; RV64I-NEXT:    ret
318   %1 = or i16 %a, %b
319   ret i16 %1
322 define i16 @and(i16 %a, i16 %b) nounwind {
323 ; RV32I-LABEL: and:
324 ; RV32I:       # %bb.0:
325 ; RV32I-NEXT:    and a0, a0, a1
326 ; RV32I-NEXT:    ret
328 ; RV64I-LABEL: and:
329 ; RV64I:       # %bb.0:
330 ; RV64I-NEXT:    and a0, a0, a1
331 ; RV64I-NEXT:    ret
332   %1 = and i16 %a, %b
333   ret i16 %1