diff options
author | Craig Topper <craig.topper@intel.com> | 2018-02-20 03:58:11 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2018-02-20 03:58:11 +0000 |
commit | 9b64bf54b97157bfe46987ce5638fcb78cca76b4 (patch) | |
tree | 2c0cb59edf703544d510c4987fa49bf1129796ae | |
parent | 0848210b745638d297546508f4070ffbe535ab9c (diff) | |
download | bcm5719-llvm-9b64bf54b97157bfe46987ce5638fcb78cca76b4.tar.gz bcm5719-llvm-9b64bf54b97157bfe46987ce5638fcb78cca76b4.zip |
[X86] Make a helper function for commuting AVX512 VPCMP immediates since we do it in two places.
llvm-svn: 325546
-rw-r--r-- | llvm/lib/Target/X86/X86InstrAVX512.td | 13 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 31 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.h | 4 |
3 files changed, 24 insertions, 24 deletions
diff --git a/llvm/lib/Target/X86/X86InstrAVX512.td b/llvm/lib/Target/X86/X86InstrAVX512.td index 23432072e98..a5a15e84189 100644 --- a/llvm/lib/Target/X86/X86InstrAVX512.td +++ b/llvm/lib/Target/X86/X86InstrAVX512.td @@ -2233,18 +2233,7 @@ defm VPCMPGTQ : avx512_icmp_packed_rmb_vl<0x37, "vpcmpgtq", X86pcmpgtm, // operand. def CommutePCMPCC : SDNodeXForm<imm, [{ uint8_t Imm = N->getZExtValue() & 0x7; - switch (Imm) { - default: llvm_unreachable("Unreachable!"); - case 0x01: Imm = 0x06; break; // LT -> NLE - case 0x02: Imm = 0x05; break; // LE -> NLT - case 0x05: Imm = 0x02; break; // NLT -> LE - case 0x06: Imm = 0x01; break; // NLE -> LT - case 0x00: // EQ - case 0x03: // FALSE - case 0x04: // NE - case 0x07: // TRUE - break; - } + Imm = X86::getSwappedVPCMPImm(Imm); return getI8Imm(Imm, SDLoc(N)); }]>; diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index ab6ea1e06bc..8fb33512fc6 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -5399,18 +5399,7 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI, case X86::VPCMPWZrrik: case X86::VPCMPUWZrrik: { // Flip comparison mode immediate (if necessary). unsigned Imm = MI.getOperand(MI.getNumOperands() - 1).getImm() & 0x7; - switch (Imm) { - default: llvm_unreachable("Unreachable!"); - case 0x01: Imm = 0x06; break; // LT -> NLE - case 0x02: Imm = 0x05; break; // LE -> NLT - case 0x05: Imm = 0x02; break; // NLT -> LE - case 0x06: Imm = 0x01; break; // NLE -> LT - case 0x00: // EQ - case 0x03: // FALSE - case 0x04: // NE - case 0x07: // TRUE - break; - } + Imm = X86::getSwappedVPCMPImm(Imm); auto &WorkingMI = cloneIfNew(MI); WorkingMI.getOperand(MI.getNumOperands() - 1).setImm(Imm); return TargetInstrInfo::commuteInstructionImpl(WorkingMI, /*NewMI=*/false, @@ -6133,6 +6122,24 @@ unsigned X86::getCMovFromCond(CondCode CC, unsigned RegBytes, } } +/// \brief Get the VPCMP immediate if the opcodes are swapped. +unsigned X86::getSwappedVPCMPImm(unsigned Imm) { + switch (Imm) { + default: llvm_unreachable("Unreachable!"); + case 0x01: Imm = 0x06; break; // LT -> NLE + case 0x02: Imm = 0x05; break; // LE -> NLT + case 0x05: Imm = 0x02; break; // NLT -> LE + case 0x06: Imm = 0x01; break; // NLE -> LT + case 0x00: // EQ + case 0x03: // FALSE + case 0x04: // NE + case 0x07: // TRUE + break; + } + + return Imm; +} + bool X86InstrInfo::isUnpredicatedTerminator(const MachineInstr &MI) const { if (!MI.isTerminator()) return false; diff --git a/llvm/lib/Target/X86/X86InstrInfo.h b/llvm/lib/Target/X86/X86InstrInfo.h index b1b5a4a421d..5a2e00152e8 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.h +++ b/llvm/lib/Target/X86/X86InstrInfo.h @@ -83,6 +83,10 @@ CondCode getCondFromCMovOpc(unsigned Opc); /// GetOppositeBranchCondition - Return the inverse of the specified cond, /// e.g. turning COND_E to COND_NE. CondCode GetOppositeBranchCondition(CondCode CC); + +/// \brief Get the VPCMP immediate if the opcodes are swapped. +unsigned getSwappedVPCMPImm(unsigned Imm); + } // namespace X86 /// isGlobalStubReference - Return true if the specified TargetFlag operand is |