diff options
author | neel <neel@FreeBSD.org> | 2012-12-04 04:37:42 +0000 |
---|---|---|
committer | neel <neel@FreeBSD.org> | 2012-12-04 04:37:42 +0000 |
commit | d8091074f2295a4be6817c9fe8802b9b0db9346d (patch) | |
tree | 6ef29583fd1f17922e7c5b7d49d2d96d8ff38ebb /contrib/llvm/utils/TableGen/X86DisassemblerTables.cpp | |
parent | d45d8a8d668a9ee12073939bf775c404be8cf175 (diff) | |
parent | 6b76c5a1b878e8001537fb323cb0c88fca9dc2df (diff) | |
download | FreeBSD-src-d8091074f2295a4be6817c9fe8802b9b0db9346d.zip FreeBSD-src-d8091074f2295a4be6817c9fe8802b9b0db9346d.tar.gz |
IFC @r243836
Diffstat (limited to 'contrib/llvm/utils/TableGen/X86DisassemblerTables.cpp')
-rw-r--r-- | contrib/llvm/utils/TableGen/X86DisassemblerTables.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/contrib/llvm/utils/TableGen/X86DisassemblerTables.cpp b/contrib/llvm/utils/TableGen/X86DisassemblerTables.cpp index f3bd373..468a1f8 100644 --- a/contrib/llvm/utils/TableGen/X86DisassemblerTables.cpp +++ b/contrib/llvm/utils/TableGen/X86DisassemblerTables.cpp @@ -209,6 +209,7 @@ static ModRMDecisionType getDecisionType(ModRMDecision &decision) { bool satisfiesOneEntry = true; bool satisfiesSplitRM = true; bool satisfiesSplitReg = true; + bool satisfiesSplitMisc = true; for (unsigned index = 0; index < 256; ++index) { if (decision.instructionIDs[index] != decision.instructionIDs[0]) @@ -228,7 +229,7 @@ static ModRMDecisionType getDecisionType(ModRMDecision &decision) { if (((index & 0xc0) != 0xc0) && (decision.instructionIDs[index] != decision.instructionIDs[index&0x38])) - satisfiesSplitReg = false; + satisfiesSplitMisc = false; } if (satisfiesOneEntry) @@ -237,9 +238,12 @@ static ModRMDecisionType getDecisionType(ModRMDecision &decision) { if (satisfiesSplitRM) return MODRM_SPLITRM; - if (satisfiesSplitReg) + if (satisfiesSplitReg && satisfiesSplitMisc) return MODRM_SPLITREG; + if (satisfiesSplitMisc) + return MODRM_SPLITMISC; + return MODRM_FULL; } @@ -332,6 +336,12 @@ void DisassemblerTables::emitModRMDecision(raw_ostream &o1, raw_ostream &o2, for (unsigned index = 0xc0; index < 256; index += 8) emitOneID(o1, i1, decision.instructionIDs[index], true); break; + case MODRM_SPLITMISC: + for (unsigned index = 0; index < 64; index += 8) + emitOneID(o1, i1, decision.instructionIDs[index], true); + for (unsigned index = 0xc0; index < 256; ++index) + emitOneID(o1, i1, decision.instructionIDs[index], true); + break; case MODRM_FULL: for (unsigned index = 0; index < 256; ++index) emitOneID(o1, i1, decision.instructionIDs[index], true); @@ -361,11 +371,18 @@ void DisassemblerTables::emitModRMDecision(raw_ostream &o1, raw_ostream &o2, case MODRM_SPLITREG: sEntryNumber += 16; break; + case MODRM_SPLITMISC: + sEntryNumber += 8 + 64; + break; case MODRM_FULL: sEntryNumber += 256; break; } + // We assume that the index can fit into uint16_t. + assert(sEntryNumber < 65536U && + "Index into ModRMDecision is too large for uint16_t!"); + ++sTableNumber; } |