From: Craig Topper Date: Mon, 30 Oct 2017 03:35:43 +0000 (+0000) Subject: [X86] Move some EVEX->VEX code to a helper function to prepare for a future patch... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e51b7664eeffcc20a7070d4b538b3384d1bb4a8;p=llvm [X86] Move some EVEX->VEX code to a helper function to prepare for a future patch. NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316881 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86EvexToVex.cpp b/lib/Target/X86/X86EvexToVex.cpp index cc45c1f3e1d..d2bd1201f74 100644 --- a/lib/Target/X86/X86EvexToVex.cpp +++ b/lib/Target/X86/X86EvexToVex.cpp @@ -132,6 +132,38 @@ void EvexToVexInstPass::AddTableEntry(EvexToVexTableType &EvexToVexTable, EvexToVexTable[EvexOp] = VexOp; } +static bool usesExtendedRegister(const MachineInstr &MI) { + auto isHiRegIdx = [](unsigned Reg) { + // Check for XMM register with indexes between 16 - 31. + if (Reg >= X86::XMM16 && Reg <= X86::XMM31) + return true; + + // Check for YMM register with indexes between 16 - 31. + if (Reg >= X86::YMM16 && Reg <= X86::YMM31) + return true; + + return false; + }; + + // Check that operands are not ZMM regs or + // XMM/YMM regs with hi indexes between 16 - 31. + for (const MachineOperand &MO : MI.explicit_operands()) { + if (!MO.isReg()) + continue; + + unsigned Reg = MO.getReg(); + + assert(!(Reg >= X86::ZMM0 && Reg <= X86::ZMM31) && + "ZMM instructions should not be in the EVEX->VEX tables"); + + if (isHiRegIdx(Reg)) + return true; + } + + return false; +} + + // For EVEX instructions that can be encoded using VEX encoding // replace them by the VEX encoding in order to reduce size. bool EvexToVexInstPass::CompressEvexToVexImpl(MachineInstr &MI) const { @@ -188,31 +220,8 @@ bool EvexToVexInstPass::CompressEvexToVexImpl(MachineInstr &MI) const { if (!NewOpc) return false; - auto isHiRegIdx = [](unsigned Reg) { - // Check for XMM register with indexes between 16 - 31. - if (Reg >= X86::XMM16 && Reg <= X86::XMM31) - return true; - - // Check for YMM register with indexes between 16 - 31. - if (Reg >= X86::YMM16 && Reg <= X86::YMM31) - return true; - + if (usesExtendedRegister(MI)) return false; - }; - - // Check that operands are not ZMM regs or - // XMM/YMM regs with hi indexes between 16 - 31. - for (const MachineOperand &MO : MI.explicit_operands()) { - if (!MO.isReg()) - continue; - - unsigned Reg = MO.getReg(); - - assert (!(Reg >= X86::ZMM0 && Reg <= X86::ZMM31)); - - if (isHiRegIdx(Reg)) - return false; - } const MCInstrDesc &MCID = TII->get(NewOpc); MI.setDesc(MCID);