Skip to content

Commit 6b9752c

Browse files
committed
[RISCV] Add rv64zbkb.ll test for -riscv-experimental-rv64-legal-i32. NFC
1 parent aebd232 commit 6b9752c

File tree

1 file changed

+330
-0
lines changed

1 file changed

+330
-0
lines changed
Lines changed: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
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
4+
; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \
5+
; RUN: -riscv-experimental-rv64-legal-i32 | FileCheck %s -check-prefix=RV64ZBKB
6+
7+
define signext i32 @pack_i32(i32 signext %a, i32 signext %b) nounwind {
8+
; RV64I-LABEL: pack_i32:
9+
; RV64I: # %bb.0:
10+
; RV64I-NEXT: slli a0, a0, 48
11+
; RV64I-NEXT: srli a0, a0, 48
12+
; RV64I-NEXT: slliw a1, a1, 16
13+
; RV64I-NEXT: or a0, a1, a0
14+
; RV64I-NEXT: ret
15+
;
16+
; RV64ZBKB-LABEL: pack_i32:
17+
; RV64ZBKB: # %bb.0:
18+
; RV64ZBKB-NEXT: slli a0, a0, 48
19+
; RV64ZBKB-NEXT: srli a0, a0, 48
20+
; RV64ZBKB-NEXT: slliw a1, a1, 16
21+
; RV64ZBKB-NEXT: or a0, a1, a0
22+
; RV64ZBKB-NEXT: ret
23+
%shl = and i32 %a, 65535
24+
%shl1 = shl i32 %b, 16
25+
%or = or i32 %shl1, %shl
26+
ret i32 %or
27+
}
28+
29+
define signext i32 @pack_i32_2(i16 zeroext %a, i16 zeroext %b) nounwind {
30+
; RV64I-LABEL: pack_i32_2:
31+
; RV64I: # %bb.0:
32+
; RV64I-NEXT: slliw a1, a1, 16
33+
; RV64I-NEXT: or a0, a1, a0
34+
; RV64I-NEXT: ret
35+
;
36+
; RV64ZBKB-LABEL: pack_i32_2:
37+
; RV64ZBKB: # %bb.0:
38+
; RV64ZBKB-NEXT: slliw a1, a1, 16
39+
; RV64ZBKB-NEXT: or a0, a1, a0
40+
; RV64ZBKB-NEXT: ret
41+
%zexta = zext i16 %a to i32
42+
%zextb = zext i16 %b to i32
43+
%shl1 = shl i32 %zextb, 16
44+
%or = or i32 %shl1, %zexta
45+
ret i32 %or
46+
}
47+
48+
; Test case where we don't have a sign_extend_inreg after the or.
49+
define signext i32 @pack_i32_3(i16 zeroext %0, i16 zeroext %1, i32 signext %2) {
50+
; RV64I-LABEL: pack_i32_3:
51+
; RV64I: # %bb.0:
52+
; RV64I-NEXT: slli a0, a0, 16
53+
; RV64I-NEXT: or a0, a0, a1
54+
; RV64I-NEXT: addw a0, a0, a2
55+
; RV64I-NEXT: ret
56+
;
57+
; RV64ZBKB-LABEL: pack_i32_3:
58+
; RV64ZBKB: # %bb.0:
59+
; RV64ZBKB-NEXT: slli a0, a0, 16
60+
; RV64ZBKB-NEXT: or a0, a0, a1
61+
; RV64ZBKB-NEXT: addw a0, a0, a2
62+
; RV64ZBKB-NEXT: ret
63+
%4 = zext i16 %0 to i32
64+
%5 = shl nuw i32 %4, 16
65+
%6 = zext i16 %1 to i32
66+
%7 = or i32 %5, %6
67+
%8 = add i32 %7, %2
68+
ret i32 %8
69+
}
70+
71+
define i64 @pack_i64(i64 %a, i64 %b) nounwind {
72+
; RV64I-LABEL: pack_i64:
73+
; RV64I: # %bb.0:
74+
; RV64I-NEXT: slli a0, a0, 32
75+
; RV64I-NEXT: srli a0, a0, 32
76+
; RV64I-NEXT: slli a1, a1, 32
77+
; RV64I-NEXT: or a0, a1, a0
78+
; RV64I-NEXT: ret
79+
;
80+
; RV64ZBKB-LABEL: pack_i64:
81+
; RV64ZBKB: # %bb.0:
82+
; RV64ZBKB-NEXT: pack a0, a0, a1
83+
; RV64ZBKB-NEXT: ret
84+
%shl = and i64 %a, 4294967295
85+
%shl1 = shl i64 %b, 32
86+
%or = or i64 %shl1, %shl
87+
ret i64 %or
88+
}
89+
90+
define i64 @pack_i64_2(i32 signext %a, i32 signext %b) nounwind {
91+
; RV64I-LABEL: pack_i64_2:
92+
; RV64I: # %bb.0:
93+
; RV64I-NEXT: slli a0, a0, 32
94+
; RV64I-NEXT: srli a0, a0, 32
95+
; RV64I-NEXT: slli a1, a1, 32
96+
; RV64I-NEXT: or a0, a1, a0
97+
; RV64I-NEXT: ret
98+
;
99+
; RV64ZBKB-LABEL: pack_i64_2:
100+
; RV64ZBKB: # %bb.0:
101+
; RV64ZBKB-NEXT: pack a0, a0, a1
102+
; RV64ZBKB-NEXT: ret
103+
%zexta = zext i32 %a to i64
104+
%zextb = zext i32 %b to i64
105+
%shl1 = shl i64 %zextb, 32
106+
%or = or i64 %shl1, %zexta
107+
ret i64 %or
108+
}
109+
110+
define i64 @pack_i64_3(ptr %0, ptr %1) {
111+
; RV64I-LABEL: pack_i64_3:
112+
; RV64I: # %bb.0:
113+
; RV64I-NEXT: lw a0, 0(a0)
114+
; RV64I-NEXT: lwu a1, 0(a1)
115+
; RV64I-NEXT: slli a0, a0, 32
116+
; RV64I-NEXT: or a0, a0, a1
117+
; RV64I-NEXT: ret
118+
;
119+
; RV64ZBKB-LABEL: pack_i64_3:
120+
; RV64ZBKB: # %bb.0:
121+
; RV64ZBKB-NEXT: lw a0, 0(a0)
122+
; RV64ZBKB-NEXT: lwu a1, 0(a1)
123+
; RV64ZBKB-NEXT: pack a0, a1, a0
124+
; RV64ZBKB-NEXT: ret
125+
%3 = load i32, ptr %0, align 4
126+
%4 = zext i32 %3 to i64
127+
%5 = shl i64 %4, 32
128+
%6 = load i32, ptr %1, align 4
129+
%7 = zext i32 %6 to i64
130+
%8 = or i64 %5, %7
131+
ret i64 %8
132+
}
133+
134+
define signext i32 @packh_i32(i32 signext %a, i32 signext %b) nounwind {
135+
; RV64I-LABEL: packh_i32:
136+
; RV64I: # %bb.0:
137+
; RV64I-NEXT: andi a0, a0, 255
138+
; RV64I-NEXT: slli a1, a1, 56
139+
; RV64I-NEXT: srli a1, a1, 48
140+
; RV64I-NEXT: or a0, a1, a0
141+
; RV64I-NEXT: ret
142+
;
143+
; RV64ZBKB-LABEL: packh_i32:
144+
; RV64ZBKB: # %bb.0:
145+
; RV64ZBKB-NEXT: andi a0, a0, 255
146+
; RV64ZBKB-NEXT: slli a1, a1, 56
147+
; RV64ZBKB-NEXT: srli a1, a1, 48
148+
; RV64ZBKB-NEXT: or a0, a1, a0
149+
; RV64ZBKB-NEXT: ret
150+
%and = and i32 %a, 255
151+
%and1 = shl i32 %b, 8
152+
%shl = and i32 %and1, 65280
153+
%or = or i32 %shl, %and
154+
ret i32 %or
155+
}
156+
157+
define i32 @packh_i32_2(i32 %a, i32 %b) nounwind {
158+
; RV64I-LABEL: packh_i32_2:
159+
; RV64I: # %bb.0:
160+
; RV64I-NEXT: andi a0, a0, 255
161+
; RV64I-NEXT: andi a1, a1, 255
162+
; RV64I-NEXT: slliw a1, a1, 8
163+
; RV64I-NEXT: or a0, a1, a0
164+
; RV64I-NEXT: ret
165+
;
166+
; RV64ZBKB-LABEL: packh_i32_2:
167+
; RV64ZBKB: # %bb.0:
168+
; RV64ZBKB-NEXT: andi a0, a0, 255
169+
; RV64ZBKB-NEXT: andi a1, a1, 255
170+
; RV64ZBKB-NEXT: slliw a1, a1, 8
171+
; RV64ZBKB-NEXT: or a0, a1, a0
172+
; RV64ZBKB-NEXT: ret
173+
%and = and i32 %a, 255
174+
%and1 = and i32 %b, 255
175+
%shl = shl i32 %and1, 8
176+
%or = or i32 %shl, %and
177+
ret i32 %or
178+
}
179+
180+
define i64 @packh_i64(i64 %a, i64 %b) nounwind {
181+
; RV64I-LABEL: packh_i64:
182+
; RV64I: # %bb.0:
183+
; RV64I-NEXT: andi a0, a0, 255
184+
; RV64I-NEXT: slli a1, a1, 56
185+
; RV64I-NEXT: srli a1, a1, 48
186+
; RV64I-NEXT: or a0, a1, a0
187+
; RV64I-NEXT: ret
188+
;
189+
; RV64ZBKB-LABEL: packh_i64:
190+
; RV64ZBKB: # %bb.0:
191+
; RV64ZBKB-NEXT: packh a0, a0, a1
192+
; RV64ZBKB-NEXT: ret
193+
%and = and i64 %a, 255
194+
%and1 = shl i64 %b, 8
195+
%shl = and i64 %and1, 65280
196+
%or = or i64 %shl, %and
197+
ret i64 %or
198+
}
199+
200+
define i64 @packh_i64_2(i64 %a, i64 %b) nounwind {
201+
; RV64I-LABEL: packh_i64_2:
202+
; RV64I: # %bb.0:
203+
; RV64I-NEXT: andi a0, a0, 255
204+
; RV64I-NEXT: andi a1, a1, 255
205+
; RV64I-NEXT: slli a1, a1, 8
206+
; RV64I-NEXT: or a0, a1, a0
207+
; RV64I-NEXT: ret
208+
;
209+
; RV64ZBKB-LABEL: packh_i64_2:
210+
; RV64ZBKB: # %bb.0:
211+
; RV64ZBKB-NEXT: packh a0, a0, a1
212+
; RV64ZBKB-NEXT: ret
213+
%and = and i64 %a, 255
214+
%and1 = and i64 %b, 255
215+
%shl = shl i64 %and1, 8
216+
%or = or i64 %shl, %and
217+
ret i64 %or
218+
}
219+
220+
define zeroext i16 @packh_i16(i8 zeroext %a, i8 zeroext %b) nounwind {
221+
; RV64I-LABEL: packh_i16:
222+
; RV64I: # %bb.0:
223+
; RV64I-NEXT: slli a1, a1, 8
224+
; RV64I-NEXT: or a0, a1, a0
225+
; RV64I-NEXT: slli a0, a0, 32
226+
; RV64I-NEXT: srli a0, a0, 32
227+
; RV64I-NEXT: ret
228+
;
229+
; RV64ZBKB-LABEL: packh_i16:
230+
; RV64ZBKB: # %bb.0:
231+
; RV64ZBKB-NEXT: slli a1, a1, 8
232+
; RV64ZBKB-NEXT: or a0, a1, a0
233+
; RV64ZBKB-NEXT: slli a0, a0, 32
234+
; RV64ZBKB-NEXT: srli a0, a0, 32
235+
; RV64ZBKB-NEXT: ret
236+
%zext = zext i8 %a to i16
237+
%zext1 = zext i8 %b to i16
238+
%shl = shl i16 %zext1, 8
239+
%or = or i16 %shl, %zext
240+
ret i16 %or
241+
}
242+
243+
define zeroext i16 @packh_i16_2(i8 zeroext %0, i8 zeroext %1, i8 zeroext %2) {
244+
; RV64I-LABEL: packh_i16_2:
245+
; RV64I: # %bb.0:
246+
; RV64I-NEXT: add a0, a1, a0
247+
; RV64I-NEXT: slli a0, a0, 8
248+
; RV64I-NEXT: or a0, a0, a2
249+
; RV64I-NEXT: slli a0, a0, 48
250+
; RV64I-NEXT: srli a0, a0, 48
251+
; RV64I-NEXT: ret
252+
;
253+
; RV64ZBKB-LABEL: packh_i16_2:
254+
; RV64ZBKB: # %bb.0:
255+
; RV64ZBKB-NEXT: add a0, a1, a0
256+
; RV64ZBKB-NEXT: slli a0, a0, 8
257+
; RV64ZBKB-NEXT: or a0, a0, a2
258+
; RV64ZBKB-NEXT: slli a0, a0, 48
259+
; RV64ZBKB-NEXT: srli a0, a0, 48
260+
; RV64ZBKB-NEXT: ret
261+
%4 = add i8 %1, %0
262+
%5 = zext i8 %4 to i16
263+
%6 = shl i16 %5, 8
264+
%7 = zext i8 %2 to i16
265+
%8 = or i16 %6, %7
266+
ret i16 %8
267+
}
268+
269+
define i64 @pack_i64_allWUsers(i32 signext %0, i32 signext %1, i32 signext %2) {
270+
; RV64I-LABEL: pack_i64_allWUsers:
271+
; RV64I: # %bb.0:
272+
; RV64I-NEXT: add a0, a1, a0
273+
; RV64I-NEXT: slli a0, a0, 32
274+
; RV64I-NEXT: slli a2, a2, 32
275+
; RV64I-NEXT: srli a2, a2, 32
276+
; RV64I-NEXT: or a0, a0, a2
277+
; RV64I-NEXT: ret
278+
;
279+
; RV64ZBKB-LABEL: pack_i64_allWUsers:
280+
; RV64ZBKB: # %bb.0:
281+
; RV64ZBKB-NEXT: add a0, a1, a0
282+
; RV64ZBKB-NEXT: pack a0, a2, a0
283+
; RV64ZBKB-NEXT: ret
284+
%4 = add i32 %1, %0
285+
%5 = zext i32 %4 to i64
286+
%6 = shl i64 %5, 32
287+
%7 = zext i32 %2 to i64
288+
%8 = or i64 %6, %7
289+
ret i64 %8
290+
}
291+
292+
define signext i32 @pack_i32_allWUsers(i16 zeroext %0, i16 zeroext %1, i16 zeroext %2) {
293+
; RV64I-LABEL: pack_i32_allWUsers:
294+
; RV64I: # %bb.0:
295+
; RV64I-NEXT: add a0, a1, a0
296+
; RV64I-NEXT: slliw a0, a0, 16
297+
; RV64I-NEXT: or a0, a0, a2
298+
; RV64I-NEXT: ret
299+
;
300+
; RV64ZBKB-LABEL: pack_i32_allWUsers:
301+
; RV64ZBKB: # %bb.0:
302+
; RV64ZBKB-NEXT: add a0, a1, a0
303+
; RV64ZBKB-NEXT: slliw a0, a0, 16
304+
; RV64ZBKB-NEXT: or a0, a0, a2
305+
; RV64ZBKB-NEXT: ret
306+
%4 = add i16 %1, %0
307+
%5 = zext i16 %4 to i32
308+
%6 = shl i32 %5, 16
309+
%7 = zext i16 %2 to i32
310+
%8 = or i32 %6, %7
311+
ret i32 %8
312+
}
313+
314+
define i64 @pack_i64_imm() {
315+
; RV64I-LABEL: pack_i64_imm:
316+
; RV64I: # %bb.0:
317+
; RV64I-NEXT: lui a0, 65793
318+
; RV64I-NEXT: addiw a0, a0, 16
319+
; RV64I-NEXT: slli a1, a0, 32
320+
; RV64I-NEXT: add a0, a0, a1
321+
; RV64I-NEXT: ret
322+
;
323+
; RV64ZBKB-LABEL: pack_i64_imm:
324+
; RV64ZBKB: # %bb.0:
325+
; RV64ZBKB-NEXT: lui a0, 65793
326+
; RV64ZBKB-NEXT: addi a0, a0, 16
327+
; RV64ZBKB-NEXT: pack a0, a0, a0
328+
; RV64ZBKB-NEXT: ret
329+
ret i64 1157442765409226768 ; 0x0101010101010101
330+
}

0 commit comments

Comments
 (0)