[ARM] Split large truncating MVE stores
[llvm-complete.git] / test / CodeGen / RISCV / alu8.ll
blobed09174745b88357496d465ad17569bb70fd67a2
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 i8. They check
8 ; that legalisation of these non-native types doesn't introduce unnecessary
9 ; inefficiencies.
11 define i8 @addi(i8 %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 i8 %a, 1
22   ret i8 %1
25 define i8 @slti(i8 %a) nounwind {
26 ; RV32I-LABEL: slti:
27 ; RV32I:       # %bb.0:
28 ; RV32I-NEXT:    slli a0, a0, 24
29 ; RV32I-NEXT:    srai a0, a0, 24
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, 56
36 ; RV64I-NEXT:    srai a0, a0, 56
37 ; RV64I-NEXT:    slti a0, a0, 2
38 ; RV64I-NEXT:    ret
39   %1 = icmp slt i8 %a, 2
40   %2 = zext i1 %1 to i8
41   ret i8 %2
44 define i8 @sltiu(i8 %a) nounwind {
45 ; RV32I-LABEL: sltiu:
46 ; RV32I:       # %bb.0:
47 ; RV32I-NEXT:    andi a0, a0, 255
48 ; RV32I-NEXT:    sltiu a0, a0, 3
49 ; RV32I-NEXT:    ret
51 ; RV64I-LABEL: sltiu:
52 ; RV64I:       # %bb.0:
53 ; RV64I-NEXT:    andi a0, a0, 255
54 ; RV64I-NEXT:    sltiu a0, a0, 3
55 ; RV64I-NEXT:    ret
56   %1 = icmp ult i8 %a, 3
57   %2 = zext i1 %1 to i8
58   ret i8 %2
61 define i8 @xori(i8 %a) nounwind {
62 ; RV32I-LABEL: xori:
63 ; RV32I:       # %bb.0:
64 ; RV32I-NEXT:    xori a0, a0, 4
65 ; RV32I-NEXT:    ret
67 ; RV64I-LABEL: xori:
68 ; RV64I:       # %bb.0:
69 ; RV64I-NEXT:    xori a0, a0, 4
70 ; RV64I-NEXT:    ret
71   %1 = xor i8 %a, 4
72   ret i8 %1
75 define i8 @ori(i8 %a) nounwind {
76 ; RV32I-LABEL: ori:
77 ; RV32I:       # %bb.0:
78 ; RV32I-NEXT:    ori a0, a0, 5
79 ; RV32I-NEXT:    ret
81 ; RV64I-LABEL: ori:
82 ; RV64I:       # %bb.0:
83 ; RV64I-NEXT:    ori a0, a0, 5
84 ; RV64I-NEXT:    ret
85   %1 = or i8 %a, 5
86   ret i8 %1
89 define i8 @andi(i8 %a) nounwind {
90 ; RV32I-LABEL: andi:
91 ; RV32I:       # %bb.0:
92 ; RV32I-NEXT:    andi a0, a0, 6
93 ; RV32I-NEXT:    ret
95 ; RV64I-LABEL: andi:
96 ; RV64I:       # %bb.0:
97 ; RV64I-NEXT:    andi a0, a0, 6
98 ; RV64I-NEXT:    ret
99   %1 = and i8 %a, 6
100   ret i8 %1
103 define i8 @slli(i8 %a) nounwind {
104 ; RV32I-LABEL: slli:
105 ; RV32I:       # %bb.0:
106 ; RV32I-NEXT:    slli a0, a0, 7
107 ; RV32I-NEXT:    ret
109 ; RV64I-LABEL: slli:
110 ; RV64I:       # %bb.0:
111 ; RV64I-NEXT:    slli a0, a0, 7
112 ; RV64I-NEXT:    ret
113   %1 = shl i8 %a, 7
114   ret i8 %1
117 define i8 @srli(i8 %a) nounwind {
118 ; RV32I-LABEL: srli:
119 ; RV32I:       # %bb.0:
120 ; RV32I-NEXT:    andi a0, a0, 192
121 ; RV32I-NEXT:    srli a0, a0, 6
122 ; RV32I-NEXT:    ret
124 ; RV64I-LABEL: srli:
125 ; RV64I:       # %bb.0:
126 ; RV64I-NEXT:    andi a0, a0, 192
127 ; RV64I-NEXT:    srli a0, a0, 6
128 ; RV64I-NEXT:    ret
129   %1 = lshr i8 %a, 6
130   ret i8 %1
133 define i8 @srai(i8 %a) nounwind {
134 ; RV32I-LABEL: srai:
135 ; RV32I:       # %bb.0:
136 ; RV32I-NEXT:    slli a0, a0, 24
137 ; RV32I-NEXT:    srai a0, a0, 29
138 ; RV32I-NEXT:    ret
140 ; RV64I-LABEL: srai:
141 ; RV64I:       # %bb.0:
142 ; RV64I-NEXT:    slli a0, a0, 56
143 ; RV64I-NEXT:    srai a0, a0, 61
144 ; RV64I-NEXT:    ret
145   %1 = ashr i8 %a, 5
146   ret i8 %1
150 define i8 @add(i8 %a, i8 %b) nounwind {
151 ; RV32I-LABEL: add:
152 ; RV32I:       # %bb.0:
153 ; RV32I-NEXT:    add a0, a0, a1
154 ; RV32I-NEXT:    ret
156 ; RV64I-LABEL: add:
157 ; RV64I:       # %bb.0:
158 ; RV64I-NEXT:    add a0, a0, a1
159 ; RV64I-NEXT:    ret
160   %1 = add i8 %a, %b
161   ret i8 %1
164 define i8 @sub(i8 %a, i8 %b) nounwind {
165 ; RV32I-LABEL: sub:
166 ; RV32I:       # %bb.0:
167 ; RV32I-NEXT:    sub a0, a0, a1
168 ; RV32I-NEXT:    ret
170 ; RV64I-LABEL: sub:
171 ; RV64I:       # %bb.0:
172 ; RV64I-NEXT:    sub a0, a0, a1
173 ; RV64I-NEXT:    ret
174   %1 = sub i8 %a, %b
175   ret i8 %1
178 define i8 @sll(i8 %a, i8 %b) nounwind {
179 ; RV32I-LABEL: sll:
180 ; RV32I:       # %bb.0:
181 ; RV32I-NEXT:    sll a0, a0, a1
182 ; RV32I-NEXT:    ret
184 ; RV64I-LABEL: sll:
185 ; RV64I:       # %bb.0:
186 ; RV64I-NEXT:    sll a0, a0, a1
187 ; RV64I-NEXT:    ret
188   %1 = shl i8 %a, %b
189   ret i8 %1
192 define i8 @slt(i8 %a, i8 %b) nounwind {
193 ; RV32I-LABEL: slt:
194 ; RV32I:       # %bb.0:
195 ; RV32I-NEXT:    slli a1, a1, 24
196 ; RV32I-NEXT:    srai a1, a1, 24
197 ; RV32I-NEXT:    slli a0, a0, 24
198 ; RV32I-NEXT:    srai a0, a0, 24
199 ; RV32I-NEXT:    slt a0, a0, a1
200 ; RV32I-NEXT:    ret
202 ; RV64I-LABEL: slt:
203 ; RV64I:       # %bb.0:
204 ; RV64I-NEXT:    slli a1, a1, 56
205 ; RV64I-NEXT:    srai a1, a1, 56
206 ; RV64I-NEXT:    slli a0, a0, 56
207 ; RV64I-NEXT:    srai a0, a0, 56
208 ; RV64I-NEXT:    slt a0, a0, a1
209 ; RV64I-NEXT:    ret
210   %1 = icmp slt i8 %a, %b
211   %2 = zext i1 %1 to i8
212   ret i8 %2
215 define i8 @sltu(i8 %a, i8 %b) nounwind {
216 ; RV32I-LABEL: sltu:
217 ; RV32I:       # %bb.0:
218 ; RV32I-NEXT:    andi a1, a1, 255
219 ; RV32I-NEXT:    andi a0, a0, 255
220 ; RV32I-NEXT:    sltu a0, a0, a1
221 ; RV32I-NEXT:    ret
223 ; RV64I-LABEL: sltu:
224 ; RV64I:       # %bb.0:
225 ; RV64I-NEXT:    andi a1, a1, 255
226 ; RV64I-NEXT:    andi a0, a0, 255
227 ; RV64I-NEXT:    sltu a0, a0, a1
228 ; RV64I-NEXT:    ret
229   %1 = icmp ult i8 %a, %b
230   %2 = zext i1 %1 to i8
231   ret i8 %2
234 define i8 @xor(i8 %a, i8 %b) nounwind {
235 ; RV32I-LABEL: xor:
236 ; RV32I:       # %bb.0:
237 ; RV32I-NEXT:    xor a0, a0, a1
238 ; RV32I-NEXT:    ret
240 ; RV64I-LABEL: xor:
241 ; RV64I:       # %bb.0:
242 ; RV64I-NEXT:    xor a0, a0, a1
243 ; RV64I-NEXT:    ret
244   %1 = xor i8 %a, %b
245   ret i8 %1
248 define i8 @srl(i8 %a, i8 %b) nounwind {
249 ; RV32I-LABEL: srl:
250 ; RV32I:       # %bb.0:
251 ; RV32I-NEXT:    andi a0, a0, 255
252 ; RV32I-NEXT:    srl a0, a0, a1
253 ; RV32I-NEXT:    ret
255 ; RV64I-LABEL: srl:
256 ; RV64I:       # %bb.0:
257 ; RV64I-NEXT:    andi a0, a0, 255
258 ; RV64I-NEXT:    srl a0, a0, a1
259 ; RV64I-NEXT:    ret
260   %1 = lshr i8 %a, %b
261   ret i8 %1
264 define i8 @sra(i8 %a, i8 %b) nounwind {
265 ; RV32I-LABEL: sra:
266 ; RV32I:       # %bb.0:
267 ; RV32I-NEXT:    slli a0, a0, 24
268 ; RV32I-NEXT:    srai a0, a0, 24
269 ; RV32I-NEXT:    sra a0, a0, a1
270 ; RV32I-NEXT:    ret
272 ; RV64I-LABEL: sra:
273 ; RV64I:       # %bb.0:
274 ; RV64I-NEXT:    slli a0, a0, 56
275 ; RV64I-NEXT:    srai a0, a0, 56
276 ; RV64I-NEXT:    sra a0, a0, a1
277 ; RV64I-NEXT:    ret
278   %1 = ashr i8 %a, %b
279   ret i8 %1
282 define i8 @or(i8 %a, i8 %b) nounwind {
283 ; RV32I-LABEL: or:
284 ; RV32I:       # %bb.0:
285 ; RV32I-NEXT:    or a0, a0, a1
286 ; RV32I-NEXT:    ret
288 ; RV64I-LABEL: or:
289 ; RV64I:       # %bb.0:
290 ; RV64I-NEXT:    or a0, a0, a1
291 ; RV64I-NEXT:    ret
292   %1 = or i8 %a, %b
293   ret i8 %1
296 define i8 @and(i8 %a, i8 %b) nounwind {
297 ; RV32I-LABEL: and:
298 ; RV32I:       # %bb.0:
299 ; RV32I-NEXT:    and a0, a0, a1
300 ; RV32I-NEXT:    ret
302 ; RV64I-LABEL: and:
303 ; RV64I:       # %bb.0:
304 ; RV64I-NEXT:    and a0, a0, a1
305 ; RV64I-NEXT:    ret
306   %1 = and i8 %a, %b
307   ret i8 %1