Skip to content

Commit b22448c

Browse files
authored
[PowerPC] Add intrinsic definition for load and store with Right Length Left-justified (#148873)
1 parent 1327288 commit b22448c

File tree

3 files changed

+200
-0
lines changed

3 files changed

+200
-0
lines changed

llvm/include/llvm/IR/IntrinsicsPowerPC.td

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1358,6 +1358,18 @@ def int_ppc_vsx_lxvll :
13581358
def int_ppc_vsx_lxvp :
13591359
DefaultAttrsIntrinsic<[llvm_v256i1_ty], [llvm_ptr_ty],
13601360
[IntrReadMem, IntrArgMemOnly]>;
1361+
def int_ppc_vsx_lxvrl :
1362+
DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty],
1363+
[IntrReadMem, IntrArgMemOnly]>;
1364+
def int_ppc_vsx_lxvrll :
1365+
DefaultAttrsIntrinsic<[llvm_v4i32_ty], [llvm_ptr_ty, llvm_i64_ty],
1366+
[IntrReadMem, IntrArgMemOnly]>;
1367+
def int_ppc_vsx_lxvprl :
1368+
DefaultAttrsIntrinsic<[llvm_v256i1_ty], [llvm_ptr_ty, llvm_i64_ty],
1369+
[IntrReadMem, IntrArgMemOnly]>;
1370+
def int_ppc_vsx_lxvprll :
1371+
DefaultAttrsIntrinsic<[llvm_v256i1_ty], [llvm_ptr_ty, llvm_i64_ty],
1372+
[IntrReadMem, IntrArgMemOnly]>;
13611373

13621374
// Vector store.
13631375
def int_ppc_vsx_stxvw4x : Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty],
@@ -1377,6 +1389,19 @@ def int_ppc_vsx_stxvll :
13771389
def int_ppc_vsx_stxvp :
13781390
Intrinsic<[], [llvm_v256i1_ty, llvm_ptr_ty], [IntrWriteMem,
13791391
IntrArgMemOnly]>;
1392+
def int_ppc_vsx_stxvrl :
1393+
Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
1394+
[IntrWriteMem, IntrArgMemOnly]>;
1395+
def int_ppc_vsx_stxvrll :
1396+
Intrinsic<[], [llvm_v4i32_ty, llvm_ptr_ty, llvm_i64_ty],
1397+
[IntrWriteMem, IntrArgMemOnly]>;
1398+
def int_ppc_vsx_stxvprl :
1399+
Intrinsic<[], [llvm_v256i1_ty, llvm_ptr_ty, llvm_i64_ty], [IntrWriteMem,
1400+
IntrArgMemOnly]>;
1401+
def int_ppc_vsx_stxvprll :
1402+
Intrinsic<[], [llvm_v256i1_ty, llvm_ptr_ty, llvm_i64_ty], [IntrWriteMem,
1403+
IntrArgMemOnly]>;
1404+
13801405
// Vector and scalar maximum.
13811406
def int_ppc_vsx_xvmaxdp : PowerPC_VSX_Vec_DDD_Intrinsic<"xvmaxdp">;
13821407
def int_ppc_vsx_xvmaxsp : PowerPC_VSX_Vec_FFF_Intrinsic<"xvmaxsp">;

