forked from OSchip/llvm-project
[systemz] Distinguish the 'Q', 'R', 'S', and 'T' inline assembly memory constraints.
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 llvm-svn: 232495
This commit is contained in:
parent
b664ebf9c2
commit
2eeace219d
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue