Skip to content

Commit 5581e43

Browse files
authored
[LoongArch][NFC] Pre-commit tests for LSX/LASX bswap codegen (#114170)
1 parent cf3d6fd commit 5581e43

File tree

2 files changed

+172
-0
lines changed

2 files changed

+172
-0
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
3+
4+
define void @bswap_v16i16(ptr %src, ptr %dst) nounwind {
5+
; CHECK-LABEL: bswap_v16i16:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: xvld $xr0, $a0, 0
8+
; CHECK-NEXT: xvsrli.h $xr1, $xr0, 8
9+
; CHECK-NEXT: xvslli.h $xr0, $xr0, 8
10+
; CHECK-NEXT: xvor.v $xr0, $xr0, $xr1
11+
; CHECK-NEXT: xvst $xr0, $a1, 0
12+
; CHECK-NEXT: ret
13+
%v = load <16 x i16>, ptr %src
14+
%res = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> %v)
15+
store <16 x i16> %res, ptr %dst
16+
ret void
17+
}
18+
19+
define void @bswap_v8i32(ptr %src, ptr %dst) nounwind {
20+
; CHECK-LABEL: bswap_v8i32:
21+
; CHECK: # %bb.0:
22+
; CHECK-NEXT: xvld $xr0, $a0, 0
23+
; CHECK-NEXT: lu12i.w $a0, 15
24+
; CHECK-NEXT: ori $a0, $a0, 3840
25+
; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
26+
; CHECK-NEXT: xvsrli.w $xr2, $xr0, 8
27+
; CHECK-NEXT: xvand.v $xr2, $xr2, $xr1
28+
; CHECK-NEXT: xvsrli.w $xr3, $xr0, 24
29+
; CHECK-NEXT: xvor.v $xr2, $xr2, $xr3
30+
; CHECK-NEXT: xvand.v $xr1, $xr0, $xr1
31+
; CHECK-NEXT: xvslli.w $xr1, $xr1, 8
32+
; CHECK-NEXT: xvslli.w $xr0, $xr0, 24
33+
; CHECK-NEXT: xvor.v $xr0, $xr0, $xr1
34+
; CHECK-NEXT: xvor.v $xr0, $xr0, $xr2
35+
; CHECK-NEXT: xvst $xr0, $a1, 0
36+
; CHECK-NEXT: ret
37+
%v = load <8 x i32>, ptr %src
38+
%res = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %v)
39+
store <8 x i32> %res, ptr %dst
40+
ret void
41+
}
42+
43+
define void @bswap_v4i64(ptr %src, ptr %dst) nounwind {
44+
; CHECK-LABEL: bswap_v4i64:
45+
; CHECK: # %bb.0:
46+
; CHECK-NEXT: xvld $xr0, $a0, 0
47+
; CHECK-NEXT: lu12i.w $a0, 4080
48+
; CHECK-NEXT: xvreplgr2vr.d $xr1, $a0
49+
; CHECK-NEXT: xvsrli.d $xr2, $xr0, 24
50+
; CHECK-NEXT: xvand.v $xr2, $xr2, $xr1
51+
; CHECK-NEXT: lu12i.w $a0, -4096
52+
; CHECK-NEXT: lu32i.d $a0, 0
53+
; CHECK-NEXT: xvreplgr2vr.d $xr3, $a0
54+
; CHECK-NEXT: xvsrli.d $xr4, $xr0, 8
55+
; CHECK-NEXT: xvand.v $xr4, $xr4, $xr3
56+
; CHECK-NEXT: xvor.v $xr2, $xr4, $xr2
57+
; CHECK-NEXT: lu12i.w $a0, 15
58+
; CHECK-NEXT: ori $a0, $a0, 3840
59+
; CHECK-NEXT: xvreplgr2vr.d $xr4, $a0
60+
; CHECK-NEXT: xvsrli.d $xr5, $xr0, 40
61+
; CHECK-NEXT: xvand.v $xr5, $xr5, $xr4
62+
; CHECK-NEXT: xvsrli.d $xr6, $xr0, 56
63+
; CHECK-NEXT: xvor.v $xr5, $xr5, $xr6
64+
; CHECK-NEXT: xvor.v $xr2, $xr2, $xr5
65+
; CHECK-NEXT: xvand.v $xr1, $xr0, $xr1
66+
; CHECK-NEXT: xvslli.d $xr1, $xr1, 24
67+
; CHECK-NEXT: xvand.v $xr3, $xr0, $xr3
68+
; CHECK-NEXT: xvslli.d $xr3, $xr3, 8
69+
; CHECK-NEXT: xvor.v $xr1, $xr1, $xr3
70+
; CHECK-NEXT: xvand.v $xr3, $xr0, $xr4
71+
; CHECK-NEXT: xvslli.d $xr3, $xr3, 40
72+
; CHECK-NEXT: xvslli.d $xr0, $xr0, 56
73+
; CHECK-NEXT: xvor.v $xr0, $xr0, $xr3
74+
; CHECK-NEXT: xvor.v $xr0, $xr0, $xr1
75+
; CHECK-NEXT: xvor.v $xr0, $xr0, $xr2
76+
; CHECK-NEXT: xvst $xr0, $a1, 0
77+
; CHECK-NEXT: ret
78+
%v = load <4 x i64>, ptr %src
79+
%res = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %v)
80+
store <4 x i64> %res, ptr %dst
81+
ret void
82+
}
83+
84+
declare <16 x i16> @llvm.bswap.v16i16(<16 x i16>)
85+
declare <8 x i32> @llvm.bswap.v8i32(<8 x i32>)
86+
declare <4 x i64> @llvm.bswap.v4i64(<4 x i64>)
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3+
4+
define void @bswap_v8i16(ptr %src, ptr %dst) nounwind {
5+
; CHECK-LABEL: bswap_v8i16:
6+
; CHECK: # %bb.0:
7+
; CHECK-NEXT: vld $vr0, $a0, 0
8+
; CHECK-NEXT: vsrli.h $vr1, $vr0, 8
9+
; CHECK-NEXT: vslli.h $vr0, $vr0, 8
10+
; CHECK-NEXT: vor.v $vr0, $vr0, $vr1
11+
; CHECK-NEXT: vst $vr0, $a1, 0
12+
; CHECK-NEXT: ret
13+
%v = load <8 x i16>, ptr %src
14+
%res = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %v)
15+
store <8 x i16> %res, ptr %dst
16+
ret void
17+
}
18+
19+
define void @bswap_v4i32(ptr %src, ptr %dst) nounwind {
20+
; CHECK-LABEL: bswap_v4i32:
21+
; CHECK: # %bb.0:
22+
; CHECK-NEXT: vld $vr0, $a0, 0
23+
; CHECK-NEXT: lu12i.w $a0, 15
24+
; CHECK-NEXT: ori $a0, $a0, 3840
25+
; CHECK-NEXT: vreplgr2vr.w $vr1, $a0
26+
; CHECK-NEXT: vsrli.w $vr2, $vr0, 8
27+
; CHECK-NEXT: vand.v $vr2, $vr2, $vr1
28+
; CHECK-NEXT: vsrli.w $vr3, $vr0, 24
29+
; CHECK-NEXT: vor.v $vr2, $vr2, $vr3
30+
; CHECK-NEXT: vand.v $vr1, $vr0, $vr1
31+
; CHECK-NEXT: vslli.w $vr1, $vr1, 8
32+
; CHECK-NEXT: vslli.w $vr0, $vr0, 24
33+
; CHECK-NEXT: vor.v $vr0, $vr0, $vr1
34+
; CHECK-NEXT: vor.v $vr0, $vr0, $vr2
35+
; CHECK-NEXT: vst $vr0, $a1, 0
36+
; CHECK-NEXT: ret
37+
%v = load <4 x i32>, ptr %src
38+
%res = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %v)
39+
store <4 x i32> %res, ptr %dst
40+
ret void
41+
}
42+
43+
define void @bswap_v2i64(ptr %src, ptr %dst) nounwind {
44+
; CHECK-LABEL: bswap_v2i64:
45+
; CHECK: # %bb.0:
46+
; CHECK-NEXT: vld $vr0, $a0, 0
47+
; CHECK-NEXT: lu12i.w $a0, 4080
48+
; CHECK-NEXT: vreplgr2vr.d $vr1, $a0
49+
; CHECK-NEXT: vsrli.d $vr2, $vr0, 24
50+
; CHECK-NEXT: vand.v $vr2, $vr2, $vr1
51+
; CHECK-NEXT: lu12i.w $a0, -4096
52+
; CHECK-NEXT: lu32i.d $a0, 0
53+
; CHECK-NEXT: vreplgr2vr.d $vr3, $a0
54+
; CHECK-NEXT: vsrli.d $vr4, $vr0, 8
55+
; CHECK-NEXT: vand.v $vr4, $vr4, $vr3
56+
; CHECK-NEXT: vor.v $vr2, $vr4, $vr2
57+
; CHECK-NEXT: lu12i.w $a0, 15
58+
; CHECK-NEXT: ori $a0, $a0, 3840
59+
; CHECK-NEXT: vreplgr2vr.d $vr4, $a0
60+
; CHECK-NEXT: vsrli.d $vr5, $vr0, 40
61+
; CHECK-NEXT: vand.v $vr5, $vr5, $vr4
62+
; CHECK-NEXT: vsrli.d $vr6, $vr0, 56
63+
; CHECK-NEXT: vor.v $vr5, $vr5, $vr6
64+
; CHECK-NEXT: vor.v $vr2, $vr2, $vr5
65+
; CHECK-NEXT: vand.v $vr1, $vr0, $vr1
66+
; CHECK-NEXT: vslli.d $vr1, $vr1, 24
67+
; CHECK-NEXT: vand.v $vr3, $vr0, $vr3
68+
; CHECK-NEXT: vslli.d $vr3, $vr3, 8
69+
; CHECK-NEXT: vor.v $vr1, $vr1, $vr3
70+
; CHECK-NEXT: vand.v $vr3, $vr0, $vr4
71+
; CHECK-NEXT: vslli.d $vr3, $vr3, 40
72+
; CHECK-NEXT: vslli.d $vr0, $vr0, 56
73+
; CHECK-NEXT: vor.v $vr0, $vr0, $vr3
74+
; CHECK-NEXT: vor.v $vr0, $vr0, $vr1
75+
; CHECK-NEXT: vor.v $vr0, $vr0, $vr2
76+
; CHECK-NEXT: vst $vr0, $a1, 0
77+
; CHECK-NEXT: ret
78+
%v = load <2 x i64>, ptr %src
79+
%res = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %v)
80+
store <2 x i64> %res, ptr %dst
81+
ret void
82+
}
83+
84+
declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)
85+
declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)
86+
declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)

0 commit comments

Comments
 (0)