[systemz] Distinguish the 'Q', 'R', 'S', and 'T' inline assembly memory constraints.
authorDaniel Sanders <daniel.sanders@imgtec.com>
Tue, 17 Mar 2015 16:16:14 +0000 (16:16 +0000)
committerDaniel Sanders <daniel.sanders@imgtec.com>
Tue, 17 Mar 2015 16:16:14 +0000 (16:16 +0000)
Summary:
But still handle them the same way since I don't know how they differ on
this target.

No functional change intended.

Reviewers: uweigand

Reviewed By: uweigand

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D8251

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232495 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/InlineAsm.h
lib/Target/SystemZ/SystemZISelDAGToDAG.cpp
lib/Target/SystemZ/SystemZISelLowering.h

index bdb75dbc5b24937dec21585669882e441130e576..46367c1ad7b0f5eaa556af5ff9c2c3f09d4a83b7 100644 (file)
@@ -245,6 +245,9 @@ public:
     Constraint_o,
     Constraint_v,
     Constraint_Q,
+    Constraint_R,
+    Constraint_S,
+    Constraint_T,
     Constraint_Z,
     Constraint_Zy,
     Constraints_Max = Constraint_Zy,
index cd0cac69c9bee4929116919937c747239e249d52..a52aa2560bc7f08f0e30d3eb587983b4e3c4aeba 100644 (file)
@@ -1131,17 +1131,27 @@ bool SystemZDAGToDAGISel::
 SelectInlineAsmMemoryOperand(const SDValue &Op,
                              unsigned ConstraintID,
                              std::vector<SDValue> &OutOps) {
-  assert(ConstraintID == InlineAsm::Constraint_m &&
-         "Unexpected constraint code");
-  // Accept addresses with short displacements, which are compatible
-  // with Q, R, S and T.  But keep the index operand for future expansion.
-  SDValue Base, Disp, Index;
-  if (!selectBDXAddr(SystemZAddressingMode::FormBD,
-                     SystemZAddressingMode::Disp12Only,
-                     Op, Base, Disp, Index))
-    return true;
-  OutOps.push_back(Base);
-  OutOps.push_back(Disp);
-  OutOps.push_back(Index);
-  return false;
+  switch(ConstraintID) {
+  default:
+    llvm_unreachable("Unexpected asm memory constraint");
+  case InlineAsm::Constraint_i:
+  case InlineAsm::Constraint_m:
+  case InlineAsm::Constraint_Q:
+  case InlineAsm::Constraint_R:
+  case InlineAsm::Constraint_S:
+  case InlineAsm::Constraint_T:
+    // Accept addresses with short displacements, which are compatible
+    // with Q, R, S and T.  But keep the index operand for future expansion.
+    SDValue Base, Disp, Index;
+    if (selectBDXAddr(SystemZAddressingMode::FormBD,
+                      SystemZAddressingMode::Disp12Only,
+                      Op, Base, Disp, Index)) {
+      OutOps.push_back(Base);
+      OutOps.push_back(Disp);
+      OutOps.push_back(Index);
+      return false;
+    }
+    break;
+  }
+  return true;
 }
index 123c1df2ed0c0424aaca0eabddd24b809dfbffb9..23c62c99fa5d215009b0579745b10e1c88cc2a44 100644 (file)
@@ -236,8 +236,21 @@ public:
 
   unsigned getInlineAsmMemConstraint(
       const std::string &ConstraintCode) const override {
-    // FIXME: Map different constraints differently.
-    return InlineAsm::Constraint_m;
+    if (ConstraintCode.size() == 1) {
+      switch(ConstraintCode[0]) {
+      default:
+        break;
+      case 'Q':
+        return InlineAsm::Constraint_Q;
+      case 'R':
+        return InlineAsm::Constraint_R;
+      case 'S':
+        return InlineAsm::Constraint_S;
+      case 'T':
+        return InlineAsm::Constraint_T;
+      }
+    }
+    return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
   }
 
   MachineBasicBlock *EmitInstrWithCustomInserter(MachineInstr *MI,