[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / RISCV / imm.ll
blobce254f2b1265df5579f5389061b66657658d269c
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 ; Materializing constants
9 ; TODO: It would be preferable if anyext constant returns were sign rather
10 ; than zero extended. See PR39092. For now, mark returns as explicitly signext
11 ; (this matches what Clang would generate for equivalent C/C++ anyway).
13 define signext i32 @zero() nounwind {
14 ; RV32I-LABEL: zero:
15 ; RV32I:       # %bb.0:
16 ; RV32I-NEXT:    mv a0, zero
17 ; RV32I-NEXT:    ret
19 ; RV64I-LABEL: zero:
20 ; RV64I:       # %bb.0:
21 ; RV64I-NEXT:    mv a0, zero
22 ; RV64I-NEXT:    ret
23   ret i32 0
26 define signext i32 @pos_small() nounwind {
27 ; RV32I-LABEL: pos_small:
28 ; RV32I:       # %bb.0:
29 ; RV32I-NEXT:    addi a0, zero, 2047
30 ; RV32I-NEXT:    ret
32 ; RV64I-LABEL: pos_small:
33 ; RV64I:       # %bb.0:
34 ; RV64I-NEXT:    addi a0, zero, 2047
35 ; RV64I-NEXT:    ret
36   ret i32 2047
39 define signext i32 @neg_small() nounwind {
40 ; RV32I-LABEL: neg_small:
41 ; RV32I:       # %bb.0:
42 ; RV32I-NEXT:    addi a0, zero, -2048
43 ; RV32I-NEXT:    ret
45 ; RV64I-LABEL: neg_small:
46 ; RV64I:       # %bb.0:
47 ; RV64I-NEXT:    addi a0, zero, -2048
48 ; RV64I-NEXT:    ret
49   ret i32 -2048
52 define signext i32 @pos_i32() nounwind {
53 ; RV32I-LABEL: pos_i32:
54 ; RV32I:       # %bb.0:
55 ; RV32I-NEXT:    lui a0, 423811
56 ; RV32I-NEXT:    addi a0, a0, -1297
57 ; RV32I-NEXT:    ret
59 ; RV64I-LABEL: pos_i32:
60 ; RV64I:       # %bb.0:
61 ; RV64I-NEXT:    lui a0, 423811
62 ; RV64I-NEXT:    addiw a0, a0, -1297
63 ; RV64I-NEXT:    ret
64   ret i32 1735928559
67 define signext i32 @neg_i32() nounwind {
68 ; RV32I-LABEL: neg_i32:
69 ; RV32I:       # %bb.0:
70 ; RV32I-NEXT:    lui a0, 912092
71 ; RV32I-NEXT:    addi a0, a0, -273
72 ; RV32I-NEXT:    ret
74 ; RV64I-LABEL: neg_i32:
75 ; RV64I:       # %bb.0:
76 ; RV64I-NEXT:    lui a0, 912092
77 ; RV64I-NEXT:    addiw a0, a0, -273
78 ; RV64I-NEXT:    ret
79   ret i32 -559038737
82 define signext i32 @pos_i32_hi20_only() nounwind {
83 ; RV32I-LABEL: pos_i32_hi20_only:
84 ; RV32I:       # %bb.0:
85 ; RV32I-NEXT:    lui a0, 16
86 ; RV32I-NEXT:    ret
88 ; RV64I-LABEL: pos_i32_hi20_only:
89 ; RV64I:       # %bb.0:
90 ; RV64I-NEXT:    lui a0, 16
91 ; RV64I-NEXT:    ret
92   ret i32 65536
95 define signext i32 @neg_i32_hi20_only() nounwind {
96 ; RV32I-LABEL: neg_i32_hi20_only:
97 ; RV32I:       # %bb.0:
98 ; RV32I-NEXT:    lui a0, 1048560
99 ; RV32I-NEXT:    ret
101 ; RV64I-LABEL: neg_i32_hi20_only:
102 ; RV64I:       # %bb.0:
103 ; RV64I-NEXT:    lui a0, 1048560
104 ; RV64I-NEXT:    ret
105   ret i32 -65536
108 define i64 @imm64_1() nounwind {
109 ; RV32I-LABEL: imm64_1:
110 ; RV32I:       # %bb.0:
111 ; RV32I-NEXT:    lui a0, 524288
112 ; RV32I-NEXT:    mv a1, zero
113 ; RV32I-NEXT:    ret
115 ; RV64I-LABEL: imm64_1:
116 ; RV64I:       # %bb.0:
117 ; RV64I-NEXT:    addi a0, zero, 1
118 ; RV64I-NEXT:    slli a0, a0, 31
119 ; RV64I-NEXT:    ret
120   ret i64 2147483648
123 ; TODO: This and similar constants with all 0s in the upper bits and all 1s in
124 ; the lower bits could be lowered to addi a0, zero, -1 followed by a logical
125 ; right shift.
126 define i64 @imm64_2() nounwind {
127 ; RV32I-LABEL: imm64_2:
128 ; RV32I:       # %bb.0:
129 ; RV32I-NEXT:    addi a0, zero, -1
130 ; RV32I-NEXT:    mv a1, zero
131 ; RV32I-NEXT:    ret
133 ; RV64I-LABEL: imm64_2:
134 ; RV64I:       # %bb.0:
135 ; RV64I-NEXT:    addi a0, zero, 1
136 ; RV64I-NEXT:    slli a0, a0, 32
137 ; RV64I-NEXT:    addi a0, a0, -1
138 ; RV64I-NEXT:    ret
139   ret i64 4294967295
142 define i64 @imm64_3() nounwind {
143 ; RV32I-LABEL: imm64_3:
144 ; RV32I:       # %bb.0:
145 ; RV32I-NEXT:    addi a1, zero, 1
146 ; RV32I-NEXT:    mv a0, zero
147 ; RV32I-NEXT:    ret
149 ; RV64I-LABEL: imm64_3:
150 ; RV64I:       # %bb.0:
151 ; RV64I-NEXT:    addi a0, zero, 1
152 ; RV64I-NEXT:    slli a0, a0, 32
153 ; RV64I-NEXT:    ret
154   ret i64 4294967296
157 define i64 @imm64_4() nounwind {
158 ; RV32I-LABEL: imm64_4:
159 ; RV32I:       # %bb.0:
160 ; RV32I-NEXT:    lui a1, 524288
161 ; RV32I-NEXT:    mv a0, zero
162 ; RV32I-NEXT:    ret
164 ; RV64I-LABEL: imm64_4:
165 ; RV64I:       # %bb.0:
166 ; RV64I-NEXT:    addi a0, zero, -1
167 ; RV64I-NEXT:    slli a0, a0, 63
168 ; RV64I-NEXT:    ret
169   ret i64 9223372036854775808
172 define i64 @imm64_5() nounwind {
173 ; RV32I-LABEL: imm64_5:
174 ; RV32I:       # %bb.0:
175 ; RV32I-NEXT:    lui a1, 524288
176 ; RV32I-NEXT:    mv a0, zero
177 ; RV32I-NEXT:    ret
179 ; RV64I-LABEL: imm64_5:
180 ; RV64I:       # %bb.0:
181 ; RV64I-NEXT:    addi a0, zero, -1
182 ; RV64I-NEXT:    slli a0, a0, 63
183 ; RV64I-NEXT:    ret
184   ret i64 -9223372036854775808
187 define i64 @imm64_6() nounwind {
188 ; RV32I-LABEL: imm64_6:
189 ; RV32I:       # %bb.0:
190 ; RV32I-NEXT:    lui a0, 74565
191 ; RV32I-NEXT:    addi a1, a0, 1656
192 ; RV32I-NEXT:    mv a0, zero
193 ; RV32I-NEXT:    ret
195 ; RV64I-LABEL: imm64_6:
196 ; RV64I:       # %bb.0:
197 ; RV64I-NEXT:    lui a0, 9321
198 ; RV64I-NEXT:    addiw a0, a0, -1329
199 ; RV64I-NEXT:    slli a0, a0, 35
200 ; RV64I-NEXT:    ret
201   ret i64 1311768464867721216
204 define i64 @imm64_7() nounwind {
205 ; RV32I-LABEL: imm64_7:
206 ; RV32I:       # %bb.0:
207 ; RV32I-NEXT:    lui a0, 45056
208 ; RV32I-NEXT:    addi a0, a0, 15
209 ; RV32I-NEXT:    lui a1, 458752
210 ; RV32I-NEXT:    ret
212 ; RV64I-LABEL: imm64_7:
213 ; RV64I:       # %bb.0:
214 ; RV64I-NEXT:    addi a0, zero, 7
215 ; RV64I-NEXT:    slli a0, a0, 36
216 ; RV64I-NEXT:    addi a0, a0, 11
217 ; RV64I-NEXT:    slli a0, a0, 24
218 ; RV64I-NEXT:    addi a0, a0, 15
219 ; RV64I-NEXT:    ret
220   ret i64 8070450532432478223
223 ; TODO: it can be preferable to put constants that are expensive to materialise
224 ; into the constant pool, especially for -Os.
225 define i64 @imm64_8() nounwind {
226 ; RV32I-LABEL: imm64_8:
227 ; RV32I:       # %bb.0:
228 ; RV32I-NEXT:    lui a0, 633806
229 ; RV32I-NEXT:    addi a0, a0, -272
230 ; RV32I-NEXT:    lui a1, 74565
231 ; RV32I-NEXT:    addi a1, a1, 1656
232 ; RV32I-NEXT:    ret
234 ; RV64I-LABEL: imm64_8:
235 ; RV64I:       # %bb.0:
236 ; RV64I-NEXT:    lui a0, 583
237 ; RV64I-NEXT:    addiw a0, a0, -1875
238 ; RV64I-NEXT:    slli a0, a0, 14
239 ; RV64I-NEXT:    addi a0, a0, -947
240 ; RV64I-NEXT:    slli a0, a0, 12
241 ; RV64I-NEXT:    addi a0, a0, 1511
242 ; RV64I-NEXT:    slli a0, a0, 13
243 ; RV64I-NEXT:    addi a0, a0, -272
244 ; RV64I-NEXT:    ret
245   ret i64 1311768467463790320
248 define i64 @imm64_9() nounwind {
249 ; RV32I-LABEL: imm64_9:
250 ; RV32I:       # %bb.0:
251 ; RV32I-NEXT:    addi a0, zero, -1
252 ; RV32I-NEXT:    addi a1, zero, -1
253 ; RV32I-NEXT:    ret
255 ; RV64I-LABEL: imm64_9:
256 ; RV64I:       # %bb.0:
257 ; RV64I-NEXT:    addi a0, zero, -1
258 ; RV64I-NEXT:    ret
259   ret i64 -1