diff options
| author | Craig Topper <craig.topper@gmail.com> | 2016-08-22 07:38:50 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@gmail.com> | 2016-08-22 07:38:50 +0000 |
| commit | 5f8419da34393de830e8d53c93253159cc9a2e3f (patch) | |
| tree | 26701df54b4d0db816390dab633983bb6d194b62 /llvm/utils/TableGen | |
| parent | 9b20fece812ff8f745a2772c414f285fcb810695 (diff) | |
| download | bcm5719-llvm-5f8419da34393de830e8d53c93253159cc9a2e3f.tar.gz bcm5719-llvm-5f8419da34393de830e8d53c93253159cc9a2e3f.zip | |
[X86] Create a new instruction format to handle 4VOp3 encoding. This saves one bit in TSFlags and simplifies MRMSrcMem/MRMSrcReg format handling.
llvm-svn: 279424
Diffstat (limited to 'llvm/utils/TableGen')
| -rw-r--r-- | llvm/utils/TableGen/X86RecognizableInstr.cpp | 41 | ||||
| -rw-r--r-- | llvm/utils/TableGen/X86RecognizableInstr.h | 2 |
2 files changed, 25 insertions, 18 deletions
diff --git a/llvm/utils/TableGen/X86RecognizableInstr.cpp b/llvm/utils/TableGen/X86RecognizableInstr.cpp index c30ef652295..4736c4e510d 100644 --- a/llvm/utils/TableGen/X86RecognizableInstr.cpp +++ b/llvm/utils/TableGen/X86RecognizableInstr.cpp @@ -100,15 +100,17 @@ namespace X86Local { RawFrmDstSrc = 6, RawFrmImm8 = 7, RawFrmImm16 = 8, - MRMDestMem = 32, - MRMSrcMem = 33, - MRMSrcMemOp4 = 34, + MRMDestMem = 32, + MRMSrcMem = 33, + MRMSrcMem4VOp3 = 34, + MRMSrcMemOp4 = 35, MRMXm = 39, MRM0m = 40, MRM1m = 41, MRM2m = 42, MRM3m = 43, MRM4m = 44, MRM5m = 45, MRM6m = 46, MRM7m = 47, - MRMDestReg = 48, - MRMSrcReg = 49, - MRMSrcRegOp4 = 50, + MRMDestReg = 48, + MRMSrcReg = 49, + MRMSrcReg4VOp3 = 50, + MRMSrcRegOp4 = 51, MRMXr = 55, MRM0r = 56, MRM1r = 57, MRM2r = 58, MRM3r = 59, MRM4r = 60, MRM5r = 61, MRM6r = 62, MRM7r = 63, @@ -201,7 +203,6 @@ RecognizableInstr::RecognizableInstr(DisassemblerTables &tables, AdSize = byteFromRec(Rec, "AdSizeBits"); HasREX_WPrefix = Rec->getValueAsBit("hasREX_WPrefix"); HasVEX_4V = Rec->getValueAsBit("hasVEX_4V"); - HasVEX_4VOp3 = Rec->getValueAsBit("hasVEX_4VOp3"); HasVEX_WPrefix = Rec->getValueAsBit("hasVEX_WPrefix"); IgnoresVEX_L = Rec->getValueAsBit("ignoresVEX_L"); HasEVEX_L2Prefix = Rec->getValueAsBit("hasEVEX_L2"); @@ -553,7 +554,7 @@ void RecognizableInstr::emitInstructionSpecifier() { // Given the set of prefix bits, how many additional operands does the // instruction have? unsigned additionalOperands = 0; - if (HasVEX_4V || HasVEX_4VOp3) + if (HasVEX_4V) ++additionalOperands; if (HasEVEX_K) ++additionalOperands; @@ -655,14 +656,17 @@ void RecognizableInstr::emitInstructionSpecifier() { HANDLE_OPERAND(vvvvRegister) HANDLE_OPERAND(rmRegister) - - if (HasVEX_4VOp3) - HANDLE_OPERAND(vvvvRegister) - HANDLE_OPTIONAL(immediate) HANDLE_OPTIONAL(immediate) // above might be a register in 7:4 HANDLE_OPTIONAL(immediate) break; + case X86Local::MRMSrcReg4VOp3: + assert(numPhysicalOperands == 3 && + "Unexpected number of operands for MRMSrcRegFrm"); + HANDLE_OPERAND(roRegister) + HANDLE_OPERAND(rmRegister) + HANDLE_OPERAND(vvvvRegister) + break; case X86Local::MRMSrcRegOp4: assert(numPhysicalOperands >= 4 && numPhysicalOperands <= 5 && "Unexpected number of operands for MRMSrcRegOp4Frm"); @@ -693,13 +697,16 @@ void RecognizableInstr::emitInstructionSpecifier() { HANDLE_OPERAND(vvvvRegister) HANDLE_OPERAND(memory) - - if (HasVEX_4VOp3) - HANDLE_OPERAND(vvvvRegister) - HANDLE_OPTIONAL(immediate) HANDLE_OPTIONAL(immediate) // above might be a register in 7:4 break; + case X86Local::MRMSrcMem4VOp3: + assert(numPhysicalOperands == 3 && + "Unexpected number of operands for MRMSrcMemFrm"); + HANDLE_OPERAND(roRegister) + HANDLE_OPERAND(memory) + HANDLE_OPERAND(vvvvRegister) + break; case X86Local::MRMSrcMemOp4: assert(numPhysicalOperands >= 4 && numPhysicalOperands <= 5 && "Unexpected number of operands for MRMSrcMemOp4Frm"); @@ -853,12 +860,14 @@ void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const { break; case X86Local::MRMDestReg: case X86Local::MRMSrcReg: + case X86Local::MRMSrcReg4VOp3: case X86Local::MRMSrcRegOp4: case X86Local::MRMXr: filter = new ModFilter(true); break; case X86Local::MRMDestMem: case X86Local::MRMSrcMem: + case X86Local::MRMSrcMem4VOp3: case X86Local::MRMSrcMemOp4: case X86Local::MRMXm: filter = new ModFilter(false); diff --git a/llvm/utils/TableGen/X86RecognizableInstr.h b/llvm/utils/TableGen/X86RecognizableInstr.h index 402fd861cf8..2e611587cc3 100644 --- a/llvm/utils/TableGen/X86RecognizableInstr.h +++ b/llvm/utils/TableGen/X86RecognizableInstr.h @@ -55,8 +55,6 @@ private: bool HasREX_WPrefix; /// The hasVEX_4V field from the record bool HasVEX_4V; - /// The hasVEX_4VOp3 field from the record - bool HasVEX_4VOp3; /// The hasVEX_WPrefix field from the record bool HasVEX_WPrefix; /// Inferred from the operands; indicates whether the L bit in the VEX prefix is set |

