diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86InstrInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index bc7344050bb..7c96ba76f22 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -4302,12 +4302,14 @@ static unsigned CopyToFromAsymmetricReg(unsigned DestReg, unsigned SrcReg, return 0; } +static bool isMaskRegClass(const TargetRegisterClass *RC) { + // All KMASK RegClasses hold the same k registers, can be tested against anyone. + return X86::VK16RegClass.hasSubClassEq(RC); +} + static bool MaskRegClassContains(unsigned Reg) { - return X86::VK8RegClass.contains(Reg) || - X86::VK16RegClass.contains(Reg) || - X86::VK32RegClass.contains(Reg) || - X86::VK64RegClass.contains(Reg) || - X86::VK1RegClass.contains(Reg); + // All KMASK RegClasses hold the same k registers, can be tested against anyone. + return X86::VK16RegClass.contains(Reg); } static bool GRRegClassContains(unsigned Reg) { @@ -4509,15 +4511,28 @@ void X86InstrInfo::copyPhysReg(MachineBasicBlock &MBB, llvm_unreachable("Cannot emit physreg copy instruction"); } +static unsigned getLoadStoreMaskRegOpcode(const TargetRegisterClass *RC, + bool load) { + switch (RC->getSize()) { + default: + llvm_unreachable("Unknown spill size"); + case 2: + return load ? X86::KMOVWkm : X86::KMOVWmk; + case 4: + return load ? X86::KMOVDkm : X86::KMOVDmk; + case 8: + return load ? X86::KMOVQkm : X86::KMOVQmk; + } +} + static unsigned getLoadStoreRegOpcode(unsigned Reg, const TargetRegisterClass *RC, bool isStackAligned, const X86Subtarget &STI, bool load) { if (STI.hasAVX512()) { - if (X86::VK8RegClass.hasSubClassEq(RC) || - X86::VK16RegClass.hasSubClassEq(RC)) - return load ? X86::KMOVWkm : X86::KMOVWmk; + if (isMaskRegClass(RC)) + return getLoadStoreMaskRegOpcode(RC, load); if (RC->getSize() == 4 && X86::FR32XRegClass.hasSubClassEq(RC)) return load ? X86::VMOVSSZrm : X86::VMOVSSZmr; if (RC->getSize() == 8 && X86::FR64XRegClass.hasSubClassEq(RC)) |

