Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64-legal-i32 / alu32.ll
blob659fa413fc6575bfccc7d4b245105ac94d1dc795
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
3 ; RUN:   -riscv-experimental-rv64-legal-i32 | FileCheck %s -check-prefix=RV64I
5 ; These tests are each targeted at a particular RISC-V ALU instruction. Most
6 ; other files in this folder exercise LLVM IR instructions that don't directly
7 ; match a RISC-V instruction.
9 ; Register-immediate instructions.
11 define i32 @addi(i32 %a) nounwind {
12 ; RV64I-LABEL: addi:
13 ; RV64I:       # %bb.0:
14 ; RV64I-NEXT:    addiw a0, a0, 1
15 ; RV64I-NEXT:    ret
16   %1 = add i32 %a, 1
17   ret i32 %1
20 define i32 @slti(i32 %a) nounwind {
21 ; RV64I-LABEL: slti:
22 ; RV64I:       # %bb.0:
23 ; RV64I-NEXT:    sext.w a0, a0
24 ; RV64I-NEXT:    slti a0, a0, 2
25 ; RV64I-NEXT:    ret
26   %1 = icmp slt i32 %a, 2
27   %2 = zext i1 %1 to i32
28   ret i32 %2
31 define i32 @sltiu(i32 %a) nounwind {
32 ; RV64I-LABEL: sltiu:
33 ; RV64I:       # %bb.0:
34 ; RV64I-NEXT:    sext.w a0, a0
35 ; RV64I-NEXT:    sltiu a0, a0, 3
36 ; RV64I-NEXT:    ret
37   %1 = icmp ult i32 %a, 3
38   %2 = zext i1 %1 to i32
39   ret i32 %2
42 define i32 @xori(i32 %a) nounwind {
43 ; RV64I-LABEL: xori:
44 ; RV64I:       # %bb.0:
45 ; RV64I-NEXT:    xori a0, a0, 4
46 ; RV64I-NEXT:    ret
47   %1 = xor i32 %a, 4
48   ret i32 %1
51 define i32 @ori(i32 %a) nounwind {
52 ; RV64I-LABEL: ori:
53 ; RV64I:       # %bb.0:
54 ; RV64I-NEXT:    ori a0, a0, 5
55 ; RV64I-NEXT:    ret
56   %1 = or i32 %a, 5
57   ret i32 %1
60 define i32 @andi(i32 %a) nounwind {
61 ; RV64I-LABEL: andi:
62 ; RV64I:       # %bb.0:
63 ; RV64I-NEXT:    andi a0, a0, 6
64 ; RV64I-NEXT:    ret
65   %1 = and i32 %a, 6
66   ret i32 %1
69 define i32 @slli(i32 %a) nounwind {
70 ; RV64I-LABEL: slli:
71 ; RV64I:       # %bb.0:
72 ; RV64I-NEXT:    slliw a0, a0, 7
73 ; RV64I-NEXT:    ret
74   %1 = shl i32 %a, 7
75   ret i32 %1
78 define i32 @srli(i32 %a) nounwind {
79 ; RV64I-LABEL: srli:
80 ; RV64I:       # %bb.0:
81 ; RV64I-NEXT:    srliw a0, a0, 8
82 ; RV64I-NEXT:    ret
83   %1 = lshr i32 %a, 8
84   ret i32 %1
87 define i32 @srai(i32 %a) nounwind {
88 ; RV64I-LABEL: srai:
89 ; RV64I:       # %bb.0:
90 ; RV64I-NEXT:    sraiw a0, a0, 9
91 ; RV64I-NEXT:    ret
92   %1 = ashr i32 %a, 9
93   ret i32 %1
96 ; Register-register instructions
98 define i32 @add(i32 %a, i32 %b) nounwind {
99 ; RV64I-LABEL: add:
100 ; RV64I:       # %bb.0:
101 ; RV64I-NEXT:    addw a0, a0, a1
102 ; RV64I-NEXT:    ret
103   %1 = add i32 %a, %b
104   ret i32 %1
107 define i32 @sub(i32 %a, i32 %b) nounwind {
108 ; RV64I-LABEL: sub:
109 ; RV64I:       # %bb.0:
110 ; RV64I-NEXT:    subw a0, a0, a1
111 ; RV64I-NEXT:    ret
112   %1 = sub i32 %a, %b
113   ret i32 %1
116 define i32 @sub_negative_constant_lhs(i32 %a) nounwind {
117 ; RV64I-LABEL: sub_negative_constant_lhs:
118 ; RV64I:       # %bb.0:
119 ; RV64I-NEXT:    li a1, -2
120 ; RV64I-NEXT:    subw a0, a1, a0
121 ; RV64I-NEXT:    ret
122   %1 = sub i32 -2, %a
123   ret i32 %1
126 define i32 @sll(i32 %a, i32 %b) nounwind {
127 ; RV64I-LABEL: sll:
128 ; RV64I:       # %bb.0:
129 ; RV64I-NEXT:    sllw a0, a0, a1
130 ; RV64I-NEXT:    ret
131   %1 = shl i32 %a, %b
132   ret i32 %1
135 ; Make sure we don't emit instructions to zero extend the shift amount to i64.
136 define i32 @sll_shamt_zext(i32 %a, i32 %b) nounwind {
137 ; RV64I-LABEL: sll_shamt_zext:
138 ; RV64I:       # %bb.0:
139 ; RV64I-NEXT:    addi a1, a1, 1
140 ; RV64I-NEXT:    sllw a0, a0, a1
141 ; RV64I-NEXT:    ret
142   %shamt = add i32 %b, 1
143   %1 = shl i32 %a, %shamt
144   ret i32 %1
147 define i32 @sll_negative_constant_lhs(i32 %a) nounwind {
148 ; RV64I-LABEL: sll_negative_constant_lhs:
149 ; RV64I:       # %bb.0:
150 ; RV64I-NEXT:    li a1, -1
151 ; RV64I-NEXT:    sllw a0, a1, a0
152 ; RV64I-NEXT:    ret
153   %1 = shl i32 -1, %a
154   ret i32 %1
157 define i32 @slt(i32 %a, i32 %b) nounwind {
158 ; RV64I-LABEL: slt:
159 ; RV64I:       # %bb.0:
160 ; RV64I-NEXT:    sext.w a1, a1
161 ; RV64I-NEXT:    sext.w a0, a0
162 ; RV64I-NEXT:    slt a0, a0, a1
163 ; RV64I-NEXT:    ret
164   %1 = icmp slt i32 %a, %b
165   %2 = zext i1 %1 to i32
166   ret i32 %2
169 define i32 @sltu(i32 %a, i32 %b) nounwind {
171 ; RV64I-LABEL: sltu:
172 ; RV64I:       # %bb.0:
173 ; RV64I-NEXT:    sext.w a1, a1
174 ; RV64I-NEXT:    sext.w a0, a0
175 ; RV64I-NEXT:    sltu a0, a0, a1
176 ; RV64I-NEXT:    ret
177   %1 = icmp ult i32 %a, %b
178   %2 = zext i1 %1 to i32
179   ret i32 %2
182 define i32 @xor(i32 %a, i32 %b) nounwind {
184 ; RV64I-LABEL: xor:
185 ; RV64I:       # %bb.0:
186 ; RV64I-NEXT:    xor a0, a0, a1
187 ; RV64I-NEXT:    ret
188   %1 = xor i32 %a, %b
189   ret i32 %1
192 define i32 @srl(i32 %a, i32 %b) nounwind {
194 ; RV64I-LABEL: srl:
195 ; RV64I:       # %bb.0:
196 ; RV64I-NEXT:    srlw a0, a0, a1
197 ; RV64I-NEXT:    ret
198   %1 = lshr i32 %a, %b
199   ret i32 %1
202 ; Make sure we don't emit instructions to zero extend the shift amount to i64.
203 define i32 @srl_shamt_zext(i32 %a, i32 %b) nounwind {
204 ; RV64I-LABEL: srl_shamt_zext:
205 ; RV64I:       # %bb.0:
206 ; RV64I-NEXT:    addi a1, a1, 1
207 ; RV64I-NEXT:    srlw a0, a0, a1
208 ; RV64I-NEXT:    ret
209   %shamt = add i32 %b, 1
210   %1 = lshr i32 %a, %shamt
211   ret i32 %1
214 define i32 @srl_negative_constant_lhs(i32 %a) nounwind {
216 ; RV64I-LABEL: srl_negative_constant_lhs:
217 ; RV64I:       # %bb.0:
218 ; RV64I-NEXT:    li a1, -1
219 ; RV64I-NEXT:    srlw a0, a1, a0
220 ; RV64I-NEXT:    ret
221   %1 = lshr i32 -1, %a
222   ret i32 %1
225 define i32 @sra(i32 %a, i32 %b) nounwind {
227 ; RV64I-LABEL: sra:
228 ; RV64I:       # %bb.0:
229 ; RV64I-NEXT:    sraw a0, a0, a1
230 ; RV64I-NEXT:    ret
231   %1 = ashr i32 %a, %b
232   ret i32 %1
235 ; Make sure we don't emit instructions to zero extend the shift amount to i64.
236 define i32 @sra_shamt_zext(i32 %a, i32 %b) nounwind {
237 ; RV64I-LABEL: sra_shamt_zext:
238 ; RV64I:       # %bb.0:
239 ; RV64I-NEXT:    addi a1, a1, 1
240 ; RV64I-NEXT:    sraw a0, a0, a1
241 ; RV64I-NEXT:    ret
242   %shamt = add i32 %b, 1
243   %1 = ashr i32 %a, %shamt
244   ret i32 %1
247 define i32 @sra_negative_constant_lhs(i32 %a) nounwind {
249 ; RV64I-LABEL: sra_negative_constant_lhs:
250 ; RV64I:       # %bb.0:
251 ; RV64I-NEXT:    lui a1, 524288
252 ; RV64I-NEXT:    sraw a0, a1, a0
253 ; RV64I-NEXT:    ret
254   %1 = ashr i32 2147483648, %a
255   ret i32 %1
258 define i32 @or(i32 %a, i32 %b) nounwind {
260 ; RV64I-LABEL: or:
261 ; RV64I:       # %bb.0:
262 ; RV64I-NEXT:    or a0, a0, a1
263 ; RV64I-NEXT:    ret
264   %1 = or i32 %a, %b
265   ret i32 %1
268 define i32 @and(i32 %a, i32 %b) nounwind {
270 ; RV64I-LABEL: and:
271 ; RV64I:       # %bb.0:
272 ; RV64I-NEXT:    and a0, a0, a1
273 ; RV64I-NEXT:    ret
274   %1 = and i32 %a, %b
275   ret i32 %1