Skip to content

Commit fabb6e3

Browse files
zhaoqi5Lukacma
authored andcommitted
[LoongArch][NFC] Pre-commit tests for reversing vector using shufflevector (llvm#163145)
1 parent bd54858 commit fabb6e3

File tree

2 files changed

+186
-0
lines changed

2 files changed

+186
-0
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx %s -o - | FileCheck %s
4+
5+
define void @shufflevector_reverse_v32i8(ptr %res, ptr %a) nounwind {
6+
; CHECK-LABEL: shufflevector_reverse_v32i8:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: xvld $xr0, $a1, 0
9+
; CHECK-NEXT: pcalau12i $a1, %pc_hi20(.LCPI0_0)
10+
; CHECK-NEXT: xvld $xr1, $a1, %pc_lo12(.LCPI0_0)
11+
; CHECK-NEXT: xvpermi.d $xr0, $xr0, 78
12+
; CHECK-NEXT: xvshuf.b $xr0, $xr0, $xr0, $xr1
13+
; CHECK-NEXT: xvst $xr0, $a0, 0
14+
; CHECK-NEXT: ret
15+
entry:
16+
%va = load <32 x i8>, ptr %a
17+
%b = shufflevector <32 x i8> %va, <32 x i8> poison, <32 x i32> <i32 31, i32 30, i32 29, i32 28, i32 27, i32 26, i32 25, i32 24, i32 23, i32 22, i32 21, i32 20, i32 19, i32 18, i32 17, i32 16, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
18+
store <32 x i8> %b, ptr %res
19+
ret void
20+
}
21+
22+
define void @shufflevector_reverse_v16i16(ptr %res, ptr %a) nounwind {
23+
; CHECK-LABEL: shufflevector_reverse_v16i16:
24+
; CHECK: # %bb.0: # %entry
25+
; CHECK-NEXT: xvld $xr0, $a1, 0
26+
; CHECK-NEXT: pcalau12i $a1, %pc_hi20(.LCPI1_0)
27+
; CHECK-NEXT: xvld $xr1, $a1, %pc_lo12(.LCPI1_0)
28+
; CHECK-NEXT: xvpermi.d $xr0, $xr0, 78
29+
; CHECK-NEXT: xvshuf.h $xr1, $xr0, $xr0
30+
; CHECK-NEXT: xvst $xr1, $a0, 0
31+
; CHECK-NEXT: ret
32+
entry:
33+
%va = load <16 x i16>, ptr %a
34+
%b = shufflevector <16 x i16> %va, <16 x i16> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
35+
store <16 x i16> %b, ptr %res
36+
ret void
37+
}
38+
39+
define void @shufflevector_reverse_v8i32(ptr %res, ptr %a) nounwind {
40+
; CHECK-LABEL: shufflevector_reverse_v8i32:
41+
; CHECK: # %bb.0: # %entry
42+
; CHECK-NEXT: xvld $xr0, $a1, 0
43+
; CHECK-NEXT: xvpermi.d $xr0, $xr0, 78
44+
; CHECK-NEXT: xvshuf4i.w $xr0, $xr0, 27
45+
; CHECK-NEXT: xvst $xr0, $a0, 0
46+
; CHECK-NEXT: ret
47+
entry:
48+
%va = load <8 x i32>, ptr %a
49+
%b = shufflevector <8 x i32> %va, <8 x i32> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
50+
store <8 x i32> %b, ptr %res
51+
ret void
52+
}
53+
54+
define void @shufflevector_reverse_v4i64(ptr %res, ptr %a) nounwind {
55+
; CHECK-LABEL: shufflevector_reverse_v4i64:
56+
; CHECK: # %bb.0: # %entry
57+
; CHECK-NEXT: xvld $xr0, $a1, 0
58+
; CHECK-NEXT: xvpermi.d $xr0, $xr0, 27
59+
; CHECK-NEXT: xvst $xr0, $a0, 0
60+
; CHECK-NEXT: ret
61+
entry:
62+
%va = load <4 x i64>, ptr %a
63+
%b = shufflevector <4 x i64> %va, <4 x i64> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
64+
store <4 x i64> %b, ptr %res
65+
ret void
66+
}
67+
68+
define void @shufflevector_reverse_v8f32(ptr %res, ptr %a) nounwind {
69+
; CHECK-LABEL: shufflevector_reverse_v8f32:
70+
; CHECK: # %bb.0: # %entry
71+
; CHECK-NEXT: xvld $xr0, $a1, 0
72+
; CHECK-NEXT: xvpermi.d $xr0, $xr0, 78
73+
; CHECK-NEXT: xvshuf4i.w $xr0, $xr0, 27
74+
; CHECK-NEXT: xvst $xr0, $a0, 0
75+
; CHECK-NEXT: ret
76+
entry:
77+
%va = load <8 x float>, ptr %a
78+
%b = shufflevector <8 x float> %va, <8 x float> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
79+
store <8 x float> %b, ptr %res
80+
ret void
81+
}
82+
83+
define void @shufflevector_reverse_v4f64(ptr %res, ptr %a) nounwind {
84+
; CHECK-LABEL: shufflevector_reverse_v4f64:
85+
; CHECK: # %bb.0: # %entry
86+
; CHECK-NEXT: xvld $xr0, $a1, 0
87+
; CHECK-NEXT: xvpermi.d $xr0, $xr0, 27
88+
; CHECK-NEXT: xvst $xr0, $a0, 0
89+
; CHECK-NEXT: ret
90+
entry:
91+
%va = load <4 x double>, ptr %a
92+
%b = shufflevector <4 x double> %va, <4 x double> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
93+
store <4 x double> %b, ptr %res
94+
ret void
95+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s | FileCheck %s
3+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx %s -o - | FileCheck %s
4+
5+
define void @shufflevector_reverse_v16i8(ptr %res, ptr %a) nounwind {
6+
; CHECK-LABEL: shufflevector_reverse_v16i8:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: vld $vr0, $a1, 0
9+
; CHECK-NEXT: pcalau12i $a1, %pc_hi20(.LCPI0_0)
10+
; CHECK-NEXT: vld $vr1, $a1, %pc_lo12(.LCPI0_0)
11+
; CHECK-NEXT: vshuf.b $vr0, $vr0, $vr0, $vr1
12+
; CHECK-NEXT: vst $vr0, $a0, 0
13+
; CHECK-NEXT: ret
14+
entry:
15+
%va = load <16 x i8>, ptr %a
16+
%b = shufflevector <16 x i8> %va, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
17+
store <16 x i8> %b, ptr %res
18+
ret void
19+
}
20+
21+
define void @shufflevector_reverse_v8i16(ptr %res, ptr %a) nounwind {
22+
; CHECK-LABEL: shufflevector_reverse_v8i16:
23+
; CHECK: # %bb.0: # %entry
24+
; CHECK-NEXT: vld $vr0, $a1, 0
25+
; CHECK-NEXT: pcalau12i $a1, %pc_hi20(.LCPI1_0)
26+
; CHECK-NEXT: vld $vr1, $a1, %pc_lo12(.LCPI1_0)
27+
; CHECK-NEXT: vshuf.h $vr1, $vr0, $vr0
28+
; CHECK-NEXT: vst $vr1, $a0, 0
29+
; CHECK-NEXT: ret
30+
entry:
31+
%va = load <8 x i16>, ptr %a
32+
%b = shufflevector <8 x i16> %va, <8 x i16> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
33+
store <8 x i16> %b, ptr %res
34+
ret void
35+
}
36+
37+
define void @shufflevector_reverse_v4i32(ptr %res, ptr %a) nounwind {
38+
; CHECK-LABEL: shufflevector_reverse_v4i32:
39+
; CHECK: # %bb.0: # %entry
40+
; CHECK-NEXT: vld $vr0, $a1, 0
41+
; CHECK-NEXT: vshuf4i.w $vr0, $vr0, 27
42+
; CHECK-NEXT: vst $vr0, $a0, 0
43+
; CHECK-NEXT: ret
44+
entry:
45+
%va = load <4 x i32>, ptr %a
46+
%b = shufflevector <4 x i32> %va, <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
47+
store <4 x i32> %b, ptr %res
48+
ret void
49+
}
50+
51+
define void @shufflevector_reverse_v2i64(ptr %res, ptr %a) nounwind {
52+
; CHECK-LABEL: shufflevector_reverse_v2i64:
53+
; CHECK: # %bb.0: # %entry
54+
; CHECK-NEXT: vld $vr0, $a1, 0
55+
; CHECK-NEXT: vshuf4i.d $vr0, $vr0, 1
56+
; CHECK-NEXT: vst $vr0, $a0, 0
57+
; CHECK-NEXT: ret
58+
entry:
59+
%va = load <2 x i64>, ptr %a
60+
%b = shufflevector <2 x i64> %va, <2 x i64> poison, <2 x i32> <i32 1, i32 0>
61+
store <2 x i64> %b, ptr %res
62+
ret void
63+
}
64+
65+
define void @shufflevector_reverse_v4f32(ptr %res, ptr %a) nounwind {
66+
; CHECK-LABEL: shufflevector_reverse_v4f32:
67+
; CHECK: # %bb.0: # %entry
68+
; CHECK-NEXT: vld $vr0, $a1, 0
69+
; CHECK-NEXT: vshuf4i.w $vr0, $vr0, 27
70+
; CHECK-NEXT: vst $vr0, $a0, 0
71+
; CHECK-NEXT: ret
72+
entry:
73+
%va = load <4 x float>, ptr %a
74+
%b = shufflevector <4 x float> %va, <4 x float> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
75+
store <4 x float> %b, ptr %res
76+
ret void
77+
}
78+
79+
define void @shufflevector_reverse_v2f64(ptr %res, ptr %a) nounwind {
80+
; CHECK-LABEL: shufflevector_reverse_v2f64:
81+
; CHECK: # %bb.0: # %entry
82+
; CHECK-NEXT: vld $vr0, $a1, 0
83+
; CHECK-NEXT: vshuf4i.d $vr0, $vr0, 1
84+
; CHECK-NEXT: vst $vr0, $a0, 0
85+
; CHECK-NEXT: ret
86+
entry:
87+
%va = load <2 x double>, ptr %a
88+
%b = shufflevector <2 x double> %va, <2 x double> poison, <2 x i32> <i32 1, i32 0>
89+
store <2 x double> %b, ptr %res
90+
ret void
91+
}

0 commit comments

Comments
 (0)