blob: 1855d55b4dfef9c1878da4d9d56cffb73a69416d [file] [log] [blame]
Alex Bradburyffc435e2017-11-21 08:11:03 +00001; 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
5; FIXME: an unncessary register is allocated just to store 0. X0 should be
6; used instead
7
8define i8 @sext_i1_to_i8(i1 %a) {
9; TODO: the addi that stores 0 in t1 is unnecessary
10; RV32I-LABEL: sext_i1_to_i8:
11; RV32I: # BB#0:
12; RV32I-NEXT: andi a0, a0, 1
13; RV32I-NEXT: addi a1, zero, 0
14; RV32I-NEXT: sub a0, a1, a0
15; RV32I-NEXT: jalr zero, ra, 0
16 %1 = sext i1 %a to i8
17 ret i8 %1
18}
19
20define i16 @sext_i1_to_i16(i1 %a) {
21; TODO: the addi that stores 0 in t1 is unnecessary
22; RV32I-LABEL: sext_i1_to_i16:
23; RV32I: # BB#0:
24; RV32I-NEXT: andi a0, a0, 1
25; RV32I-NEXT: addi a1, zero, 0
26; RV32I-NEXT: sub a0, a1, a0
27; RV32I-NEXT: jalr zero, ra, 0
28 %1 = sext i1 %a to i16
29 ret i16 %1
30}
31
32define i32 @sext_i1_to_i32(i1 %a) {
33; TODO: the addi that stores 0 in t1 is unnecessary
34; RV32I-LABEL: sext_i1_to_i32:
35; RV32I: # BB#0:
36; RV32I-NEXT: andi a0, a0, 1
37; RV32I-NEXT: addi a1, zero, 0
38; RV32I-NEXT: sub a0, a1, a0
39; RV32I-NEXT: jalr zero, ra, 0
40 %1 = sext i1 %a to i32
41 ret i32 %1
42}
43
44define i64 @sext_i1_to_i64(i1 %a) {
45; TODO: the addi that stores 0 in t1 is unnecessary
46; RV32I-LABEL: sext_i1_to_i64:
47; RV32I: # BB#0:
48; RV32I-NEXT: andi a0, a0, 1
49; RV32I-NEXT: addi a1, zero, 0
50; RV32I-NEXT: sub a0, a1, a0
51; RV32I-NEXT: addi a1, a0, 0
52; RV32I-NEXT: jalr zero, ra, 0
53 %1 = sext i1 %a to i64
54 ret i64 %1
55}
56
57define i16 @sext_i8_to_i16(i8 %a) {
58; RV32I-LABEL: sext_i8_to_i16:
59; RV32I: # BB#0:
60; RV32I-NEXT: slli a0, a0, 24
61; RV32I-NEXT: srai a0, a0, 24
62; RV32I-NEXT: jalr zero, ra, 0
63 %1 = sext i8 %a to i16
64 ret i16 %1
65}
66
67define i32 @sext_i8_to_i32(i8 %a) {
68; RV32I-LABEL: sext_i8_to_i32:
69; RV32I: # BB#0:
70; RV32I-NEXT: slli a0, a0, 24
71; RV32I-NEXT: srai a0, a0, 24
72; RV32I-NEXT: jalr zero, ra, 0
73 %1 = sext i8 %a to i32
74 ret i32 %1
75}
76
77define i64 @sext_i8_to_i64(i8 %a) {
78; RV32I-LABEL: sext_i8_to_i64:
79; RV32I: # BB#0:
80; RV32I-NEXT: slli a1, a0, 24
81; RV32I-NEXT: srai a0, a1, 24
82; RV32I-NEXT: srai a1, a1, 31
83; RV32I-NEXT: jalr zero, ra, 0
84 %1 = sext i8 %a to i64
85 ret i64 %1
86}
87
88define i32 @sext_i16_to_i32(i16 %a) {
89; RV32I-LABEL: sext_i16_to_i32:
90; RV32I: # BB#0:
91; RV32I-NEXT: slli a0, a0, 16
92; RV32I-NEXT: srai a0, a0, 16
93; RV32I-NEXT: jalr zero, ra, 0
94 %1 = sext i16 %a to i32
95 ret i32 %1
96}
97
98define i64 @sext_i16_to_i64(i16 %a) {
99; RV32I-LABEL: sext_i16_to_i64:
100; RV32I: # BB#0:
101; RV32I-NEXT: slli a1, a0, 16
102; RV32I-NEXT: srai a0, a1, 16
103; RV32I-NEXT: srai a1, a1, 31
104; RV32I-NEXT: jalr zero, ra, 0
105 %1 = sext i16 %a to i64
106 ret i64 %1
107}
108
109define i64 @sext_i32_to_i64(i32 %a) {
110; RV32I-LABEL: sext_i32_to_i64:
111; RV32I: # BB#0:
112; RV32I-NEXT: srai a1, a0, 31
113; RV32I-NEXT: jalr zero, ra, 0
114 %1 = sext i32 %a to i64
115 ret i64 %1
116}
117
118define i8 @zext_i1_to_i8(i1 %a) {
119; RV32I-LABEL: zext_i1_to_i8:
120; RV32I: # BB#0:
121; RV32I-NEXT: andi a0, a0, 1
122; RV32I-NEXT: jalr zero, ra, 0
123 %1 = zext i1 %a to i8
124 ret i8 %1
125}
126
127define i16 @zext_i1_to_i16(i1 %a) {
128; RV32I-LABEL: zext_i1_to_i16:
129; RV32I: # BB#0:
130; RV32I-NEXT: andi a0, a0, 1
131; RV32I-NEXT: jalr zero, ra, 0
132 %1 = zext i1 %a to i16
133 ret i16 %1
134}
135
136define i32 @zext_i1_to_i32(i1 %a) {
137; RV32I-LABEL: zext_i1_to_i32:
138; RV32I: # BB#0:
139; RV32I-NEXT: andi a0, a0, 1
140; RV32I-NEXT: jalr zero, ra, 0
141 %1 = zext i1 %a to i32
142 ret i32 %1
143}
144
145define i64 @zext_i1_to_i64(i1 %a) {
146; RV32I-LABEL: zext_i1_to_i64:
147; RV32I: # BB#0:
148; RV32I-NEXT: andi a0, a0, 1
149; RV32I-NEXT: addi a1, zero, 0
150; RV32I-NEXT: jalr zero, ra, 0
151 %1 = zext i1 %a to i64
152 ret i64 %1
153}
154
155define i16 @zext_i8_to_i16(i8 %a) {
156; RV32I-LABEL: zext_i8_to_i16:
157; RV32I: # BB#0:
158; RV32I-NEXT: andi a0, a0, 255
159; RV32I-NEXT: jalr zero, ra, 0
160 %1 = zext i8 %a to i16
161 ret i16 %1
162}
163
164define i32 @zext_i8_to_i32(i8 %a) {
165; RV32I-LABEL: zext_i8_to_i32:
166; RV32I: # BB#0:
167; RV32I-NEXT: andi a0, a0, 255
168; RV32I-NEXT: jalr zero, ra, 0
169 %1 = zext i8 %a to i32
170 ret i32 %1
171}
172
173define i64 @zext_i8_to_i64(i8 %a) {
174; RV32I-LABEL: zext_i8_to_i64:
175; RV32I: # BB#0:
176; RV32I-NEXT: andi a0, a0, 255
177; RV32I-NEXT: addi a1, zero, 0
178; RV32I-NEXT: jalr zero, ra, 0
179 %1 = zext i8 %a to i64
180 ret i64 %1
181}
182
183define i32 @zext_i16_to_i32(i16 %a) {
184; RV32I-LABEL: zext_i16_to_i32:
185; RV32I: # BB#0:
186; RV32I-NEXT: lui a1, 16
187; RV32I-NEXT: addi a1, a1, -1
188; RV32I-NEXT: and a0, a0, a1
189; RV32I-NEXT: jalr zero, ra, 0
190 %1 = zext i16 %a to i32
191 ret i32 %1
192}
193
194define i64 @zext_i16_to_i64(i16 %a) {
195; RV32I-LABEL: zext_i16_to_i64:
196; RV32I: # BB#0:
197; RV32I-NEXT: lui a1, 16
198; RV32I-NEXT: addi a1, a1, -1
199; RV32I-NEXT: and a0, a0, a1
200; RV32I-NEXT: addi a1, zero, 0
201; RV32I-NEXT: jalr zero, ra, 0
202 %1 = zext i16 %a to i64
203 ret i64 %1
204}
205
206define i64 @zext_i32_to_i64(i32 %a) {
207; RV32I-LABEL: zext_i32_to_i64:
208; RV32I: # BB#0:
209; RV32I-NEXT: addi a1, zero, 0
210; RV32I-NEXT: jalr zero, ra, 0
211 %1 = zext i32 %a to i64
212 ret i64 %1
213}
214
215; TODO: should the trunc tests explicitly ensure no code is generated before
216; jalr?
217
218define i1 @trunc_i8_to_i1(i8 %a) {
219; RV32I-LABEL: trunc_i8_to_i1:
220; RV32I: # BB#0:
221; RV32I-NEXT: jalr zero, ra, 0
222 %1 = trunc i8 %a to i1
223 ret i1 %1
224}
225
226define i1 @trunc_i16_to_i1(i16 %a) {
227; RV32I-LABEL: trunc_i16_to_i1:
228; RV32I: # BB#0:
229; RV32I-NEXT: jalr zero, ra, 0
230 %1 = trunc i16 %a to i1
231 ret i1 %1
232}
233
234define i1 @trunc_i32_to_i1(i32 %a) {
235; RV32I-LABEL: trunc_i32_to_i1:
236; RV32I: # BB#0:
237; RV32I-NEXT: jalr zero, ra, 0
238 %1 = trunc i32 %a to i1
239 ret i1 %1
240}
241
242define i1 @trunc_i64_to_i1(i64 %a) {
243; RV32I-LABEL: trunc_i64_to_i1:
244; RV32I: # BB#0:
245; RV32I-NEXT: jalr zero, ra, 0
246 %1 = trunc i64 %a to i1
247 ret i1 %1
248}
249
250define i8 @trunc_i16_to_i8(i16 %a) {
251; RV32I-LABEL: trunc_i16_to_i8:
252; RV32I: # BB#0:
253; RV32I-NEXT: jalr zero, ra, 0
254 %1 = trunc i16 %a to i8
255 ret i8 %1
256}
257
258define i8 @trunc_i32_to_i8(i32 %a) {
259; RV32I-LABEL: trunc_i32_to_i8:
260; RV32I: # BB#0:
261; RV32I-NEXT: jalr zero, ra, 0
262 %1 = trunc i32 %a to i8
263 ret i8 %1
264}
265
266define i8 @trunc_i64_to_i8(i64 %a) {
267; RV32I-LABEL: trunc_i64_to_i8:
268; RV32I: # BB#0:
269; RV32I-NEXT: jalr zero, ra, 0
270 %1 = trunc i64 %a to i8
271 ret i8 %1
272}
273
274define i16 @trunc_i32_to_i16(i32 %a) {
275; RV32I-LABEL: trunc_i32_to_i16:
276; RV32I: # BB#0:
277; RV32I-NEXT: jalr zero, ra, 0
278 %1 = trunc i32 %a to i16
279 ret i16 %1
280}
281
282define i16 @trunc_i64_to_i16(i64 %a) {
283; RV32I-LABEL: trunc_i64_to_i16:
284; RV32I: # BB#0:
285; RV32I-NEXT: jalr zero, ra, 0
286 %1 = trunc i64 %a to i16
287 ret i16 %1
288}
289
290define i32 @trunc_i64_to_i32(i64 %a) {
291; RV32I-LABEL: trunc_i64_to_i32:
292; RV32I: # BB#0:
293; RV32I-NEXT: jalr zero, ra, 0
294 %1 = trunc i64 %a to i32
295 ret i32 %1
296}