Refactor. Get rid of a few more getOpcode() calls.
authorEvan Cheng <evan.cheng@apple.com>
Sun, 26 Jul 2009 18:55:14 +0000 (18:55 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sun, 26 Jul 2009 18:55:14 +0000 (18:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77164 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMBaseRegisterInfo.cpp
lib/Target/ARM/ARMBaseRegisterInfo.h
lib/Target/ARM/Thumb1RegisterInfo.cpp
lib/Target/ARM/Thumb1RegisterInfo.h
lib/Target/ARM/Thumb2RegisterInfo.cpp
lib/Target/ARM/Thumb2RegisterInfo.h

index 2405bd03fd0855b0aec054a9aeedbc3e81ab3e47..2bd407ed3b65840b49e3678ad7056da43c969e11 100644 (file)
@@ -1028,6 +1028,7 @@ unsigned findScratchRegister(RegScavenger *RS, const TargetRegisterClass *RC,
 
 int ARMBaseRegisterInfo::
 rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
+                  unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
                   unsigned FrameReg, int Offset) const 
 {
   unsigned Opcode = MI.getOpcode();
@@ -1039,18 +1040,18 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
   if (Opcode == ARM::INLINEASM)
     AddrMode = ARMII::AddrMode2;
   
-  if (Opcode == getOpcode(ARMII::ADDri)) {
+  if (Opcode == ADDriOpc) {
     Offset += MI.getOperand(FrameRegIdx+1).getImm();
     if (Offset == 0) {
       // Turn it into a move.
-      MI.setDesc(TII.get(getOpcode(ARMII::MOVr)));
+      MI.setDesc(TII.get(MOVOpc));
       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
       MI.RemoveOperand(FrameRegIdx+1);
       return 0;
     } else if (Offset < 0) {
       Offset = -Offset;
       isSub = true;
-      MI.setDesc(TII.get(getOpcode(ARMII::SUBri)));
+      MI.setDesc(TII.get(SUBriOpc));
     }
 
     // Common case: small offset, fits into instruction.
@@ -1144,7 +1145,8 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
 }
 
 void ARMBaseRegisterInfo::
-eliminateFrameIndex(MachineBasicBlock::iterator II,
+eliminateFrameIndexImpl(MachineBasicBlock::iterator II,
+                    unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
                     int SPAdj, RegScavenger *RS) const {
   unsigned i = 0;
   MachineInstr &MI = *II;
@@ -1178,7 +1180,7 @@ eliminateFrameIndex(MachineBasicBlock::iterator II,
   }
 
   // modify MI as necessary to handle as much of 'Offset' as possible
-  Offset = rewriteFrameIndex(MI, i, FrameReg, Offset);
+  Offset = rewriteFrameIndex(MI, i, MOVOpc,ADDriOpc,SUBriOpc, FrameReg, Offset);
   if (Offset == 0)
     return;
 
index b725ee60a7b7edb35080b6d98592232ac76f46d4..59725fe56a12dd747fe3a4366decd56e3144dace 100644 (file)
@@ -128,14 +128,26 @@ public:
 
   // rewrite MI to access 'Offset' bytes from the FP. Return the offset that
   // could not be handled directly in MI.
-  virtual int rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
-                                  unsigned FrameReg, int Offset) const;
-  virtual void eliminateFrameIndex(MachineBasicBlock::iterator II,
-                                   int SPAdj, RegScavenger *RS = NULL) const;
+  virtual int
+  rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
+                    unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
+                    unsigned FrameReg, int Offset) const;
+
+  virtual void
+  eliminateFrameIndex(MachineBasicBlock::iterator II,
+                      int SPAdj, RegScavenger *RS = NULL) const {
+    eliminateFrameIndexImpl(II, ARM::MOVr, ARM::ADDri, ARM::SUBri, SPAdj, RS);
+  }
 
   virtual void emitPrologue(MachineFunction &MF) const;
   virtual void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const;
 
+protected:
+  void
+  eliminateFrameIndexImpl(MachineBasicBlock::iterator II,
+                          unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
+                          int SPAdj, RegScavenger *RS = NULL) const;
+
 private:
   unsigned getRegisterPairEven(unsigned Reg, const MachineFunction &MF) const;
 
index bf721a5e998f8438ff05f87663904cbd59e4c6b8..17949bddeb2986eac5348476731bb041db722ee9 100644 (file)
@@ -388,6 +388,7 @@ static void removeOperands(MachineInstr &MI, unsigned i) {
 
 int Thumb1RegisterInfo::
 rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
+                  unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
                   unsigned FrameReg, int Offset) const 
 {
   // if/when eliminateFrameIndex() conforms with ARMBaseRegisterInfo
index 2832a5bc07ce70c38c5084d1baa8c4ba0fcdce49..ab01a264d3bc4241438c8090e1172184e3b040f8 100644 (file)
@@ -51,7 +51,9 @@ public:
   // rewrite MI to access 'Offset' bytes from the FP. Return the offset that
   // could not be handled directly in MI.
   int rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
+                        unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
                         unsigned FrameReg, int Offset) const;
+
   void eliminateFrameIndex(MachineBasicBlock::iterator II,
                            int SPAdj, RegScavenger *RS = NULL) const;
 
index ce495fae1cbb691060c3c89bffa5bd2a5b0ac182..ae2d21e90cdf77fb581e799a1e7a237d57330abf 100644 (file)
@@ -165,6 +165,7 @@ requiresRegisterScavenging(const MachineFunction &MF) const {
 
 int Thumb2RegisterInfo::
 rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
+                  unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
                   unsigned FrameReg, int Offset) const 
 {
   unsigned Opcode = MI.getOpcode();
@@ -176,18 +177,18 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
   if (Opcode == ARM::INLINEASM)
     AddrMode = ARMII::AddrModeT2_i12; // FIXME. mode for thumb2?
   
-  if (Opcode == getOpcode(ARMII::ADDri)) {
+  if (Opcode == ADDriOpc) {
     Offset += MI.getOperand(FrameRegIdx+1).getImm();
     if (Offset == 0) {
       // Turn it into a move.
-      MI.setDesc(TII.get(ARM::t2MOVr));
+      MI.setDesc(TII.get(MOVOpc));
       MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg, false);
       MI.RemoveOperand(FrameRegIdx+1);
       return 0;
     } else if (Offset < 0) {
       Offset = -Offset;
       isSub = true;
-      MI.setDesc(TII.get(getOpcode(ARMII::SUBri)));
+      MI.setDesc(TII.get(SUBriOpc));
     }
 
     // Common case: small offset, fits into instruction.
@@ -231,7 +232,7 @@ rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
     if ((AddrMode != ARMII::AddrModeT2_i8) &&
         (AddrMode != ARMII::AddrModeT2_i12)) {
       return ARMBaseRegisterInfo::rewriteFrameIndex(MI, FrameRegIdx,
-                                                    FrameReg, Offset);
+                     ARM::t2MOVr, ARM::t2ADDri, ARM::t2SUBri, FrameReg, Offset);
     }
     
     unsigned NumBits = 0;
index 57c066327759700e383762af39cb7438c2786b22..72a1cd1c8067d824abf862f27c99a8b17d714e6e 100644 (file)
@@ -27,11 +27,6 @@ struct Thumb2RegisterInfo : public ARMBaseRegisterInfo {
 public:
   Thumb2RegisterInfo(const ARMBaseInstrInfo &tii, const ARMSubtarget &STI);
 
-  // rewrite MI to access 'Offset' bytes from the FP. Return the offset that
-  // could not be handled directly in MI.
-  int rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
-                        unsigned FrameReg, int Offset) const;
-
   /// emitLoadConstPool - Emits a load from constpool to materialize the
   /// specified immediate.
   void emitLoadConstPool(MachineBasicBlock &MBB,
@@ -42,6 +37,19 @@ public:
                          unsigned PredReg = 0) const;
 
   bool requiresRegisterScavenging(const MachineFunction &MF) const;
+
+  // rewrite MI to access 'Offset' bytes from the FP. Return the offset that
+  // could not be handled directly in MI.
+  virtual int
+  rewriteFrameIndex(MachineInstr &MI, unsigned FrameRegIdx,
+                    unsigned MOVOpc, unsigned ADDriOpc, unsigned SUBriOpc,
+                    unsigned FrameReg, int Offset) const;
+
+  void eliminateFrameIndex(MachineBasicBlock::iterator II,
+                           int SPAdj, RegScavenger *RS = NULL) const {
+    ARMBaseRegisterInfo::eliminateFrameIndexImpl(II, ARM::t2MOVr, ARM::t2ADDri,
+                                                 ARM::t2SUBri, SPAdj, RS);
+  }
 };
 }