xref: /llvm-project/llvm/test/CodeGen/RISCV/shl-demanded.ll (revision 862407510595e37266e3dc0df6a00cad78f420bf)
1450f0bd1SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2450f0bd1SCraig Topper; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3450f0bd1SCraig Topper; RUN:   | FileCheck %s -check-prefix=RV32I
4450f0bd1SCraig Topper; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5450f0bd1SCraig Topper; RUN:   | FileCheck %s -check-prefix=RV64I
6450f0bd1SCraig Topper
71456b686SNikita Popovdefine void @sext_shl_trunc_same_size(i16 %x, i32 %y, ptr %res) {
8450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_trunc_same_size:
9450f0bd1SCraig Topper; RV32I:       # %bb.0:
10450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
11450f0bd1SCraig Topper; RV32I-NEXT:    sh a0, 0(a2)
12450f0bd1SCraig Topper; RV32I-NEXT:    ret
13450f0bd1SCraig Topper;
14450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_trunc_same_size:
15450f0bd1SCraig Topper; RV64I:       # %bb.0:
16450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
17450f0bd1SCraig Topper; RV64I-NEXT:    sh a0, 0(a2)
18450f0bd1SCraig Topper; RV64I-NEXT:    ret
19450f0bd1SCraig Topper  %conv = sext i16 %x to i32
20450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
21450f0bd1SCraig Topper  %t = trunc i32 %shl to i16
221456b686SNikita Popov  store i16 %t, ptr %res
23450f0bd1SCraig Topper  ret void
24450f0bd1SCraig Topper}
25450f0bd1SCraig Topper
261456b686SNikita Popovdefine void @zext_shl_trunc_same_size(i16 %x, i32 %y, ptr %res) {
27450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_trunc_same_size:
28450f0bd1SCraig Topper; RV32I:       # %bb.0:
29450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
30450f0bd1SCraig Topper; RV32I-NEXT:    sh a0, 0(a2)
31450f0bd1SCraig Topper; RV32I-NEXT:    ret
32450f0bd1SCraig Topper;
33450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_trunc_same_size:
34450f0bd1SCraig Topper; RV64I:       # %bb.0:
35450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
36450f0bd1SCraig Topper; RV64I-NEXT:    sh a0, 0(a2)
37450f0bd1SCraig Topper; RV64I-NEXT:    ret
38450f0bd1SCraig Topper  %conv = zext i16 %x to i32
39450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
40450f0bd1SCraig Topper  %t = trunc i32 %shl to i16
411456b686SNikita Popov  store i16 %t, ptr %res
42450f0bd1SCraig Topper  ret void
43450f0bd1SCraig Topper}
44450f0bd1SCraig Topper
451456b686SNikita Popovdefine void @sext_shl_trunc_smaller(i16 %x, i32 %y, ptr %res) {
46450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_trunc_smaller:
47450f0bd1SCraig Topper; RV32I:       # %bb.0:
48450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
49450f0bd1SCraig Topper; RV32I-NEXT:    sb a0, 0(a2)
50450f0bd1SCraig Topper; RV32I-NEXT:    ret
51450f0bd1SCraig Topper;
52450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_trunc_smaller:
53450f0bd1SCraig Topper; RV64I:       # %bb.0:
54450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
55450f0bd1SCraig Topper; RV64I-NEXT:    sb a0, 0(a2)
56450f0bd1SCraig Topper; RV64I-NEXT:    ret
57450f0bd1SCraig Topper  %conv = sext i16 %x to i32
58450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
59450f0bd1SCraig Topper  %t = trunc i32 %shl to i8
601456b686SNikita Popov  store i8 %t, ptr %res
61450f0bd1SCraig Topper  ret void
62450f0bd1SCraig Topper}
63450f0bd1SCraig Topper
641456b686SNikita Popovdefine void @zext_shl_trunc_smaller(i16 %x, i32 %y, ptr %res) {
65450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_trunc_smaller:
66450f0bd1SCraig Topper; RV32I:       # %bb.0:
67450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
68450f0bd1SCraig Topper; RV32I-NEXT:    sb a0, 0(a2)
69450f0bd1SCraig Topper; RV32I-NEXT:    ret
70450f0bd1SCraig Topper;
71450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_trunc_smaller:
72450f0bd1SCraig Topper; RV64I:       # %bb.0:
73450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
74450f0bd1SCraig Topper; RV64I-NEXT:    sb a0, 0(a2)
75450f0bd1SCraig Topper; RV64I-NEXT:    ret
76450f0bd1SCraig Topper  %conv = zext i16 %x to i32
77450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
78450f0bd1SCraig Topper  %t = trunc i32 %shl to i8
791456b686SNikita Popov  store i8 %t, ptr %res
80450f0bd1SCraig Topper  ret void
81450f0bd1SCraig Topper}
82450f0bd1SCraig Topper
83450f0bd1SCraig Topper; negative test - demanding 1 high-bit too many to change the extend
84450f0bd1SCraig Topper
85450f0bd1SCraig Topperdefine signext i17 @sext_shl_trunc_larger(i16 %x, i32 %y) {
86450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_trunc_larger:
87450f0bd1SCraig Topper; RV32I:       # %bb.0:
88450f0bd1SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
89450f0bd1SCraig Topper; RV32I-NEXT:    srai a0, a0, 16
90450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
91450f0bd1SCraig Topper; RV32I-NEXT:    slli a0, a0, 15
92450f0bd1SCraig Topper; RV32I-NEXT:    srai a0, a0, 15
93450f0bd1SCraig Topper; RV32I-NEXT:    ret
94450f0bd1SCraig Topper;
95450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_trunc_larger:
96450f0bd1SCraig Topper; RV64I:       # %bb.0:
97450f0bd1SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
98450f0bd1SCraig Topper; RV64I-NEXT:    srai a0, a0, 48
99450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
100450f0bd1SCraig Topper; RV64I-NEXT:    slli a0, a0, 47
101450f0bd1SCraig Topper; RV64I-NEXT:    srai a0, a0, 47
102450f0bd1SCraig Topper; RV64I-NEXT:    ret
103450f0bd1SCraig Topper  %conv = sext i16 %x to i32
104450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
105450f0bd1SCraig Topper  %t = trunc i32 %shl to i17
106450f0bd1SCraig Topper  ret i17 %t
107450f0bd1SCraig Topper}
108450f0bd1SCraig Topper
109450f0bd1SCraig Topper; negative test - demanding 1 high-bit too many to change the extend
110450f0bd1SCraig Topper
111450f0bd1SCraig Topperdefine zeroext i17 @zext_shl_trunc_larger(i16 %x, i32 %y) {
112450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_trunc_larger:
113450f0bd1SCraig Topper; RV32I:       # %bb.0:
114450f0bd1SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
115450f0bd1SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
116450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
117450f0bd1SCraig Topper; RV32I-NEXT:    slli a0, a0, 15
118450f0bd1SCraig Topper; RV32I-NEXT:    srli a0, a0, 15
119450f0bd1SCraig Topper; RV32I-NEXT:    ret
120450f0bd1SCraig Topper;
121450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_trunc_larger:
122450f0bd1SCraig Topper; RV64I:       # %bb.0:
123450f0bd1SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
124450f0bd1SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
125450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
126450f0bd1SCraig Topper; RV64I-NEXT:    slli a0, a0, 47
127450f0bd1SCraig Topper; RV64I-NEXT:    srli a0, a0, 47
128450f0bd1SCraig Topper; RV64I-NEXT:    ret
129450f0bd1SCraig Topper  %conv = zext i16 %x to i32
130450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
131450f0bd1SCraig Topper  %t = trunc i32 %shl to i17
132450f0bd1SCraig Topper  ret i17 %t
133450f0bd1SCraig Topper}
134450f0bd1SCraig Topper
135450f0bd1SCraig Topperdefine i32 @sext_shl_mask(i16 %x, i32 %y) {
136450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_mask:
137450f0bd1SCraig Topper; RV32I:       # %bb.0:
138450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
139450f0bd1SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
140450f0bd1SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
141450f0bd1SCraig Topper; RV32I-NEXT:    ret
142450f0bd1SCraig Topper;
143450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_mask:
144450f0bd1SCraig Topper; RV64I:       # %bb.0:
145450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
146450f0bd1SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
147450f0bd1SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
148450f0bd1SCraig Topper; RV64I-NEXT:    ret
149450f0bd1SCraig Topper  %conv = sext i16 %x to i32
150450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
151450f0bd1SCraig Topper  %t = and i32 %shl, 65535
152450f0bd1SCraig Topper  ret i32 %t
153450f0bd1SCraig Topper}
154450f0bd1SCraig Topper
155450f0bd1SCraig Topperdefine i32 @zext_shl_mask(i16 %x, i32 %y) {
156450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_mask:
157450f0bd1SCraig Topper; RV32I:       # %bb.0:
158450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
159dcfc1fd2SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
160dcfc1fd2SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
161450f0bd1SCraig Topper; RV32I-NEXT:    ret
162450f0bd1SCraig Topper;
163450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_mask:
164450f0bd1SCraig Topper; RV64I:       # %bb.0:
165450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
166dcfc1fd2SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
167dcfc1fd2SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
168450f0bd1SCraig Topper; RV64I-NEXT:    ret
169450f0bd1SCraig Topper  %conv = zext i16 %x to i32
170450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
171450f0bd1SCraig Topper  %t = and i32 %shl, 65535
172450f0bd1SCraig Topper  ret i32 %t
173450f0bd1SCraig Topper}
174450f0bd1SCraig Topper
175450f0bd1SCraig Topper; negative test - demanding a bit that could change with sext
176450f0bd1SCraig Topper
177450f0bd1SCraig Topperdefine i32 @sext_shl_mask_higher(i16 %x, i32 %y) {
178450f0bd1SCraig Topper; RV32I-LABEL: sext_shl_mask_higher:
179450f0bd1SCraig Topper; RV32I:       # %bb.0:
180450f0bd1SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
181450f0bd1SCraig Topper; RV32I-NEXT:    srai a0, a0, 16
182450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
183450f0bd1SCraig Topper; RV32I-NEXT:    lui a1, 16
184450f0bd1SCraig Topper; RV32I-NEXT:    and a0, a0, a1
185450f0bd1SCraig Topper; RV32I-NEXT:    ret
186450f0bd1SCraig Topper;
187450f0bd1SCraig Topper; RV64I-LABEL: sext_shl_mask_higher:
188450f0bd1SCraig Topper; RV64I:       # %bb.0:
189450f0bd1SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
190450f0bd1SCraig Topper; RV64I-NEXT:    srai a0, a0, 48
191450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
192450f0bd1SCraig Topper; RV64I-NEXT:    lui a1, 16
193450f0bd1SCraig Topper; RV64I-NEXT:    and a0, a0, a1
194450f0bd1SCraig Topper; RV64I-NEXT:    ret
195450f0bd1SCraig Topper  %conv = sext i16 %x to i32
196450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
197450f0bd1SCraig Topper  %t = and i32 %shl, 65536
198450f0bd1SCraig Topper  ret i32 %t
199450f0bd1SCraig Topper}
200450f0bd1SCraig Topper
201450f0bd1SCraig Topper; negative test - demanding a bit that could change with zext
202450f0bd1SCraig Topper
203450f0bd1SCraig Topperdefine i32 @zext_shl_mask_higher(i16 %x, i32 %y) {
204450f0bd1SCraig Topper; RV32I-LABEL: zext_shl_mask_higher:
205450f0bd1SCraig Topper; RV32I:       # %bb.0:
206450f0bd1SCraig Topper; RV32I-NEXT:    slli a0, a0, 16
207450f0bd1SCraig Topper; RV32I-NEXT:    srli a0, a0, 16
208450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
209450f0bd1SCraig Topper; RV32I-NEXT:    lui a1, 16
210450f0bd1SCraig Topper; RV32I-NEXT:    and a0, a0, a1
211450f0bd1SCraig Topper; RV32I-NEXT:    ret
212450f0bd1SCraig Topper;
213450f0bd1SCraig Topper; RV64I-LABEL: zext_shl_mask_higher:
214450f0bd1SCraig Topper; RV64I:       # %bb.0:
215450f0bd1SCraig Topper; RV64I-NEXT:    slli a0, a0, 48
216450f0bd1SCraig Topper; RV64I-NEXT:    srli a0, a0, 48
217450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
218450f0bd1SCraig Topper; RV64I-NEXT:    lui a1, 16
219450f0bd1SCraig Topper; RV64I-NEXT:    and a0, a0, a1
220450f0bd1SCraig Topper; RV64I-NEXT:    ret
221450f0bd1SCraig Topper  %conv = zext i16 %x to i32
222450f0bd1SCraig Topper  %shl = shl i32 %conv, %y
223450f0bd1SCraig Topper  %t = and i32 %shl, 65536
224450f0bd1SCraig Topper  ret i32 %t
225450f0bd1SCraig Topper}
226450f0bd1SCraig Topper
227450f0bd1SCraig Topper; May need some, but not all of the bits set by the 'or'.
228450f0bd1SCraig Topper
229450f0bd1SCraig Topperdefine i32 @set_shl_mask(i32 %x, i32 %y) {
230450f0bd1SCraig Topper; RV32I-LABEL: set_shl_mask:
231450f0bd1SCraig Topper; RV32I:       # %bb.0:
232dcfc1fd2SCraig Topper; RV32I-NEXT:    lui a2, 16
233dcfc1fd2SCraig Topper; RV32I-NEXT:    addi a3, a2, 1
234dcfc1fd2SCraig Topper; RV32I-NEXT:    or a0, a0, a3
235450f0bd1SCraig Topper; RV32I-NEXT:    sll a0, a0, a1
236dcfc1fd2SCraig Topper; RV32I-NEXT:    and a0, a0, a2
237450f0bd1SCraig Topper; RV32I-NEXT:    ret
238450f0bd1SCraig Topper;
239450f0bd1SCraig Topper; RV64I-LABEL: set_shl_mask:
240450f0bd1SCraig Topper; RV64I:       # %bb.0:
241dcfc1fd2SCraig Topper; RV64I-NEXT:    lui a2, 16
242*86240751SPhilip Reames; RV64I-NEXT:    addi a3, a2, 1
243dcfc1fd2SCraig Topper; RV64I-NEXT:    or a0, a0, a3
244450f0bd1SCraig Topper; RV64I-NEXT:    sllw a0, a0, a1
245dcfc1fd2SCraig Topper; RV64I-NEXT:    and a0, a0, a2
246450f0bd1SCraig Topper; RV64I-NEXT:    ret
247450f0bd1SCraig Topper  %z = or i32 %x, 196609
248450f0bd1SCraig Topper  %s = shl i32 %z, %y
249450f0bd1SCraig Topper  %r = and i32 %s, 65536
250450f0bd1SCraig Topper  ret i32 %r
251450f0bd1SCraig Topper}
252