llvm/lib/Target/PowerPC/PPCInstrFuture.td

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,21 @@ let Predicates = [HasVSX, IsISAFuture] in {
192192
: VXForm_VRTAB5<323, (outs vrrc:$VRT), (ins vrrc:$VRA, vrrc:$VRB),
193193
"vucmprlh $VRT, $VRA, $VRB", []>;
194194
}
195+
196+
//---------------------------- Anonymous Patterns ----------------------------//
197+
198+
// Load/Store VSX Vector with Right Length (Left-justified).
199+
def : Pat<(v4i32 (int_ppc_vsx_lxvrl addr:$RA, i64:$RB)), (LXVRL $RA, $RB)>;
200+
def : Pat<(v4i32 (int_ppc_vsx_lxvrll addr:$RA, i64:$RB)), (LXVRLL $RA, $RB)>;
201+
def : Pat<(int_ppc_vsx_stxvrl v4i32:$XT, addr:$RA, i64:$RB), (STXVRL $XT, $RA,
202+
$RB)>;
203+
def : Pat<(int_ppc_vsx_stxvrll v4i32:$XT, addr:$RA, i64:$RB), (STXVRLL $XT, $RA,
204+
$RB)>;
205+
206+
// Load/Store VSX Vector pair with Right Length (Left-justified).
207+
def : Pat<(v256i1 (int_ppc_vsx_lxvprl addr:$RA, i64:$RB)), (LXVPRL $RA, $RB)>;
208+
def : Pat<(v256i1 (int_ppc_vsx_lxvprll addr:$RA, i64:$RB)), (LXVPRLL $RA, $RB)>;
209+
def : Pat<(int_ppc_vsx_stxvprl v256i1:$XTp, addr:$RA, i64:$RB), (STXVPRL $XTp,
210+
$RA, $RB)>;
211+
def : Pat<(int_ppc_vsx_stxvprll v256i1:$XTp, addr:$RA, i64:$RB), (STXVPRLL $XTp,
212+
$RA, $RB)>;
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \
3+
; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr -mcpu=future < %s | \
4+
; RUN: FileCheck %s
5+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff \
6+
; RUN: -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr -mcpu=future < %s | \
7+
; RUN: FileCheck %s --check-prefix=AIX
8+
9+
; Test for load/store to/from v4i32.
10+
11+
define <4 x i32> @testLXVRL(ptr %a, i64 %b) {
12+
; CHECK-LABEL: testLXVRL:
13+
; CHECK: # %bb.0: # %entry
14+
; CHECK-NEXT: lxvrl v2, r3, r4
15+
; CHECK-NEXT: blr
16+
;
17+
; AIX-LABEL: testLXVRL:
18+
; AIX: # %bb.0: # %entry
19+
; AIX-NEXT: lxvrl v2, r3, r4
20+
; AIX-NEXT: blr
21+
entry:
22+
%0 = tail call <4 x i32> @llvm.ppc.vsx.lxvrl(ptr %a, i64 %b)
23+
ret <4 x i32> %0
24+
}
25+
declare <4 x i32> @llvm.ppc.vsx.lxvrl(ptr, i64)
26+
27+
define <4 x i32> @testLXVRLL(ptr %a, i64 %b) {
28+
; CHECK-LABEL: testLXVRLL:
29+
; CHECK: # %bb.0: # %entry
30+
; CHECK-NEXT: lxvrll v2, r3, r4
31+
; CHECK-NEXT: blr
32+
;
33+
; AIX-LABEL: testLXVRLL:
34+
; AIX: # %bb.0: # %entry
35+
; AIX-NEXT: lxvrll v2, r3, r4
36+
; AIX-NEXT: blr
37+
entry:
38+
%0 = tail call <4 x i32> @llvm.ppc.vsx.lxvrll(ptr %a, i64 %b)
39+
ret <4 x i32> %0
40+
}
41+
declare <4 x i32> @llvm.ppc.vsx.lxvrll(ptr, i64)
42+
43+
define void @testSTXVRL(<4 x i32> %a, ptr %b, i64 %c) {
44+
; CHECK-LABEL: testSTXVRL:
45+
; CHECK: # %bb.0: # %entry
46+
; CHECK-NEXT: stxvrl v2, r5, r6
47+
; CHECK-NEXT: blr
48+
;
49+
; AIX-LABEL: testSTXVRL:
50+
; AIX: # %bb.0: # %entry
51+
; AIX-NEXT: stxvrl v2, r3, r4
52+
; AIX-NEXT: blr
53+
entry:
54+
tail call void @llvm.ppc.vsx.stxvrl(<4 x i32> %a, ptr %b, i64 %c)
55+
ret void
56+
}
57+
declare void @llvm.ppc.vsx.stxvrl(<4 x i32>, ptr, i64)
58+
59+
define void @testSTXVRLL(<4 x i32> %a, ptr %b, i64 %c) {
60+
; CHECK-LABEL: testSTXVRLL:
61+
; CHECK: # %bb.0: # %entry
62+
; CHECK-NEXT: stxvrll v2, r5, r6
63+
; CHECK-NEXT: blr
64+
;
65+
; AIX-LABEL: testSTXVRLL:
66+
; AIX: # %bb.0: # %entry
67+
; AIX-NEXT: stxvrll v2, r3, r4
68+
; AIX-NEXT: blr
69+
entry:
70+
tail call void @llvm.ppc.vsx.stxvrll(<4 x i32> %a, ptr %b, i64 %c)
71+
ret void
72+
}
73+
declare void @llvm.ppc.vsx.stxvrll(<4 x i32>, ptr, i64)
74+
75+
; Test for load/store vectore pair.
76+
77+
define <256 x i1> @testLXVPRL(ptr %vpp, i64 %b) {
78+
; CHECK-LABEL: testLXVPRL:
79+
; CHECK: # %bb.0: # %entry
80+
; CHECK-NEXT: lxvprl vsp34, r4, r5
81+
; CHECK-NEXT: stxv v2, 16(r3)
82+
; CHECK-NEXT: stxv v3, 0(r3)
83+
; CHECK-NEXT: blr
84+
;
85+
; AIX-LABEL: testLXVPRL:
86+
; AIX: # %bb.0: # %entry
87+
; AIX-NEXT: lxvprl vsp34, r4, r5
88+
; AIX-NEXT: stxv v3, 16(r3)
89+
; AIX-NEXT: stxv v2, 0(r3)
90+
; AIX-NEXT: blr
91+
entry:
92+
%0 = tail call <256 x i1> @llvm.ppc.vsx.lxvprl(ptr %vpp, i64 %b)
93+
ret <256 x i1> %0
94+
}
95+
declare <256 x i1> @llvm.ppc.vsx.lxvprl(ptr, i64)
96+
97+
define <256 x i1> @testLXVPRLL(ptr %vpp, i64 %b) {
98+
; CHECK-LABEL: testLXVPRLL:
99+
; CHECK: # %bb.0: # %entry
100+
; CHECK-NEXT: lxvprll vsp34, r4, r5
101+
; CHECK-NEXT: stxv v2, 16(r3)
102+
; CHECK-NEXT: stxv v3, 0(r3)
103+
; CHECK-NEXT: blr
104+
;
105+
; AIX-LABEL: testLXVPRLL:
106+
; AIX: # %bb.0: # %entry
107+
; AIX-NEXT: lxvprll vsp34, r4, r5
108+
; AIX-NEXT: stxv v3, 16(r3)
109+
; AIX-NEXT: stxv v2, 0(r3)
110+
; AIX-NEXT: blr
111+
entry:
112+
%0 = tail call <256 x i1> @llvm.ppc.vsx.lxvprll(ptr %vpp, i64 %b)
113+
ret <256 x i1> %0
114+
}
115+
declare <256 x i1> @llvm.ppc.vsx.lxvprll(ptr, i64)
116+
117+
define void @testSTXVPRL(ptr %v, ptr %vp, i64 %len) {
118+
; CHECK-LABEL: testSTXVPRL:
119+
; CHECK: # %bb.0: # %entry
120+
; CHECK-NEXT: lxv v2, 16(r3)
121+
; CHECK-NEXT: lxv v3, 0(r3)
122+
; CHECK-NEXT: stxvprl vsp34, r4, r5
123+
; CHECK-NEXT: blr
124+
;
125+
; AIX-LABEL: testSTXVPRL:
126+
; AIX: # %bb.0: # %entry
127+
; AIX-NEXT: lxv v2, 0(r3)
128+
; AIX-NEXT: lxv v3, 16(r3)
129+
; AIX-NEXT: stxvprl vsp34, r4, r5
130+
; AIX-NEXT: blr
131+
entry:
132+
%0 = load <256 x i1>, ptr %v, align 32
133+
tail call void @llvm.ppc.vsx.stxvprl(<256 x i1> %0, ptr %vp, i64 %len)
134+
ret void
135+
}
136+
declare void @llvm.ppc.vsx.stxvprl(<256 x i1>, ptr, i64)
137+
138+
define void @testSTXVPRLL(ptr %v, ptr %vp, i64 %len) {
139+
; CHECK-LABEL: testSTXVPRLL:
140+
; CHECK: # %bb.0: # %entry
141+
; CHECK-NEXT: lxv v2, 16(r3)
142+
; CHECK-NEXT: lxv v3, 0(r3)
143+
; CHECK-NEXT: stxvprll vsp34, r4, r5
144+
; CHECK-NEXT: blr
145+
;
146+
; AIX-LABEL: testSTXVPRLL:
147+
; AIX: # %bb.0: # %entry
148+
; AIX-NEXT: lxv v2, 0(r3)
149+
; AIX-NEXT: lxv v3, 16(r3)
150+
; AIX-NEXT: stxvprll vsp34, r4, r5
151+
; AIX-NEXT: blr
152+
entry:
153+
%0 = load <256 x i1>, ptr %v, align 32
154+
tail call void @llvm.ppc.vsx.stxvprll(<256 x i1> %0, ptr %vp, i64 %len)
155+
ret void
156+
}
157+
declare void @llvm.ppc.vsx.stxvprll(<256 x i1>, ptr, i64)

0 commit comments

Comments
 (0)