[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rv64-legal-i32 / alu32.ll
blobe4eca5c491edb18051f002d4fb3282890048517e
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 define i32 @sll_negative_constant_lhs(i32 %a) nounwind {
136 ; RV64I-LABEL: sll_negative_constant_lhs:
137 ; RV64I:       # %bb.0:
138 ; RV64I-NEXT:    li a1, -1
139 ; RV64I-NEXT:    sllw a0, a1, a0
140 ; RV64I-NEXT:    ret
141   %1 = shl i32 -1, %a
142   ret i32 %1
145 define i32 @slt(i32 %a, i32 %b) nounwind {
146 ; RV64I-LABEL: slt:
147 ; RV64I:       # %bb.0:
148 ; RV64I-NEXT:    sext.w a1, a1
149 ; RV64I-NEXT:    sext.w a0, a0
150 ; RV64I-NEXT:    slt a0, a0, a1
151 ; RV64I-NEXT:    ret
152   %1 = icmp slt i32 %a, %b
153   %2 = zext i1 %1 to i32
154   ret i32 %2
157 define i32 @sltu(i32 %a, i32 %b) nounwind {
159 ; RV64I-LABEL: sltu:
160 ; RV64I:       # %bb.0:
161 ; RV64I-NEXT:    sext.w a1, a1
162 ; RV64I-NEXT:    sext.w a0, a0
163 ; RV64I-NEXT:    sltu a0, a0, a1
164 ; RV64I-NEXT:    ret
165   %1 = icmp ult i32 %a, %b
166   %2 = zext i1 %1 to i32
167   ret i32 %2
170 define i32 @xor(i32 %a, i32 %b) nounwind {
172 ; RV64I-LABEL: xor:
173 ; RV64I:       # %bb.0:
174 ; RV64I-NEXT:    xor a0, a0, a1
175 ; RV64I-NEXT:    ret
176   %1 = xor i32 %a, %b
177   ret i32 %1
180 define i32 @srl(i32 %a, i32 %b) nounwind {
182 ; RV64I-LABEL: srl:
183 ; RV64I:       # %bb.0:
184 ; RV64I-NEXT:    srlw a0, a0, a1
185 ; RV64I-NEXT:    ret
186   %1 = lshr i32 %a, %b
187   ret i32 %1
190 define i32 @srl_negative_constant_lhs(i32 %a) nounwind {
192 ; RV64I-LABEL: srl_negative_constant_lhs:
193 ; RV64I:       # %bb.0:
194 ; RV64I-NEXT:    li a1, -1
195 ; RV64I-NEXT:    srlw a0, a1, a0
196 ; RV64I-NEXT:    ret
197   %1 = lshr i32 -1, %a
198   ret i32 %1
201 define i32 @sra(i32 %a, i32 %b) nounwind {
203 ; RV64I-LABEL: sra:
204 ; RV64I:       # %bb.0:
205 ; RV64I-NEXT:    sraw a0, a0, a1
206 ; RV64I-NEXT:    ret
207   %1 = ashr i32 %a, %b
208   ret i32 %1
211 define i32 @sra_negative_constant_lhs(i32 %a) nounwind {
213 ; RV64I-LABEL: sra_negative_constant_lhs:
214 ; RV64I:       # %bb.0:
215 ; RV64I-NEXT:    lui a1, 524288
216 ; RV64I-NEXT:    sraw a0, a1, a0
217 ; RV64I-NEXT:    ret
218   %1 = ashr i32 2147483648, %a
219   ret i32 %1
222 define i32 @or(i32 %a, i32 %b) nounwind {
224 ; RV64I-LABEL: or:
225 ; RV64I:       # %bb.0:
226 ; RV64I-NEXT:    or a0, a0, a1
227 ; RV64I-NEXT:    ret
228   %1 = or i32 %a, %b
229   ret i32 %1
232 define i32 @and(i32 %a, i32 %b) nounwind {
234 ; RV64I-LABEL: and:
235 ; RV64I:       # %bb.0:
236 ; RV64I-NEXT:    and a0, a0, a1
237 ; RV64I-NEXT:    ret
238   %1 = and i32 %a, %b
239   ret i32 %1