diff options
Diffstat (limited to 'lib/Target/X86/X86CodeEmitter.cpp')
-rw-r--r-- | lib/Target/X86/X86CodeEmitter.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/Target/X86/X86CodeEmitter.cpp b/lib/Target/X86/X86CodeEmitter.cpp index 63bf18d157..efd64e05ec 100644 --- a/lib/Target/X86/X86CodeEmitter.cpp +++ b/lib/Target/X86/X86CodeEmitter.cpp @@ -671,13 +671,26 @@ void Emitter::emitInstruction(const MachineInstr &MI, case X86II::MRM6r: case X86II::MRM7r: { MCE.emitByte(BaseOpcode); - // Special handling of lfence and mfence. + // Special handling of lfence, mfence, monitor, and mwait. if (Desc->getOpcode() == X86::LFENCE || - Desc->getOpcode() == X86::MFENCE) + Desc->getOpcode() == X86::MFENCE || + Desc->getOpcode() == X86::MONITOR || + Desc->getOpcode() == X86::MWAIT) { emitRegModRMByte((Desc->TSFlags & X86II::FormMask)-X86II::MRM0r); - else + + switch (Desc->getOpcode()) { + default: break; + case X86::MONITOR: + MCE.emitByte(0xC8); + break; + case X86::MWAIT: + MCE.emitByte(0xC9); + break; + } + } else { emitRegModRMByte(MI.getOperand(CurOp++).getReg(), (Desc->TSFlags & X86II::FormMask)-X86II::MRM0r); + } if (CurOp != NumOps) { const MachineOperand &MO1 = MI.getOperand(CurOp++); |