Implement asmprinting for odd-even regpairs
authorAnton Korobeynikov <asl@math.spbu.ru>
Thu, 16 Jul 2009 14:04:01 +0000 (14:04 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Thu, 16 Jul 2009 14:04:01 +0000 (14:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75974 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp
lib/Target/SystemZ/SystemZInstrInfo.td
lib/Target/SystemZ/SystemZRegisterInfo.h

index 8306e26b98c5b0f2a91d5c3abece7be28a6d2f5c..f98d4ed7156ecba4c076ffb9851b47e52eb9e126 100644 (file)
@@ -181,11 +181,22 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
                                      const char* Modifier) {
   const MachineOperand &MO = MI->getOperand(OpNum);
   switch (MO.getType()) {
-  case MachineOperand::MO_Register:
+  case MachineOperand::MO_Register: {
     assert (TargetRegisterInfo::isPhysicalRegister(MO.getReg()) &&
             "Virtual registers should be already mapped!");
-    O << '%' << TM.getRegisterInfo()->get(MO.getReg()).AsmName;
+    unsigned Reg = MO.getReg();
+    if (Modifier && strncmp(Modifier, "subreg", 6) == 0) {
+      if (strncmp(Modifier + 7, "even", 4) == 0)
+        Reg = TRI->getSubReg(Reg, SystemZ::SUBREG_EVEN);
+      else if (strncmp(Modifier + 7, "odd", 3) == 0)
+        Reg = TRI->getSubReg(Reg, SystemZ::SUBREG_ODD);
+      else
+        assert(0 && "Invalid subreg modifier");
+    }
+
+    O << '%' << TRI->getAsmName(Reg);
     return;
+  }
   case MachineOperand::MO_Immediate:
     O << MO.getImm();
     return;
index 2c08c2fe601d86f8e48b4910c40817faebab32bc..6055b00eaa30a38ed52adcb22aea1ddae42648db 100644 (file)
@@ -366,14 +366,14 @@ def MOV64rr : Pseudo<(outs GR64:$dst), (ins GR64:$src),
                      "lgr\t{$dst, $src}",
                      []>;
 def MOV128rr : Pseudo<(outs GR128:$dst), (ins GR128:$src),
-                     "# MOV128 PSEUDO!"
-                     "lgr\t{$dst:subreg_odd, $src:subreg_odd}\n"
-                     "lgr\t{$dst:subreg_even, $src:subreg_even}",
+                     "# MOV128 PSEUDO!\n"
+                     "\tlgr\t${dst:subreg_odd}, ${src:subreg_odd}\n"
+                     "\tlgr\t${dst:subreg_even}, ${src:subreg_even}",
                      []>;
 def MOV64rrP : Pseudo<(outs GR64P:$dst), (ins GR64P:$src),
-                     "# MOV64P PSEUDO!"
-                     "lr\t{$dst:subreg_odd, $src:subreg_odd}\n"
-                     "lr\t{$dst:subreg_even, $src:subreg_even}",
+                     "# MOV64P PSEUDO!\n"
+                     "\tlr\t${dst:subreg_odd}, ${src:subreg_odd}\n"
+                     "\tlr\t${dst:subreg_even}, ${src:subreg_even}",
                      []>;
 }
 
@@ -554,7 +554,7 @@ def ADD64rr : Pseudo<(outs GR64:$dst), (ins GR64:$src1, GR64:$src2),
 
 // FIXME: Provide proper encoding!
 def ADD32ri16 : Pseudo<(outs GR32:$dst), (ins GR32:$src1, s16imm:$src2),
-                       "ahi\t{$dst, $src2:}",
+                       "ahi\t{$dst, $src2}",
                        [(set GR32:$dst, (add GR32:$src1, immSExt16:$src2)),
                         (implicit PSW)]>;
 def ADD32ri   : Pseudo<(outs GR32:$dst), (ins GR32:$src1, s32imm:$src2),
index d800f2939893c85a583b2c090c3da232028c9818..9430c87463683dbd1de516d592f7ed0d028a527d 100644 (file)
 
 namespace llvm {
 
+namespace SystemZ {
+  /// SubregIndex - The index of various sized subregister classes. Note that
+  /// these indices must be kept in sync with the class indices in the
+  /// SystemZRegisterInfo.td file.
+  enum SubregIndex {
+    SUBREG_32BIT = 1, SUBREG_EVEN = 1, SUBREG_ODD = 2
+  };
+}
+
 class SystemZSubtarget;
 class TargetInstrInfo;
 class Type;