blob: 80bd2d2b20402c2712b7be68fb9791baab4f0c5b [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
Alex Bradburyffc435e2017-11-21 08:11:03 +00005define i8 @sext_i1_to_i8(i1 %a) {
Alex Bradburyffc435e2017-11-21 08:11:03 +00006; RV32I-LABEL: sext_i1_to_i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +00007; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +00008; RV32I-NEXT: andi a0, a0, 1
Alex Bradbury0c7b3642017-11-21 08:23:08 +00009; RV32I-NEXT: sub a0, zero, a0
Alex Bradburyffc435e2017-11-21 08:11:03 +000010; RV32I-NEXT: jalr zero, ra, 0
11 %1 = sext i1 %a to i8
12 ret i8 %1
13}
14
15define i16 @sext_i1_to_i16(i1 %a) {
Alex Bradburyffc435e2017-11-21 08:11:03 +000016; RV32I-LABEL: sext_i1_to_i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000017; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000018; RV32I-NEXT: andi a0, a0, 1
Alex Bradbury0c7b3642017-11-21 08:23:08 +000019; RV32I-NEXT: sub a0, zero, a0
Alex Bradburyffc435e2017-11-21 08:11:03 +000020; RV32I-NEXT: jalr zero, ra, 0
21 %1 = sext i1 %a to i16
22 ret i16 %1
23}
24
25define i32 @sext_i1_to_i32(i1 %a) {
Alex Bradburyffc435e2017-11-21 08:11:03 +000026; RV32I-LABEL: sext_i1_to_i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000027; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000028; RV32I-NEXT: andi a0, a0, 1
Alex Bradbury0c7b3642017-11-21 08:23:08 +000029; RV32I-NEXT: sub a0, zero, a0
Alex Bradburyffc435e2017-11-21 08:11:03 +000030; RV32I-NEXT: jalr zero, ra, 0
31 %1 = sext i1 %a to i32
32 ret i32 %1
33}
34
35define i64 @sext_i1_to_i64(i1 %a) {
Alex Bradburyffc435e2017-11-21 08:11:03 +000036; RV32I-LABEL: sext_i1_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000037; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000038; RV32I-NEXT: andi a0, a0, 1
Alex Bradbury0c7b3642017-11-21 08:23:08 +000039; RV32I-NEXT: sub a0, zero, a0
Alex Bradburyffc435e2017-11-21 08:11:03 +000040; RV32I-NEXT: addi a1, a0, 0
41; RV32I-NEXT: jalr zero, ra, 0
42 %1 = sext i1 %a to i64
43 ret i64 %1
44}
45
46define i16 @sext_i8_to_i16(i8 %a) {
47; RV32I-LABEL: sext_i8_to_i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000048; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000049; RV32I-NEXT: slli a0, a0, 24
50; RV32I-NEXT: srai a0, a0, 24
51; RV32I-NEXT: jalr zero, ra, 0
52 %1 = sext i8 %a to i16
53 ret i16 %1
54}
55
56define i32 @sext_i8_to_i32(i8 %a) {
57; RV32I-LABEL: sext_i8_to_i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000058; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000059; RV32I-NEXT: slli a0, a0, 24
60; RV32I-NEXT: srai a0, a0, 24
61; RV32I-NEXT: jalr zero, ra, 0
62 %1 = sext i8 %a to i32
63 ret i32 %1
64}
65
66define i64 @sext_i8_to_i64(i8 %a) {
67; RV32I-LABEL: sext_i8_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000068; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000069; RV32I-NEXT: slli a1, a0, 24
70; RV32I-NEXT: srai a0, a1, 24
71; RV32I-NEXT: srai a1, a1, 31
72; RV32I-NEXT: jalr zero, ra, 0
73 %1 = sext i8 %a to i64
74 ret i64 %1
75}
76
77define i32 @sext_i16_to_i32(i16 %a) {
78; RV32I-LABEL: sext_i16_to_i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000079; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000080; RV32I-NEXT: slli a0, a0, 16
81; RV32I-NEXT: srai a0, a0, 16
82; RV32I-NEXT: jalr zero, ra, 0
83 %1 = sext i16 %a to i32
84 ret i32 %1
85}
86
87define i64 @sext_i16_to_i64(i16 %a) {
88; RV32I-LABEL: sext_i16_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000089; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +000090; RV32I-NEXT: slli a1, a0, 16
91; RV32I-NEXT: srai a0, a1, 16
92; RV32I-NEXT: srai a1, a1, 31
93; RV32I-NEXT: jalr zero, ra, 0
94 %1 = sext i16 %a to i64
95 ret i64 %1
96}
97
98define i64 @sext_i32_to_i64(i32 %a) {
99; RV32I-LABEL: sext_i32_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000100; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000101; RV32I-NEXT: srai a1, a0, 31
102; RV32I-NEXT: jalr zero, ra, 0
103 %1 = sext i32 %a to i64
104 ret i64 %1
105}
106
107define i8 @zext_i1_to_i8(i1 %a) {
108; RV32I-LABEL: zext_i1_to_i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000109; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000110; RV32I-NEXT: andi a0, a0, 1
111; RV32I-NEXT: jalr zero, ra, 0
112 %1 = zext i1 %a to i8
113 ret i8 %1
114}
115
116define i16 @zext_i1_to_i16(i1 %a) {
117; RV32I-LABEL: zext_i1_to_i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000118; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000119; RV32I-NEXT: andi a0, a0, 1
120; RV32I-NEXT: jalr zero, ra, 0
121 %1 = zext i1 %a to i16
122 ret i16 %1
123}
124
125define i32 @zext_i1_to_i32(i1 %a) {
126; RV32I-LABEL: zext_i1_to_i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000127; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000128; RV32I-NEXT: andi a0, a0, 1
129; RV32I-NEXT: jalr zero, ra, 0
130 %1 = zext i1 %a to i32
131 ret i32 %1
132}
133
134define i64 @zext_i1_to_i64(i1 %a) {
135; RV32I-LABEL: zext_i1_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000136; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000137; RV32I-NEXT: andi a0, a0, 1
138; RV32I-NEXT: addi a1, zero, 0
139; RV32I-NEXT: jalr zero, ra, 0
140 %1 = zext i1 %a to i64
141 ret i64 %1
142}
143
144define i16 @zext_i8_to_i16(i8 %a) {
145; RV32I-LABEL: zext_i8_to_i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000146; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000147; RV32I-NEXT: andi a0, a0, 255
148; RV32I-NEXT: jalr zero, ra, 0
149 %1 = zext i8 %a to i16
150 ret i16 %1
151}
152
153define i32 @zext_i8_to_i32(i8 %a) {
154; RV32I-LABEL: zext_i8_to_i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000155; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000156; RV32I-NEXT: andi a0, a0, 255
157; RV32I-NEXT: jalr zero, ra, 0
158 %1 = zext i8 %a to i32
159 ret i32 %1
160}
161
162define i64 @zext_i8_to_i64(i8 %a) {
163; RV32I-LABEL: zext_i8_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000164; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000165; RV32I-NEXT: andi a0, a0, 255
166; RV32I-NEXT: addi a1, zero, 0
167; RV32I-NEXT: jalr zero, ra, 0
168 %1 = zext i8 %a to i64
169 ret i64 %1
170}
171
172define i32 @zext_i16_to_i32(i16 %a) {
173; RV32I-LABEL: zext_i16_to_i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000174; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000175; RV32I-NEXT: lui a1, 16
176; RV32I-NEXT: addi a1, a1, -1
177; RV32I-NEXT: and a0, a0, a1
178; RV32I-NEXT: jalr zero, ra, 0
179 %1 = zext i16 %a to i32
180 ret i32 %1
181}
182
183define i64 @zext_i16_to_i64(i16 %a) {
184; RV32I-LABEL: zext_i16_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000185; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000186; RV32I-NEXT: lui a1, 16
187; RV32I-NEXT: addi a1, a1, -1
188; RV32I-NEXT: and a0, a0, a1
189; RV32I-NEXT: addi a1, zero, 0
190; RV32I-NEXT: jalr zero, ra, 0
191 %1 = zext i16 %a to i64
192 ret i64 %1
193}
194
195define i64 @zext_i32_to_i64(i32 %a) {
196; RV32I-LABEL: zext_i32_to_i64:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000197; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000198; RV32I-NEXT: addi a1, zero, 0
199; RV32I-NEXT: jalr zero, ra, 0
200 %1 = zext i32 %a to i64
201 ret i64 %1
202}
203
204; TODO: should the trunc tests explicitly ensure no code is generated before
205; jalr?
206
207define i1 @trunc_i8_to_i1(i8 %a) {
208; RV32I-LABEL: trunc_i8_to_i1:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000209; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000210; RV32I-NEXT: jalr zero, ra, 0
211 %1 = trunc i8 %a to i1
212 ret i1 %1
213}
214
215define i1 @trunc_i16_to_i1(i16 %a) {
216; RV32I-LABEL: trunc_i16_to_i1:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000217; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000218; RV32I-NEXT: jalr zero, ra, 0
219 %1 = trunc i16 %a to i1
220 ret i1 %1
221}
222
223define i1 @trunc_i32_to_i1(i32 %a) {
224; RV32I-LABEL: trunc_i32_to_i1:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000225; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000226; RV32I-NEXT: jalr zero, ra, 0
227 %1 = trunc i32 %a to i1
228 ret i1 %1
229}
230
231define i1 @trunc_i64_to_i1(i64 %a) {
232; RV32I-LABEL: trunc_i64_to_i1:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000233; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000234; RV32I-NEXT: jalr zero, ra, 0
235 %1 = trunc i64 %a to i1
236 ret i1 %1
237}
238
239define i8 @trunc_i16_to_i8(i16 %a) {
240; RV32I-LABEL: trunc_i16_to_i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000241; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000242; RV32I-NEXT: jalr zero, ra, 0
243 %1 = trunc i16 %a to i8
244 ret i8 %1
245}
246
247define i8 @trunc_i32_to_i8(i32 %a) {
248; RV32I-LABEL: trunc_i32_to_i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000249; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000250; RV32I-NEXT: jalr zero, ra, 0
251 %1 = trunc i32 %a to i8
252 ret i8 %1
253}
254
255define i8 @trunc_i64_to_i8(i64 %a) {
256; RV32I-LABEL: trunc_i64_to_i8:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000257; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000258; RV32I-NEXT: jalr zero, ra, 0
259 %1 = trunc i64 %a to i8
260 ret i8 %1
261}
262
263define i16 @trunc_i32_to_i16(i32 %a) {
264; RV32I-LABEL: trunc_i32_to_i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000265; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000266; RV32I-NEXT: jalr zero, ra, 0
267 %1 = trunc i32 %a to i16
268 ret i16 %1
269}
270
271define i16 @trunc_i64_to_i16(i64 %a) {
272; RV32I-LABEL: trunc_i64_to_i16:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000273; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000274; RV32I-NEXT: jalr zero, ra, 0
275 %1 = trunc i64 %a to i16
276 ret i16 %1
277}
278
279define i32 @trunc_i64_to_i32(i64 %a) {
280; RV32I-LABEL: trunc_i64_to_i32:
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +0000281; RV32I: # %bb.0:
Alex Bradburyffc435e2017-11-21 08:11:03 +0000282; RV32I-NEXT: jalr zero, ra, 0
283 %1 = trunc i64 %a to i32
284 ret i32 %1
285}