diff options
Diffstat (limited to 'contrib/llvm/utils/TableGen/CodeGenInstruction.cpp')
| -rw-r--r-- | contrib/llvm/utils/TableGen/CodeGenInstruction.cpp | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp b/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp index 5b0aedfbc836..a52ce86c485a 100644 --- a/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp +++ b/contrib/llvm/utils/TableGen/CodeGenInstruction.cpp @@ -13,6 +13,7 @@  #include "CodeGenInstruction.h"  #include "CodeGenTarget.h" +#include "Error.h"  #include "Record.h"  #include "llvm/ADT/StringExtras.h"  #include "llvm/ADT/StringMap.h" @@ -66,10 +67,14 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {      Record *Rec = Arg->getDef();      std::string PrintMethod = "printOperand";      std::string EncoderMethod; +    std::string OperandType = "OPERAND_UNKNOWN";      unsigned NumOps = 1;      DagInit *MIOpInfo = 0; -    if (Rec->isSubClassOf("Operand")) { +    if (Rec->isSubClassOf("RegisterOperand")) {        PrintMethod = Rec->getValueAsString("PrintMethod"); +    } else if (Rec->isSubClassOf("Operand")) { +      PrintMethod = Rec->getValueAsString("PrintMethod"); +      OperandType = Rec->getValueAsString("OperandType");        // If there is an explicit encoder method, use it.        EncoderMethod = Rec->getValueAsString("EncoderMethod");        MIOpInfo = Rec->getValueAsDag("MIOperandInfo"); @@ -93,8 +98,9 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {      } else if (Rec->getName() == "variable_ops") {        isVariadic = true;        continue; -    } else if (!Rec->isSubClassOf("RegisterClass") && -               !Rec->isSubClassOf("PointerLikeRegClass") && +    } else if (Rec->isSubClassOf("RegisterClass")) { +      OperandType = "OPERAND_REGISTER"; +    } else if (!Rec->isSubClassOf("PointerLikeRegClass") &&                 Rec->getName() != "unknown")        throw "Unknown operand class '" + Rec->getName() +        "' in '" + R->getName() + "' instruction!"; @@ -108,7 +114,8 @@ CGIOperandList::CGIOperandList(Record *R) : TheDef(R) {        " has the same name as a previous operand!";      OperandList.push_back(OperandInfo(Rec, ArgName, PrintMethod, EncoderMethod, -                                      MIOperandNo, NumOps, MIOpInfo)); +                                      OperandType, MIOperandNo, NumOps, +                                      MIOpInfo));      MIOperandNo += NumOps;    } @@ -308,6 +315,8 @@ CodeGenInstruction::CodeGenInstruction(Record *R) : TheDef(R), Operands(R) {    isAsCheapAsAMove = R->getValueAsBit("isAsCheapAsAMove");    hasExtraSrcRegAllocReq = R->getValueAsBit("hasExtraSrcRegAllocReq");    hasExtraDefRegAllocReq = R->getValueAsBit("hasExtraDefRegAllocReq"); +  isCodeGenOnly = R->getValueAsBit("isCodeGenOnly"); +  isPseudo = R->getValueAsBit("isPseudo");    ImplicitDefs = R->getValueAsListOfDefs("Defs");    ImplicitUses = R->getValueAsListOfDefs("Uses"); @@ -414,10 +423,14 @@ bool CodeGenInstAlias::tryAliasOpMatch(DagInit *Result, unsigned AliasOpNo,    // Handle explicit registers.    if (ADI && ADI->getDef()->isSubClassOf("Register")) { +    if (InstOpRec->isSubClassOf("RegisterOperand")) +      InstOpRec = InstOpRec->getValueAsDef("RegClass"); +      if (!InstOpRec->isSubClassOf("RegisterClass"))        return false; -    if (!T.getRegisterClass(InstOpRec).containsRegister(ADI->getDef())) +    if (!T.getRegisterClass(InstOpRec) +        .contains(T.getRegBank().getReg(ADI->getDef())))        throw TGError(Loc, "fixed register " +ADI->getDef()->getName()                      + " is not a member of the " + InstOpRec->getName() +                      " register class!");  | 
