Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / RISCV / alu16.ll
blob15bf44e526e76fe55e687df49d7a6cc8671fe9de
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:    lui a1, 16
48 ; RV32I-NEXT:    addi a1, a1, -1
49 ; RV32I-NEXT:    and a0, a0, a1
50 ; RV32I-NEXT:    sltiu a0, a0, 3
51 ; RV32I-NEXT:    ret
53 ; RV64I-LABEL: sltiu:
54 ; RV64I:       # %bb.0:
55 ; RV64I-NEXT:    lui a1, 16
56 ; RV64I-NEXT:    addiw a1, a1, -1
57 ; RV64I-NEXT:    and a0, a0, a1
58 ; RV64I-NEXT:    sltiu a0, a0, 3
59 ; RV64I-NEXT:    ret
60   %1 = icmp ult i16 %a, 3
61   %2 = zext i1 %1 to i16
62   ret i16 %2
65 define i16 @xori(i16 %a) nounwind {
66 ; RV32I-LABEL: xori:
67 ; RV32I:       # %bb.0:
68 ; RV32I-NEXT:    xori a0, a0, 4
69 ; RV32I-NEXT:    ret
71 ; RV64I-LABEL: xori:
72 ; RV64I:       # %bb.0:
73 ; RV64I-NEXT:    xori a0, a0, 4
74 ; RV64I-NEXT:    ret
75   %1 = xor i16 %a, 4
76   ret i16 %1
79 define i16 @ori(i16 %a) nounwind {
80 ; RV32I-LABEL: ori:
81 ; RV32I:       # %bb.0:
82 ; RV32I-NEXT:    ori a0, a0, 5
83 ; RV32I-NEXT:    ret
85 ; RV64I-LABEL: ori:
86 ; RV64I:       # %bb.0:
87 ; RV64I-NEXT:    ori a0, a0, 5
88 ; RV64I-NEXT:    ret
89   %1 = or i16 %a, 5
90   ret i16 %1
93 define i16 @andi(i16 %a) nounwind {
94 ; RV32I-LABEL: andi:
95 ; RV32I:       # %bb.0:
96 ; RV32I-NEXT:    andi a0, a0, 6
97 ; RV32I-NEXT:    ret
99 ; RV64I-LABEL: andi:
100 ; RV64I:       # %bb.0:
101 ; RV64I-NEXT:    andi a0, a0, 6
102 ; RV64I-NEXT:    ret
103   %1 = and i16 %a, 6
104   ret i16 %1
107 define i16 @slli(i16 %a) nounwind {
108 ; RV32I-LABEL: slli:
109 ; RV32I:       # %bb.0:
110 ; RV32I-NEXT:    slli a0, a0, 7
111 ; RV32I-NEXT:    ret
113 ; RV64I-LABEL: slli:
114 ; RV64I:       # %bb.0:
115 ; RV64I-NEXT:    slli a0, a0, 7
116 ; RV64I-NEXT:    ret
117   %1 = shl i16 %a, 7
118   ret i16 %1
121 define i16 @srli(i16 %a) nounwind {
122 ; RV32I-LABEL: srli:
123 ; RV32I:       # %bb.0:
124 ; RV32I-NEXT:    lui a1, 16
125 ; RV32I-NEXT:    addi a1, a1, -64
126 ; RV32I-NEXT:    and a0, a0, a1
127 ; RV32I-NEXT:    srli a0, a0, 6
128 ; RV32I-NEXT:    ret
130 ; RV64I-LABEL: srli:
131 ; RV64I:       # %bb.0:
132 ; RV64I-NEXT:    lui a1, 16
133 ; RV64I-NEXT:    addiw a1, a1, -64
134 ; RV64I-NEXT:    and a0, a0, a1
135 ; RV64I-NEXT:    srli a0, a0, 6
136 ; RV64I-NEXT:    ret
137   %1 = lshr i16 %a, 6
138   ret i16 %1
141 define i16 @srai(i16 %a) nounwind {
142 ; RV32I-LABEL: srai:
143 ; RV32I:       # %bb.0:
144 ; RV32I-NEXT:    slli a0, a0, 16
145 ; RV32I-NEXT:    srai a0, a0, 25
146 ; RV32I-NEXT:    ret
148 ; RV64I-LABEL: srai:
149 ; RV64I:       # %bb.0:
150 ; RV64I-NEXT:    slli a0, a0, 48
151 ; RV64I-NEXT:    srai a0, a0, 57
152 ; RV64I-NEXT:    ret
153   %1 = ashr i16 %a, 9
154   ret i16 %1
158 define i16 @add(i16 %a, i16 %b) nounwind {
159 ; RV32I-LABEL: add:
160 ; RV32I:       # %bb.0:
161 ; RV32I-NEXT:    add a0, a0, a1
162 ; RV32I-NEXT:    ret
164 ; RV64I-LABEL: add:
165 ; RV64I:       # %bb.0:
166 ; RV64I-NEXT:    add a0, a0, a1
167 ; RV64I-NEXT:    ret
168   %1 = add i16 %a, %b
169   ret i16 %1
172 define i16 @sub(i16 %a, i16 %b) nounwind {
173 ; RV32I-LABEL: sub:
174 ; RV32I:       # %bb.0:
175 ; RV32I-NEXT:    sub a0, a0, a1
176 ; RV32I-NEXT:    ret
178 ; RV64I-LABEL: sub:
179 ; RV64I:       # %bb.0:
180 ; RV64I-NEXT:    sub a0, a0, a1
181 ; RV64I-NEXT:    ret
182   %1 = sub i16 %a, %b
183   ret i16 %1
186 define i16 @sll(i16 %a, i16 %b) nounwind {
187 ; RV32I-LABEL: sll:
188 ; RV32I:       # %bb.0:
189 ; RV32I-NEXT:    sll a0, a0, a1
190 ; RV32I-NEXT:    ret
192 ; RV64I-LABEL: sll:
193 ; RV64I:       # %bb.0:
194 ; RV64I-NEXT:    sll a0, a0, a1
195 ; RV64I-NEXT:    ret
196   %1 = shl i16 %a, %b
197   ret i16 %1
200 define i16 @slt(i16 %a, i16 %b) nounwind {
201 ; RV32I-LABEL: slt:
202 ; RV32I:       # %bb.0:
203 ; RV32I-NEXT:    slli a1, a1, 16
204 ; RV32I-NEXT:    srai a1, a1, 16
205 ; RV32I-NEXT:    slli a0, a0, 16
206 ; RV32I-NEXT:    srai a0, a0, 16
207 ; RV32I-NEXT:    slt a0, a0, a1
208 ; RV32I-NEXT:    ret
210 ; RV64I-LABEL: slt:
211 ; RV64I:       # %bb.0:
212 ; RV64I-NEXT:    slli a1, a1, 48
213 ; RV64I-NEXT:    srai a1, a1, 48
214 ; RV64I-NEXT:    slli a0, a0, 48
215 ; RV64I-NEXT:    srai a0, a0, 48
216 ; RV64I-NEXT:    slt a0, a0, a1
217 ; RV64I-NEXT:    ret
218   %1 = icmp slt i16 %a, %b
219   %2 = zext i1 %1 to i16
220   ret i16 %2
223 define i16 @sltu(i16 %a, i16 %b) nounwind {
224 ; RV32I-LABEL: sltu:
225 ; RV32I:       # %bb.0:
226 ; RV32I-NEXT:    lui a2, 16
227 ; RV32I-NEXT:    addi a2, a2, -1
228 ; RV32I-NEXT:    and a1, a1, a2
229 ; RV32I-NEXT:    and a0, a0, a2
230 ; RV32I-NEXT:    sltu a0, a0, a1
231 ; RV32I-NEXT:    ret
233 ; RV64I-LABEL: sltu:
234 ; RV64I:       # %bb.0:
235 ; RV64I-NEXT:    lui a2, 16
236 ; RV64I-NEXT:    addiw a2, a2, -1
237 ; RV64I-NEXT:    and a1, a1, a2
238 ; RV64I-NEXT:    and a0, a0, a2
239 ; RV64I-NEXT:    sltu a0, a0, a1
240 ; RV64I-NEXT:    ret
241   %1 = icmp ult i16 %a, %b
242   %2 = zext i1 %1 to i16
243   ret i16 %2
246 define i16 @xor(i16 %a, i16 %b) nounwind {
247 ; RV32I-LABEL: xor:
248 ; RV32I:       # %bb.0:
249 ; RV32I-NEXT:    xor a0, a0, a1
250 ; RV32I-NEXT:    ret
252 ; RV64I-LABEL: xor:
253 ; RV64I:       # %bb.0:
254 ; RV64I-NEXT:    xor a0, a0, a1
255 ; RV64I-NEXT:    ret
256   %1 = xor i16 %a, %b
257   ret i16 %1
260 define i16 @srl(i16 %a, i16 %b) nounwind {
261 ; RV32I-LABEL: srl:
262 ; RV32I:       # %bb.0:
263 ; RV32I-NEXT:    lui a2, 16
264 ; RV32I-NEXT:    addi a2, a2, -1
265 ; RV32I-NEXT:    and a0, a0, a2
266 ; RV32I-NEXT:    srl a0, a0, a1
267 ; RV32I-NEXT:    ret
269 ; RV64I-LABEL: srl:
270 ; RV64I:       # %bb.0:
271 ; RV64I-NEXT:    lui a2, 16
272 ; RV64I-NEXT:    addiw a2, a2, -1
273 ; RV64I-NEXT:    and a0, a0, a2
274 ; RV64I-NEXT:    srl a0, a0, a1
275 ; RV64I-NEXT:    ret
276   %1 = lshr i16 %a, %b
277   ret i16 %1
280 define i16 @sra(i16 %a, i16 %b) nounwind {
281 ; RV32I-LABEL: sra:
282 ; RV32I:       # %bb.0:
283 ; RV32I-NEXT:    slli a0, a0, 16
284 ; RV32I-NEXT:    srai a0, a0, 16
285 ; RV32I-NEXT:    sra a0, a0, a1
286 ; RV32I-NEXT:    ret
288 ; RV64I-LABEL: sra:
289 ; RV64I:       # %bb.0:
290 ; RV64I-NEXT:    slli a0, a0, 48
291 ; RV64I-NEXT:    srai a0, a0, 48
292 ; RV64I-NEXT:    sra a0, a0, a1
293 ; RV64I-NEXT:    ret
294   %1 = ashr i16 %a, %b
295   ret i16 %1
298 define i16 @or(i16 %a, i16 %b) nounwind {
299 ; RV32I-LABEL: or:
300 ; RV32I:       # %bb.0:
301 ; RV32I-NEXT:    or a0, a0, a1
302 ; RV32I-NEXT:    ret
304 ; RV64I-LABEL: or:
305 ; RV64I:       # %bb.0:
306 ; RV64I-NEXT:    or a0, a0, a1
307 ; RV64I-NEXT:    ret
308   %1 = or i16 %a, %b
309   ret i16 %1
312 define i16 @and(i16 %a, i16 %b) nounwind {
313 ; RV32I-LABEL: and:
314 ; RV32I:       # %bb.0:
315 ; RV32I-NEXT:    and a0, a0, a1
316 ; RV32I-NEXT:    ret
318 ; RV64I-LABEL: and:
319 ; RV64I:       # %bb.0:
320 ; RV64I-NEXT:    and a0, a0, a1
321 ; RV64I-NEXT:    ret
322   %1 = and i16 %a, %b
323   ret i16 %1