diff options
4 files changed, 32 insertions, 2 deletions
diff --git a/llvm/include/llvm/Support/X86DisassemblerDecoderCommon.h b/llvm/include/llvm/Support/X86DisassemblerDecoderCommon.h index eeffb9c0167..da07b1d0cbe 100644 --- a/llvm/include/llvm/Support/X86DisassemblerDecoderCommon.h +++ b/llvm/include/llvm/Support/X86DisassemblerDecoderCommon.h @@ -93,6 +93,10 @@ enum attributeBits {                                          "operands change width")               \    ENUM_ENTRY(IC_XS_OPSIZE,          3,  "requires an OPSIZE prefix, so "       \                                          "operands change width")               \ +  ENUM_ENTRY(IC_XD_ADSIZE,          3,  "requires an ADSIZE prefix, so "       \ +                                        "operands change width")               \ +  ENUM_ENTRY(IC_XS_ADSIZE,          3,  "requires an ADSIZE prefix, so "       \ +                                        "operands change width")               \    ENUM_ENTRY(IC_64BIT_REXW,         5,  "requires a REX.W prefix, so operands "\                                          "change width; overrides IC_OPSIZE")   \    ENUM_ENTRY(IC_64BIT_REXW_ADSIZE,  6,  "requires a REX.W prefix and 0x67 "    \ @@ -106,6 +110,8 @@ enum attributeBits {    ENUM_ENTRY(IC_64BIT_XS,           6,  "Just as meaningful as IC_64BIT_XD")   \    ENUM_ENTRY(IC_64BIT_XD_OPSIZE,    3,  "Just as meaningful as IC_XD_OPSIZE")  \    ENUM_ENTRY(IC_64BIT_XS_OPSIZE,    3,  "Just as meaningful as IC_XS_OPSIZE")  \ +  ENUM_ENTRY(IC_64BIT_XD_ADSIZE,    3,  "Just as meaningful as IC_XD_ADSIZE")  \ +  ENUM_ENTRY(IC_64BIT_XS_ADSIZE,    3,  "Just as meaningful as IC_XS_ADSIZE")  \    ENUM_ENTRY(IC_64BIT_REXW_XS,      7,  "OPSIZE could mean a different "       \                                          "opcode")                              \    ENUM_ENTRY(IC_64BIT_REXW_XD,      7,  "Just as meaningful as "               \ diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp index 6a10278dc7f..9625ebfd7aa 100644 --- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp +++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp @@ -964,6 +964,9 @@ static int getID(struct InternalInstruction* insn, const void *miiArg) {        attrMask |= ATTR_ADSIZE;        break;      } + +    if (insn->hasAdSize) +      attrMask |= ATTR_ADSIZE;    }    if (insn->rexPrefix & 0x08) { diff --git a/llvm/utils/TableGen/X86DisassemblerTables.cpp b/llvm/utils/TableGen/X86DisassemblerTables.cpp index 9e01eaafb55..0ef9ac6384a 100644 --- a/llvm/utils/TableGen/X86DisassemblerTables.cpp +++ b/llvm/utils/TableGen/X86DisassemblerTables.cpp @@ -112,6 +112,10 @@ static inline bool inheritsFrom(InstructionContext child,      return inheritsFrom(child, IC_64BIT_XD_OPSIZE);    case IC_XS_OPSIZE:      return inheritsFrom(child, IC_64BIT_XS_OPSIZE); +  case IC_XD_ADSIZE: +    return inheritsFrom(child, IC_64BIT_XD_ADSIZE); +  case IC_XS_ADSIZE: +    return inheritsFrom(child, IC_64BIT_XS_ADSIZE);    case IC_64BIT_REXW:      return((noPrefix && inheritsFrom(child, IC_64BIT_REXW_XS, noPrefix)) ||             (noPrefix && inheritsFrom(child, IC_64BIT_REXW_XD, noPrefix)) || @@ -122,12 +126,17 @@ static inline bool inheritsFrom(InstructionContext child,             (!AdSize64 && inheritsFrom(child, IC_64BIT_OPSIZE_ADSIZE)) ||             (!AdSize64 && inheritsFrom(child, IC_64BIT_REXW_ADSIZE));    case IC_64BIT_XD: -    return(inheritsFrom(child, IC_64BIT_REXW_XD)); +    return(inheritsFrom(child, IC_64BIT_REXW_XD) || +           (!AdSize64 && inheritsFrom(child, IC_64BIT_XD_ADSIZE)));    case IC_64BIT_XS: -    return(inheritsFrom(child, IC_64BIT_REXW_XS)); +    return(inheritsFrom(child, IC_64BIT_REXW_XS) || +           (!AdSize64 && inheritsFrom(child, IC_64BIT_XS_ADSIZE)));    case IC_64BIT_XD_OPSIZE:    case IC_64BIT_XS_OPSIZE:      return false; +  case IC_64BIT_XD_ADSIZE: +  case IC_64BIT_XS_ADSIZE: +    return false;    case IC_64BIT_REXW_XD:    case IC_64BIT_REXW_XS:    case IC_64BIT_REXW_OPSIZE: @@ -953,8 +962,12 @@ void DisassemblerTables::emitContextTable(raw_ostream &o, unsigned &i) const {        o << "IC_64BIT_REXW_ADSIZE";      else if ((index & ATTR_64BIT) && (index & ATTR_XD) && (index & ATTR_OPSIZE))        o << "IC_64BIT_XD_OPSIZE"; +    else if ((index & ATTR_64BIT) && (index & ATTR_XD) && (index & ATTR_ADSIZE)) +      o << "IC_64BIT_XD_ADSIZE";      else if ((index & ATTR_64BIT) && (index & ATTR_XS) && (index & ATTR_OPSIZE))        o << "IC_64BIT_XS_OPSIZE"; +    else if ((index & ATTR_64BIT) && (index & ATTR_XS) && (index & ATTR_ADSIZE)) +      o << "IC_64BIT_XS_ADSIZE";      else if ((index & ATTR_64BIT) && (index & ATTR_XS))        o << "IC_64BIT_XS";      else if ((index & ATTR_64BIT) && (index & ATTR_XD)) @@ -974,6 +987,10 @@ void DisassemblerTables::emitContextTable(raw_ostream &o, unsigned &i) const {        o << "IC_XS_OPSIZE";      else if ((index & ATTR_XD) && (index & ATTR_OPSIZE))        o << "IC_XD_OPSIZE"; +    else if ((index & ATTR_XS) && (index & ATTR_ADSIZE)) +      o << "IC_XS_ADSIZE"; +    else if ((index & ATTR_XD) && (index & ATTR_ADSIZE)) +      o << "IC_XD_ADSIZE";      else if (index & ATTR_XS)        o << "IC_XS";      else if (index & ATTR_XD) diff --git a/llvm/utils/TableGen/X86RecognizableInstr.cpp b/llvm/utils/TableGen/X86RecognizableInstr.cpp index 5811528f186..94452b2c9d8 100644 --- a/llvm/utils/TableGen/X86RecognizableInstr.cpp +++ b/llvm/utils/TableGen/X86RecognizableInstr.cpp @@ -324,6 +324,10 @@ InstructionContext RecognizableInstr::insnContext() const {        insnContext = IC_XD_OPSIZE;      else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XS)        insnContext = IC_XS_OPSIZE; +    else if (AdSize == X86Local::AdSize16 && OpPrefix == X86Local::XD) +      insnContext = IC_XD_ADSIZE; +    else if (AdSize == X86Local::AdSize16 && OpPrefix == X86Local::XS) +      insnContext = IC_XS_ADSIZE;      else if (OpSize == X86Local::OpSize16 && AdSize == X86Local::AdSize16)        insnContext = IC_OPSIZE_ADSIZE;      else if (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD)  | 

