mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Have LowerOperandForConstraint handle multiple character constraints.
Part of rdar://9119939 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132510 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4f3fb6d08b
commit
100c833416
@ -1449,7 +1449,7 @@ public:
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op, char ConstraintLetter,
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -5936,7 +5936,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
|
||||
if (OpInfo.ConstraintType == TargetLowering::C_Other) {
|
||||
std::vector<SDValue> Ops;
|
||||
TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode[0],
|
||||
TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode,
|
||||
Ops, DAG);
|
||||
if (Ops.empty())
|
||||
report_fatal_error("Invalid operand for inline asm constraint '" +
|
||||
|
@ -2650,9 +2650,13 @@ const char *TargetLowering::LowerXConstraint(EVT ConstraintVT) const{
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
|
||||
if (Constraint.length() > 1) return;
|
||||
|
||||
char ConstraintLetter = Constraint[0];
|
||||
switch (ConstraintLetter) {
|
||||
default: break;
|
||||
case 'X': // Allows any operand; labels (basic block) use this.
|
||||
@ -3091,7 +3095,7 @@ static void ChooseConstraint(TargetLowering::AsmOperandInfo &OpInfo,
|
||||
assert(OpInfo.Codes[i].size() == 1 &&
|
||||
"Unhandled multi-letter 'other' constraint");
|
||||
std::vector<SDValue> ResultOps;
|
||||
TLI.LowerAsmOperandForConstraint(Op, OpInfo.Codes[i][0],
|
||||
TLI.LowerAsmOperandForConstraint(Op, OpInfo.Codes[i],
|
||||
ResultOps, *DAG);
|
||||
if (!ResultOps.empty()) {
|
||||
BestType = CType;
|
||||
|
@ -7376,12 +7376,16 @@ getRegClassForInlineAsmConstraint(const std::string &Constraint,
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char Constraint,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue>&Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue Result(0, 0);
|
||||
|
||||
switch (Constraint) {
|
||||
// Currently only support length 1 constraints.
|
||||
if (Constraint.length() != 1) return;
|
||||
|
||||
char ConstraintLetter = Constraint[0];
|
||||
switch (ConstraintLetter) {
|
||||
default: break;
|
||||
case 'I': case 'J': case 'K': case 'L':
|
||||
case 'M': case 'N': case 'O':
|
||||
@ -7396,7 +7400,7 @@ void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
if (CVal != CVal64)
|
||||
return;
|
||||
|
||||
switch (Constraint) {
|
||||
switch (ConstraintLetter) {
|
||||
case 'I':
|
||||
if (Subtarget->isThumb1Only()) {
|
||||
// This must be a constant between 0 and 255, for ADD
|
||||
|
@ -315,7 +315,7 @@ namespace llvm {
|
||||
/// true it means one of the asm constraint of the inline asm instruction
|
||||
/// being processed is 'm'.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -3204,11 +3204,11 @@ SPUTargetLowering::ComputeNumSignBitsForTargetNode(SDValue Op,
|
||||
// LowerAsmOperandForConstraint
|
||||
void
|
||||
SPUTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
// Default, for the time being, to the base class handler
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, ConstraintLetter, Ops, DAG);
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
||||
}
|
||||
|
||||
/// isLegalAddressImmediate - Return true if the integer value can be used
|
||||
|
@ -141,7 +141,7 @@ namespace llvm {
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
EVT VT) const;
|
||||
|
||||
void LowerAsmOperandForConstraint(SDValue Op, char ConstraintLetter,
|
||||
void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -5439,10 +5439,16 @@ PPCTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op, char Letter,
|
||||
void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue>&Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue Result(0,0);
|
||||
|
||||
// Only support length 1 constraints.
|
||||
if (Constraint.length() > 1) return;
|
||||
|
||||
char Letter = Constraint[0];
|
||||
switch (Letter) {
|
||||
default: break;
|
||||
case 'I':
|
||||
@ -5498,7 +5504,7 @@ void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op, char Letter,
|
||||
}
|
||||
|
||||
// Handle standard constraint letters.
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, Letter, Ops, DAG);
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
||||
}
|
||||
|
||||
// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
|
@ -328,7 +328,7 @@ namespace llvm {
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -12594,12 +12594,16 @@ LowerXConstraint(EVT ConstraintVT) const {
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char Constraint,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue>&Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue Result(0, 0);
|
||||
|
||||
switch (Constraint) {
|
||||
// Only support length 1 constraints for now.
|
||||
if (Constraint.length() > 1) return;
|
||||
|
||||
char ConstraintLetter = Constraint[0];
|
||||
switch (ConstraintLetter) {
|
||||
default: break;
|
||||
case 'I':
|
||||
if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(Op)) {
|
||||
|
@ -596,7 +596,7 @@ namespace llvm {
|
||||
/// true it means one of the asm constraint of the inline asm instruction
|
||||
/// being processed is 'm'.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user