[PATCH] D93547: [VE] Support copy of vector mask registers
Kazushi Marukawa via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 18 08:03:15 PST 2020
kaz7 created this revision.
kaz7 added reviewers: simoll, k-ishizaka.
kaz7 added projects: LLVM, VE.
Herald added a subscriber: hiraditya.
kaz7 requested review of this revision.
Herald added a subscriber: llvm-commits.
Support VM and VMP registers in copyPhysReg() function. Also add
regression tests.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D93547
Files:
llvm/lib/Target/VE/VEInstrInfo.cpp
llvm/test/CodeGen/VE/Vector/fastcc_callee.ll
Index: llvm/test/CodeGen/VE/Vector/fastcc_callee.ll
===================================================================
--- llvm/test/CodeGen/VE/Vector/fastcc_callee.ll
+++ llvm/test/CodeGen/VE/Vector/fastcc_callee.ll
@@ -120,3 +120,20 @@
; define <256 x i32> @vreg_arg_v256i32_r8(<256 x i32> %p0, <256 x i32> %p1, <256 x i32> %p2, <256 x i32> %p3, <256 x i32> %p4, <256 x i32> %p5, <256 x i32> %p6, <256 x i32> %p7, <256 x i32> %p8) {
; ret <256 x i32> %p8
; }
+
+define fastcc <256 x i1> @vreg_arg_v256i1_vm7(<256 x i1> %vm1, <256 x i1> %vm2, <256 x i1> %vm3, <256 x i1> %vm4, <256 x i1> %vm5, <256 x i1> %vm6, <256 x i1> %vm7, <256 x i1> %vm8) {
+; CHECK-LABEL: vreg_arg_v256i1_vm7:
+; CHECK: # %bb.0:
+; CHECK-NEXT: andm %vm1, %vm0, %vm6
+; CHECK-NEXT: b.l.t (, %s10)
+ ret <256 x i1> %vm6
+}
+
+define fastcc <512 x i1> @vreg_arg_v512i1_vmp3(<512 x i1> %vmp1, <512 x i1> %vmp2, <512 x i1> %vmp3, <512 x i1> %vmp4) {
+; CHECK-LABEL: vreg_arg_v512i1_vmp3:
+; CHECK: # %bb.0:
+; CHECK-NEXT: andm %vm2, %vm0, %vm6
+; CHECK-NEXT: andm %vm3, %vm0, %vm7
+; CHECK-NEXT: b.l.t (, %s10)
+ ret <512 x i1> %vmp3
+}
Index: llvm/lib/Target/VE/VEInstrInfo.cpp
===================================================================
--- llvm/lib/Target/VE/VEInstrInfo.cpp
+++ llvm/lib/Target/VE/VEInstrInfo.cpp
@@ -341,6 +341,11 @@
MachineInstrBuilder MIB =
BuildMI(MBB, I, DL, MCID, SubDest).addReg(SubSrc).addImm(0);
MovMI = MIB.getInstr();
+ } else if (MCID.getOpcode() == VE::ANDMmm) {
+ // generate "ANDM, dest, vm0, src" instruction.
+ MachineInstrBuilder MIB =
+ BuildMI(MBB, I, DL, MCID, SubDest).addReg(VE::VM0).addReg(SubSrc);
+ MovMI = MIB.getInstr();
} else {
llvm_unreachable("Unexpected reg-to-reg copy instruction");
}
@@ -379,6 +384,16 @@
.addReg(SrcReg, getKillRegState(KillSrc))
.addReg(SubTmp, getKillRegState(true));
MIB.getInstr()->addRegisterKilled(TmpReg, TRI, true);
+ } else if (VE::VMRegClass.contains(DestReg, SrcReg)) {
+ BuildMI(MBB, I, DL, get(VE::ANDMmm), DestReg)
+ .addReg(VE::VM0)
+ .addReg(SrcReg, getKillRegState(KillSrc));
+ } else if (VE::VM512RegClass.contains(DestReg, SrcReg)) {
+ // Use two instructions.
+ const unsigned SubRegIdx[] = {VE::sub_vm_even, VE::sub_vm_odd};
+ unsigned int NumSubRegs = 2;
+ copyPhysSubRegs(MBB, I, DL, DestReg, SrcReg, KillSrc, get(VE::ANDMmm),
+ NumSubRegs, SubRegIdx, &getRegisterInfo());
} else if (VE::F128RegClass.contains(DestReg, SrcReg)) {
// Use two instructions.
const unsigned SubRegIdx[] = {VE::sub_even, VE::sub_odd};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D93547.312801.patch
Type: text/x-patch
Size: 2729 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201218/32802a13/attachment.bin>
More information about the llvm-commits
mailing list