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 @@ -1160,7 +1160,6 @@ if (!STI.hasFeature(X86::Is64Bit)) return None; X86OpcodePrefixHelper Prefix(*Ctx.getRegisterInfo()); - bool UsesHighByteReg = false; const MCInstrDesc &Desc = MCII.get(MI.getOpcode()); uint64_t TSFlags = Desc.TSFlags; Prefix.setW(TSFlags & X86II::REX_W); @@ -1170,10 +1169,14 @@ Prefix.emit(OS); return Kind; } + + bool UsesHighByteReg = false; + bool HasRegOp = false; unsigned CurOp = X86II::getOperandBias(Desc); for (unsigned i = CurOp; i != NumOps; ++i) { const MCOperand &MO = MI.getOperand(i); if (MO.isReg()) { + HasRegOp = true; unsigned Reg = MO.getReg(); if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH) UsesHighByteReg = true; @@ -1193,7 +1196,19 @@ } } } + if (!HasRegOp) { + PrefixKind Kind = Prefix.determineOptimalKind(); + Prefix.emit(OS); + return Kind; + } switch (TSFlags & X86II::FormMask) { + default: + llvm_unreachable("Unexpected form in emitREXPrefix!"); + case X86II::RawFrmMemOffs: + case X86II::RawFrmSrc: + case X86II::RawFrmDst: + case X86II::RawFrmDstSrc: + break; case X86II::AddRegFrm: Prefix.setB(MI, CurOp++); break;