[PATCH] D89837: [X86] Error on using h-registers with REX prefix in the assembler instead of leaving it to a fatal error in the encoder.

Craig Topper via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 20 16:33:53 PDT 2020


craig.topper created this revision.
craig.topper added reviewers: RKSimon, spatel, MaskRay, pengfei.
Herald added a subscriber: hiraditya.
Herald added a project: LLVM.
craig.topper requested review of this revision.

Using a fatal error is bad for user experience.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D89837

Files:
  llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
  llvm/test/MC/X86/encoder-fail.s


Index: llvm/test/MC/X86/encoder-fail.s
===================================================================
--- llvm/test/MC/X86/encoder-fail.s
+++ llvm/test/MC/X86/encoder-fail.s
@@ -1,3 +1,3 @@
-// RUN: not --crash llvm-mc -triple x86_64-unknown-unknown --show-encoding %s 2>&1 | FileCheck %s
-// CHECK: LLVM ERROR: Cannot encode high byte register in REX-prefixed instruction
+// RUN: not llvm-mc -triple x86_64-unknown-unknown --show-encoding %s 2>&1 | FileCheck %s
+// CHECK: error: can't encode 'dh' in an instruction requiring REX prefix.
  movzx %dh, %rsi
Index: llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
===================================================================
--- llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -3619,6 +3619,29 @@
   }
   }
 
+  // Check that we aren't mixing AH/BH/CH/DH with REX prefix.
+  const MCInstrDesc &MCID = MII.get(Inst.getOpcode());
+  MCPhysReg HReg = X86::NoRegister;
+  bool UsesRex = MCID.TSFlags & X86II::REX_W;
+  unsigned NumOps = Inst.getNumOperands();
+  for (unsigned i = 0; i != NumOps; ++i) {
+    const MCOperand &MO = Inst.getOperand(i);
+    if (!MO.isReg())
+      continue;
+    unsigned Reg = MO.getReg();
+    if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH)
+      HReg = Reg;
+    if (X86II::isX86_64NonExtLowByteReg(Reg) || X86II::isX86_64ExtendedReg(Reg))
+      UsesRex = true;
+  }
+
+  if (UsesRex && HReg != X86::NoRegister) {
+    StringRef RegName = X86IntelInstPrinter::getRegisterName(HReg);
+    return Error(Ops[0]->getStartLoc(),
+                 "can't encode '" + RegName + "' in an instruction requiring "
+                 "REX prefix.");
+  }
+
   return false;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89837.299512.patch
Type: text/x-patch
Size: 1740 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201020/8bbc9f12/attachment.bin>


More information about the llvm-commits mailing list