summaryrefslogtreecommitdiff
path: root/lib/Target/SystemZ/SystemZISelLowering.cpp
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-07-08 09:35:23 +0000
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-07-08 09:35:23 +0000
commitdff0009d0ced62b92cb5900bc2203ec40142ba15 (patch)
treed79c3350233490455c9b9c623ff5376369b3f1c2 /lib/Target/SystemZ/SystemZISelLowering.cpp
parent12b701beea6f26d2305dc18cf09838da1d068006 (diff)
downloadllvm-dff0009d0ced62b92cb5900bc2203ec40142ba15.tar.gz
llvm-dff0009d0ced62b92cb5900bc2203ec40142ba15.tar.bz2
llvm-dff0009d0ced62b92cb5900bc2203ec40142ba15.tar.xz
[SystemZ] Use MVC for memcpy
Use MVC for memcpy in cases where a single MVC is enough. Using MVC is a win for longer copies too, but I'll leave that for later. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185802 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SystemZ/SystemZISelLowering.cpp')
-rw-r--r--lib/Target/SystemZ/SystemZISelLowering.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/Target/SystemZ/SystemZISelLowering.cpp b/lib/Target/SystemZ/SystemZISelLowering.cpp
index 256c27829d..b49e6a0e21 100644
--- a/lib/Target/SystemZ/SystemZISelLowering.cpp
+++ b/lib/Target/SystemZ/SystemZISelLowering.cpp
@@ -241,6 +241,12 @@ SystemZTargetLowering::SystemZTargetLowering(SystemZTargetMachine &tm)
setOperationAction(ISD::VASTART, MVT::Other, Custom);
setOperationAction(ISD::VACOPY, MVT::Other, Custom);
setOperationAction(ISD::VAEND, MVT::Other, Expand);
+
+ // We want to use MVC in preference to even a single load/store pair.
+ MaxStoresPerMemcpy = 0;
+ MaxStoresPerMemcpyOptSize = 0;
+ MaxStoresPerMemmove = 0;
+ MaxStoresPerMemmoveOptSize = 0;
}
bool SystemZTargetLowering::isFPImmLegal(const APFloat &Imm, EVT VT) const {
@@ -1579,6 +1585,7 @@ const char *SystemZTargetLowering::getTargetNodeName(unsigned Opcode) const {
OPCODE(SDIVREM64);
OPCODE(UDIVREM32);
OPCODE(UDIVREM64);
+ OPCODE(MVC);
OPCODE(ATOMIC_SWAPW);
OPCODE(ATOMIC_LOADW_ADD);
OPCODE(ATOMIC_LOADW_SUB);
@@ -2143,6 +2150,26 @@ SystemZTargetLowering::emitExt128(MachineInstr *MI,
return MBB;
}
+MachineBasicBlock *
+SystemZTargetLowering::emitMVCWrapper(MachineInstr *MI,
+ MachineBasicBlock *MBB) const {
+ const SystemZInstrInfo *TII = TM.getInstrInfo();
+ DebugLoc DL = MI->getDebugLoc();
+
+ MachineOperand DestBase = MI->getOperand(0);
+ uint64_t DestDisp = MI->getOperand(1).getImm();
+ MachineOperand SrcBase = MI->getOperand(2);
+ uint64_t SrcDisp = MI->getOperand(3).getImm();
+ uint64_t Length = MI->getOperand(4).getImm();
+
+ BuildMI(*MBB, MI, DL, TII->get(SystemZ::MVC))
+ .addOperand(DestBase).addImm(DestDisp).addImm(Length)
+ .addOperand(SrcBase).addImm(SrcDisp);
+
+ MI->eraseFromParent();
+ return MBB;
+}
+
MachineBasicBlock *SystemZTargetLowering::
EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const {
switch (MI->getOpcode()) {
@@ -2376,6 +2403,8 @@ EmitInstrWithCustomInserter(MachineInstr *MI, MachineBasicBlock *MBB) const {
MI->getOperand(1).getMBB()))
MI->eraseFromParent();
return MBB;
+ case SystemZ::MVCWrapper:
+ return emitMVCWrapper(MI, MBB);
default:
llvm_unreachable("Unexpected instr type to insert");
}