diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -1018,6 +1018,8 @@ RegEnc = getX86RegEncoding(MI, CurOp++); VEX_B = ~(RegEnc >> 3) & 1; VEX_X = ~(RegEnc >> 4) & 1; + if (Encoding == X86II::VEX && !VEX_X) + report_fatal_error("R/M register number exceed 16 in VEX encoding!"); if (EVEX_b) { if (HasEVEX_RC) { @@ -1056,6 +1058,8 @@ RegEnc = getX86RegEncoding(MI, CurOp++); VEX_B = ~(RegEnc >> 3) & 1; VEX_X = ~(RegEnc >> 4) & 1; + if (Encoding == X86II::VEX && !VEX_X) + report_fatal_error("R/M register number exceed 16 in VEX encoding!"); break; } case X86II::MRMDestReg: { @@ -1066,6 +1070,8 @@ unsigned RegEnc = getX86RegEncoding(MI, CurOp++); VEX_B = ~(RegEnc >> 3) & 1; VEX_X = ~(RegEnc >> 4) & 1; + if (Encoding == X86II::VEX && !VEX_X) + report_fatal_error("R/M register number exceed 16 in VEX encoding!"); if (HasEVEX_K) EVEX_aaa = getX86RegEncoding(MI, CurOp++); @@ -1104,10 +1110,19 @@ unsigned RegEnc = getX86RegEncoding(MI, CurOp++); VEX_B = ~(RegEnc >> 3) & 1; VEX_X = ~(RegEnc >> 4) & 1; + if (Encoding == X86II::VEX && !VEX_X) + report_fatal_error("R/M register number exceed 16 in VEX encoding!"); break; } } + if (Encoding == X86II::VEX) { + if (!EVEX_R2) + report_fatal_error("R/M.reg register number exceed 16 in VEX encoding!"); + if (!EVEX_V2) + report_fatal_error("V register number exceed 16 in VEX encoding!"); + } + if (Encoding == X86II::VEX || Encoding == X86II::XOP) { // VEX opcode prefix can have 2 or 3 bytes //