[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / RISCV / alu16.ll
blob23dc433baf4eaa2d7255af8b71af168c7b62e7da
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:    slli a0, a0, 16
125 ; RV32I-NEXT:    srli a0, a0, 22
126 ; RV32I-NEXT:    ret
128 ; RV64I-LABEL: srli:
129 ; RV64I:       # %bb.0:
130 ; RV64I-NEXT:    slli a0, a0, 48
131 ; RV64I-NEXT:    srli a0, a0, 54
132 ; RV64I-NEXT:    ret
133   %1 = lshr i16 %a, 6
134   ret i16 %1
137 define i16 @srai(i16 %a) nounwind {
138 ; RV32I-LABEL: srai:
139 ; RV32I:       # %bb.0:
140 ; RV32I-NEXT:    slli a0, a0, 16
141 ; RV32I-NEXT:    srai a0, a0, 25
142 ; RV32I-NEXT:    ret
144 ; RV64I-LABEL: srai:
145 ; RV64I:       # %bb.0:
146 ; RV64I-NEXT:    slli a0, a0, 48
147 ; RV64I-NEXT:    srai a0, a0, 57
148 ; RV64I-NEXT:    ret
149   %1 = ashr i16 %a, 9
150   ret i16 %1
154 define i16 @add(i16 %a, i16 %b) nounwind {
155 ; RV32I-LABEL: add:
156 ; RV32I:       # %bb.0:
157 ; RV32I-NEXT:    add a0, a0, a1
158 ; RV32I-NEXT:    ret
160 ; RV64I-LABEL: add:
161 ; RV64I:       # %bb.0:
162 ; RV64I-NEXT:    add a0, a0, a1
163 ; RV64I-NEXT:    ret
164   %1 = add i16 %a, %b
165   ret i16 %1
168 define i16 @sub(i16 %a, i16 %b) nounwind {
169 ; RV32I-LABEL: sub:
170 ; RV32I:       # %bb.0:
171 ; RV32I-NEXT:    sub a0, a0, a1
172 ; RV32I-NEXT:    ret
174 ; RV64I-LABEL: sub:
175 ; RV64I:       # %bb.0:
176 ; RV64I-NEXT:    sub a0, a0, a1
177 ; RV64I-NEXT:    ret
178   %1 = sub i16 %a, %b
179   ret i16 %1
182 define i16 @sll(i16 %a, i16 %b) nounwind {
183 ; RV32I-LABEL: sll:
184 ; RV32I:       # %bb.0:
185 ; RV32I-NEXT:    sll a0, a0, a1
186 ; RV32I-NEXT:    ret
188 ; RV64I-LABEL: sll:
189 ; RV64I:       # %bb.0:
190 ; RV64I-NEXT:    sll a0, a0, a1
191 ; RV64I-NEXT:    ret
192   %1 = shl i16 %a, %b
193   ret i16 %1
196 define i16 @slt(i16 %a, i16 %b) nounwind {
197 ; RV32I-LABEL: slt:
198 ; RV32I:       # %bb.0:
199 ; RV32I-NEXT:    slli a1, a1, 16
200 ; RV32I-NEXT:    srai a1, a1, 16
201 ; RV32I-NEXT:    slli a0, a0, 16
202 ; RV32I-NEXT:    srai a0, a0, 16
203 ; RV32I-NEXT:    slt a0, a0, a1
204 ; RV32I-NEXT:    ret
206 ; RV64I-LABEL: slt:
207 ; RV64I:       # %bb.0:
208 ; RV64I-NEXT:    slli a1, a1, 48
209 ; RV64I-NEXT:    srai a1, a1, 48
210 ; RV64I-NEXT:    slli a0, a0, 48
211 ; RV64I-NEXT:    srai a0, a0, 48
212 ; RV64I-NEXT:    slt a0, a0, a1
213 ; RV64I-NEXT:    ret
214   %1 = icmp slt i16 %a, %b
215   %2 = zext i1 %1 to i16
216   ret i16 %2
219 define i16 @sltu(i16 %a, i16 %b) nounwind {
220 ; RV32I-LABEL: sltu:
221 ; RV32I:       # %bb.0:
222 ; RV32I-NEXT:    lui a2, 16
223 ; RV32I-NEXT:    addi a2, a2, -1
224 ; RV32I-NEXT:    and a1, a1, a2
225 ; RV32I-NEXT:    and a0, a0, a2
226 ; RV32I-NEXT:    sltu a0, a0, a1
227 ; RV32I-NEXT:    ret
229 ; RV64I-LABEL: sltu:
230 ; RV64I:       # %bb.0:
231 ; RV64I-NEXT:    lui a2, 16
232 ; RV64I-NEXT:    addiw a2, a2, -1
233 ; RV64I-NEXT:    and a1, a1, a2
234 ; RV64I-NEXT:    and a0, a0, a2
235 ; RV64I-NEXT:    sltu a0, a0, a1
236 ; RV64I-NEXT:    ret
237   %1 = icmp ult i16 %a, %b
238   %2 = zext i1 %1 to i16
239   ret i16 %2
242 define i16 @xor(i16 %a, i16 %b) nounwind {
243 ; RV32I-LABEL: xor:
244 ; RV32I:       # %bb.0:
245 ; RV32I-NEXT:    xor a0, a0, a1
246 ; RV32I-NEXT:    ret
248 ; RV64I-LABEL: xor:
249 ; RV64I:       # %bb.0:
250 ; RV64I-NEXT:    xor a0, a0, a1
251 ; RV64I-NEXT:    ret
252   %1 = xor i16 %a, %b
253   ret i16 %1
256 define i16 @srl(i16 %a, i16 %b) nounwind {
257 ; RV32I-LABEL: srl:
258 ; RV32I:       # %bb.0:
259 ; RV32I-NEXT:    lui a2, 16
260 ; RV32I-NEXT:    addi a2, a2, -1
261 ; RV32I-NEXT:    and a0, a0, a2
262 ; RV32I-NEXT:    srl a0, a0, a1
263 ; RV32I-NEXT:    ret
265 ; RV64I-LABEL: srl:
266 ; RV64I:       # %bb.0:
267 ; RV64I-NEXT:    lui a2, 16
268 ; RV64I-NEXT:    addiw a2, a2, -1
269 ; RV64I-NEXT:    and a0, a0, a2
270 ; RV64I-NEXT:    srl a0, a0, a1
271 ; RV64I-NEXT:    ret
272   %1 = lshr i16 %a, %b
273   ret i16 %1
276 define i16 @sra(i16 %a, i16 %b) nounwind {
277 ; RV32I-LABEL: sra:
278 ; RV32I:       # %bb.0:
279 ; RV32I-NEXT:    slli a0, a0, 16
280 ; RV32I-NEXT:    srai a0, a0, 16
281 ; RV32I-NEXT:    sra a0, a0, a1
282 ; RV32I-NEXT:    ret
284 ; RV64I-LABEL: sra:
285 ; RV64I:       # %bb.0:
286 ; RV64I-NEXT:    slli a0, a0, 48
287 ; RV64I-NEXT:    srai a0, a0, 48
288 ; RV64I-NEXT:    sra a0, a0, a1
289 ; RV64I-NEXT:    ret
290   %1 = ashr i16 %a, %b
291   ret i16 %1
294 define i16 @or(i16 %a, i16 %b) nounwind {
295 ; RV32I-LABEL: or:
296 ; RV32I:       # %bb.0:
297 ; RV32I-NEXT:    or a0, a0, a1
298 ; RV32I-NEXT:    ret
300 ; RV64I-LABEL: or:
301 ; RV64I:       # %bb.0:
302 ; RV64I-NEXT:    or a0, a0, a1
303 ; RV64I-NEXT:    ret
304   %1 = or i16 %a, %b
305   ret i16 %1
308 define i16 @and(i16 %a, i16 %b) nounwind {
309 ; RV32I-LABEL: and:
310 ; RV32I:       # %bb.0:
311 ; RV32I-NEXT:    and a0, a0, a1
312 ; RV32I-NEXT:    ret
314 ; RV64I-LABEL: and:
315 ; RV64I:       # %bb.0:
316 ; RV64I-NEXT:    and a0, a0, a1
317 ; RV64I-NEXT:    ret
318   %1 = and i16 %a, %b
319   ret i16 %1