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
     //