Skip to content

Commit 4b8e514

Browse files
committed
[AArch64][GlobalISel] Pre-Commit tests for Legalize BSWAP Vectors
1 parent 6d1d2c6 commit 4b8e514

File tree

1 file changed

+213
-0
lines changed

1 file changed

+213
-0
lines changed

llvm/test/CodeGen/AArch64/bswap.ll

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+
; RUN: llc -mtriple=aarch64 -global-isel -global-isel-abort=2 %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4+
5+
; CHECK-GI: warning: Instruction selection used fallback path for bswap_v8i16
6+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v2i16
7+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v16i16
8+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v8i32
9+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v4i64
10+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v3i16
11+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v7i16
12+
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for bswap_v3i32
13+
14+
; ====== Scalar Tests =====
15+
define i16 @bswap_i16(i16 %a){
16+
; CHECK-LABEL: bswap_i16:
17+
; CHECK: // %bb.0:
18+
; CHECK-NEXT: rev w8, w0
19+
; CHECK-NEXT: lsr w0, w8, #16
20+
; CHECK-NEXT: ret
21+
%3 = call i16 @llvm.bswap.i16(i16 %a)
22+
ret i16 %3
23+
}
24+
declare i16 @llvm.bswap.i16(i16)
25+
26+
define i32 @bswap_i32(i32 %a){
27+
; CHECK-LABEL: bswap_i32:
28+
; CHECK: // %bb.0:
29+
; CHECK-NEXT: rev w0, w0
30+
; CHECK-NEXT: ret
31+
%3 = call i32 @llvm.bswap.i32(i32 %a)
32+
ret i32 %3
33+
}
34+
declare i32 @llvm.bswap.i32(i32)
35+
36+
define i64 @bswap_i64(i64 %a){
37+
; CHECK-LABEL: bswap_i64:
38+
; CHECK: // %bb.0:
39+
; CHECK-NEXT: rev x0, x0
40+
; CHECK-NEXT: ret
41+
%3 = call i64 @llvm.bswap.i64(i64 %a)
42+
ret i64 %3
43+
}
44+
declare i64 @llvm.bswap.i64(i64)
45+
46+
define i128 @bswap_i128(i128 %a){
47+
; CHECK-LABEL: bswap_i128:
48+
; CHECK: // %bb.0:
49+
; CHECK-NEXT: rev x8, x1
50+
; CHECK-NEXT: rev x1, x0
51+
; CHECK-NEXT: mov x0, x8
52+
; CHECK-NEXT: ret
53+
%3 = call i128 @llvm.bswap.i128(i128 %a)
54+
ret i128 %3
55+
}
56+
declare i128 @llvm.bswap.i128(i128)
57+
58+
; ===== Legal Vector Type Tests =====
59+
60+
define <4 x i16> @bswap_v4i16(<4 x i16> %a){
61+
; CHECK-LABEL: bswap_v4i16:
62+
; CHECK: // %bb.0:
63+
; CHECK-NEXT: rev16 v0.8b, v0.8b
64+
; CHECK-NEXT: ret
65+
%3 = call <4 x i16> @llvm.bswap.v4i16(<4 x i16> %a)
66+
ret <4 x i16> %3
67+
}
68+
declare <4 x i16> @llvm.bswap.v4i16(<4 x i16>)
69+
70+
define <8 x i16> @bswap_v8i16(<8 x i16> %a){
71+
; CHECK-LABEL: bswap_v8i16:
72+
; CHECK: // %bb.0:
73+
; CHECK-NEXT: rev16 v0.16b, v0.16b
74+
; CHECK-NEXT: ret
75+
%3 = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %a)
76+
ret <8 x i16> %3
77+
}
78+
declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)
79+
80+
define <2 x i32> @bswap_v2i32(<2 x i32> %a){
81+
; CHECK-LABEL: bswap_v2i32:
82+
; CHECK: // %bb.0:
83+
; CHECK-NEXT: rev32 v0.8b, v0.8b
84+
; CHECK-NEXT: ret
85+
%3 = call <2 x i32> @llvm.bswap.v2i32(<2 x i32> %a)
86+
ret <2 x i32> %3
87+
}
88+
declare <2 x i32> @llvm.bswap.v2i32(<2 x i32>)
89+
90+
define <4 x i32> @bswap_v4i32(<4 x i32> %a){
91+
; CHECK-LABEL: bswap_v4i32:
92+
; CHECK: // %bb.0:
93+
; CHECK-NEXT: rev32 v0.16b, v0.16b
94+
; CHECK-NEXT: ret
95+
%3 = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %a)
96+
ret <4 x i32> %3
97+
}
98+
declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)
99+
100+
define <2 x i64> @bswap_v2i64(<2 x i64> %a){
101+
; CHECK-LABEL: bswap_v2i64:
102+
; CHECK: // %bb.0:
103+
; CHECK-NEXT: rev64 v0.16b, v0.16b
104+
; CHECK-NEXT: ret
105+
%3 = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %a)
106+
ret <2 x i64> %3
107+
}
108+
declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)
109+
110+
; ===== Smaller/Larger Width Vectors with Legal Element Sizes =====
111+
112+
define <2 x i16> @bswap_v2i16(<2 x i16> %a){
113+
; CHECK-LABEL: bswap_v2i16:
114+
; CHECK: // %bb.0: // %entry
115+
; CHECK-NEXT: rev32 v0.8b, v0.8b
116+
; CHECK-NEXT: ushr v0.2s, v0.2s, #16
117+
; CHECK-NEXT: ret
118+
entry:
119+
%res = call <2 x i16> @llvm.bswap.v2i16(<2 x i16> %a)
120+
ret <2 x i16> %res
121+
}
122+
declare <2 x i16> @llvm.bswap.v2i16(<2 x i16>)
123+
124+
define <16 x i16> @bswap_v16i16(<16 x i16> %a){
125+
; CHECK-LABEL: bswap_v16i16:
126+
; CHECK: // %bb.0: // %entry
127+
; CHECK-NEXT: rev16 v0.16b, v0.16b
128+
; CHECK-NEXT: rev16 v1.16b, v1.16b
129+
; CHECK-NEXT: ret
130+
entry:
131+
%res = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> %a)
132+
ret <16 x i16> %res
133+
}
134+
declare <16 x i16> @llvm.bswap.v16i16(<16 x i16>)
135+
136+
define <1 x i32> @bswap_v1i32(<1 x i32> %a){
137+
; CHECK-SD-LABEL: bswap_v1i32:
138+
; CHECK-SD: // %bb.0: // %entry
139+
; CHECK-SD-NEXT: rev32 v0.8b, v0.8b
140+
; CHECK-SD-NEXT: ret
141+
;
142+
; CHECK-GI-LABEL: bswap_v1i32:
143+
; CHECK-GI: // %bb.0: // %entry
144+
; CHECK-GI-NEXT: fmov x8, d0
145+
; CHECK-GI-NEXT: rev w8, w8
146+
; CHECK-GI-NEXT: fmov s0, w8
147+
; CHECK-GI-NEXT: mov v0.s[1], w8
148+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
149+
; CHECK-GI-NEXT: ret
150+
entry:
151+
%res = call <1 x i32> @llvm.bswap.v1i32(<1 x i32> %a)
152+
ret <1 x i32> %res
153+
}
154+
declare <1 x i32> @llvm.bswap.v1i32(<1 x i32>)
155+
156+
define <8 x i32> @bswap_v8i32(<8 x i32> %a){
157+
; CHECK-LABEL: bswap_v8i32:
158+
; CHECK: // %bb.0: // %entry
159+
; CHECK-NEXT: rev32 v0.16b, v0.16b
160+
; CHECK-NEXT: rev32 v1.16b, v1.16b
161+
; CHECK-NEXT: ret
162+
entry:
163+
%res = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %a)
164+
ret <8 x i32> %res
165+
}
166+
declare <8 x i32> @llvm.bswap.v8i32(<8 x i32>)
167+
168+
define <4 x i64> @bswap_v4i64(<4 x i64> %a){
169+
; CHECK-LABEL: bswap_v4i64:
170+
; CHECK: // %bb.0: // %entry
171+
; CHECK-NEXT: rev64 v0.16b, v0.16b
172+
; CHECK-NEXT: rev64 v1.16b, v1.16b
173+
; CHECK-NEXT: ret
174+
entry:
175+
%res = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %a)
176+
ret <4 x i64> %res
177+
}
178+
declare <4 x i64> @llvm.bswap.v4i64(<4 x i64>)
179+
180+
; ===== Vectors with Non-Pow 2 Widths =====
181+
182+
define <3 x i16> @bswap_v3i16(<3 x i16> %a){
183+
; CHECK-LABEL: bswap_v3i16:
184+
; CHECK: // %bb.0: // %entry
185+
; CHECK-NEXT: rev16 v0.8b, v0.8b
186+
; CHECK-NEXT: ret
187+
entry:
188+
%res = call <3 x i16> @llvm.bswap.v3i16(<3 x i16> %a)
189+
ret <3 x i16> %res
190+
}
191+
declare <3 x i16> @llvm.bswap.v3i16(<3 x i16>)
192+
193+
define <7 x i16> @bswap_v7i16(<7 x i16> %a){
194+
; CHECK-LABEL: bswap_v7i16:
195+
; CHECK: // %bb.0: // %entry
196+
; CHECK-NEXT: rev16 v0.16b, v0.16b
197+
; CHECK-NEXT: ret
198+
entry:
199+
%res = call <7 x i16> @llvm.bswap.v7i16(<7 x i16> %a)
200+
ret <7 x i16> %res
201+
}
202+
declare <7 x i16> @llvm.bswap.v7i16(<7 x i16>)
203+
204+
define <3 x i32> @bswap_v3i32(<3 x i32> %a){
205+
; CHECK-LABEL: bswap_v3i32:
206+
; CHECK: // %bb.0: // %entry
207+
; CHECK-NEXT: rev32 v0.16b, v0.16b
208+
; CHECK-NEXT: ret
209+
entry:
210+
%res = call <3 x i32> @llvm.bswap.v3i32(<3 x i32> %a)
211+
ret <3 x i32> %res
212+
}
213+
declare <3 x i32> @llvm.bswap.v3i32(<3 x i32>)

0 commit comments

Comments
 (0)