Add API to check and fold memory operands into instructions.
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Tue, 17 Feb 2004 04:33:18 +0000 (04:33 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Tue, 17 Feb 2004 04:33:18 +0000 (04:33 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11519 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/MRegisterInfo.h
lib/Target/X86/X86RegisterInfo.cpp
lib/Target/X86/X86RegisterInfo.h

index 579400330fb19505b0ee60f227ef08e8fcbec18f..5bd24e181a5844d1eba05413599220d559d3cac6 100644 (file)
@@ -242,6 +242,16 @@ public:
                            const TargetRegisterClass *RC) const = 0;
 
 
+  virtual bool canFoldMemoryOperand(MachineInstr* MI, unsigned i) const {
+    return false;
+  }
+
+  virtual int foldMemoryOperand(MachineInstr* MI,
+                                unsigned i,
+                                int FrameIndex) const {
+    return 0;
+  }
+
   /// getCallFrameSetup/DestroyOpcode - These methods return the opcode of the
   /// frame setup/destroy instructions if they exist (-1 otherwise).  Some
   /// targets use pseudo instructions in order to abstract away the difference
index 59be5fb7c439637e3d4aff07890803f99fa57237..01a3f07d4080284a95c49e8eacf458f74a41099a 100644 (file)
@@ -79,6 +79,87 @@ int X86RegisterInfo::copyRegToReg(MachineBasicBlock &MBB,
   return 1;
 }
 
+bool X86RegisterInfo::canFoldMemoryOperand(MachineInstr* MI,
+                                           unsigned i) const
+{
+  switch(MI->getOpcode()) {
+  case X86::ADDrr8:  case X86::ADDrr16: case X86::ADDrr32:
+  case X86::ADDri8:  case X86::ADDri16: case X86::ADDri32:
+  case X86::MOVrr8:  case X86::MOVrr16: case X86::MOVrr32:
+    return true;
+  default:
+    return false;
+  }
+}
+
+int X86RegisterInfo::foldMemoryOperand(MachineInstr* MI,
+                                       unsigned i,
+                                       int FrameIndex) const
+{
+  MachineBasicBlock& MBB = *MI->getParent();
+  MachineInstr* NI = 0;
+  if (i == 0)
+      switch(MI->getOpcode()) {
+      case X86::MOVrr8:
+    NI = addFrameReference(BuildMI(X86::MOVmr8, 5), FrameIndex).addReg(MI->getOperand(1).getReg());
+    break;
+      case X86::MOVrr16:
+    NI = addFrameReference(BuildMI(X86::MOVmr16, 5), FrameIndex).addReg(MI->getOperand(1).getReg());
+    break;
+      case X86::MOVrr32:
+    NI = addFrameReference(BuildMI(X86::MOVmr32, 5), FrameIndex).addReg(MI->getOperand(1).getReg());
+    break;
+  case X86::ADDrr8:
+    NI = addFrameReference(BuildMI(X86::ADDmr8, 5), FrameIndex).addReg(MI->getOperand(1).getReg());
+    break;
+  case X86::ADDrr16:
+    NI = addFrameReference(BuildMI(X86::ADDmr16, 5), FrameIndex).addReg(MI->getOperand(1).getReg());
+    break;
+  case X86::ADDrr32:
+    NI = addFrameReference(BuildMI(X86::ADDmr32, 5), FrameIndex).addReg(MI->getOperand(1).getReg());
+    break;
+  case X86::ADDri8:
+    NI = addFrameReference(BuildMI(X86::ADDmi8, 5), FrameIndex).addZImm(MI->getOperand(1).getImmedValue());
+    break;
+  case X86::ADDri16:
+    NI = addFrameReference(BuildMI(X86::ADDmi16, 5), FrameIndex).addZImm(MI->getOperand(1).getImmedValue());
+    break;
+  case X86::ADDri32:
+    NI = addFrameReference(BuildMI(X86::ADDmi32, 5), FrameIndex).addZImm(MI->getOperand(1).getImmedValue());
+    break;
+  default:
+    assert(0 && "Operand cannot be folded");
+  }
+  else if (i == 1)
+      switch(MI->getOpcode()) {
+  case X86::MOVrr8:
+    NI = addFrameReference(BuildMI(X86::MOVrm8, 5).addReg(MI->getOperand(0).getReg()), FrameIndex);
+    break;
+  case X86::MOVrr16:
+    NI = addFrameReference(BuildMI(X86::MOVrm16, 5).addReg(MI->getOperand(0).getReg()), FrameIndex);
+    break;
+  case X86::MOVrr32:
+    NI = addFrameReference(BuildMI(X86::MOVrm32, 5).addReg(MI->getOperand(0).getReg()), FrameIndex);
+    break;
+  case X86::ADDrr8:
+    NI = addFrameReference(BuildMI(X86::ADDrm8, 5).addReg(MI->getOperand(0).getReg()), FrameIndex);
+    break;
+  case X86::ADDrr16:
+    NI = addFrameReference(BuildMI(X86::ADDrm16, 5).addReg(MI->getOperand(0).getReg()), FrameIndex);
+    break;
+  case X86::ADDrr32:
+    NI = addFrameReference(BuildMI(X86::ADDrm32, 5).addReg(MI->getOperand(0).getReg()), FrameIndex);
+    break;
+  default:
+    assert(0 && "Operand cannot be folded");
+  }
+  else
+    assert(0 && "Operand cannot be folded");
+
+  MBB.insert(MBB.erase(MI), NI);
+  return 0;
+}
+
 //===----------------------------------------------------------------------===//
 // Stack Frame Processing methods
 //===----------------------------------------------------------------------===//
index 9549555d3f8b12eb079b38a00bee3681be8480bb..711bfe11ebc6e5273bbcc49343d9381403ea667a 100644 (file)
@@ -42,6 +42,11 @@ struct X86RegisterInfo : public X86GenRegisterInfo {
                   unsigned DestReg, unsigned SrcReg,
                   const TargetRegisterClass *RC) const;
 
+  virtual bool canFoldMemoryOperand(MachineInstr* MI, unsigned i) const;
+
+  virtual int foldMemoryOperand(MachineInstr* MI, unsigned i,
+                                int FrameIndex) const;
+
   void eliminateCallFramePseudoInstr(MachineFunction &MF,
                                      MachineBasicBlock &MBB,
                                      MachineBasicBlock::iterator MI) const;