diff options
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 10 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrArithmetic.td | 15 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrInfo.cpp | 2 | 
4 files changed, 16 insertions, 13 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 70089fcc658..34ca24f6d10 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -12026,7 +12026,6 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {    case X86ISD::OR:                 return "X86ISD::OR";    case X86ISD::XOR:                return "X86ISD::XOR";    case X86ISD::AND:                return "X86ISD::AND"; -  case X86ISD::ANDN:               return "X86ISD::ANDN";    case X86ISD::BLSI:               return "X86ISD::BLSI";    case X86ISD::BLSMSK:             return "X86ISD::BLSMSK";    case X86ISD::BLSR:               return "X86ISD::BLSR"; @@ -15632,7 +15631,7 @@ static SDValue PerformAndCombine(SDNode *N, SelectionDAG &DAG,    EVT VT = N->getValueType(0); -  // Create ANDN, BLSI, and BLSR instructions +  // Create BLSI, and BLSR instructions    // BLSI is X & (-X)    // BLSR is X & (X-1)    if (Subtarget->hasBMI() && (VT == MVT::i32 || VT == MVT::i64)) { @@ -15640,13 +15639,6 @@ static SDValue PerformAndCombine(SDNode *N, SelectionDAG &DAG,      SDValue N1 = N->getOperand(1);      DebugLoc DL = N->getDebugLoc(); -    // Check LHS for not -    if (N0.getOpcode() == ISD::XOR && isAllOnes(N0.getOperand(1))) -      return DAG.getNode(X86ISD::ANDN, DL, VT, N0.getOperand(0), N1); -    // Check RHS for not -    if (N1.getOpcode() == ISD::XOR && isAllOnes(N1.getOperand(1))) -      return DAG.getNode(X86ISD::ANDN, DL, VT, N1.getOperand(0), N0); -      // Check LHS for neg      if (N0.getOpcode() == ISD::SUB && N0.getOperand(1) == N1 &&          isZero(N0.getOperand(0))) diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 60f34099dde..c51460bc42e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -273,8 +273,6 @@ namespace llvm {        ADD, SUB, ADC, SBB, SMUL,        INC, DEC, OR, XOR, AND, -      ANDN, // ANDN - Bitwise AND NOT with FLAGS results. -        BLSI,   // BLSI - Extract lowest set isolated bit        BLSMSK, // BLSMSK - Get mask up to lowest set bit        BLSR,   // BLSR - Reset lowest set bit diff --git a/llvm/lib/Target/X86/X86InstrArithmetic.td b/llvm/lib/Target/X86/X86InstrArithmetic.td index f790611b8f8..478c42d6575 100644 --- a/llvm/lib/Target/X86/X86InstrArithmetic.td +++ b/llvm/lib/Target/X86/X86InstrArithmetic.td @@ -1204,12 +1204,12 @@ multiclass bmi_andn<string mnemonic, RegisterClass RC, X86MemOperand x86memop,                      PatFrag ld_frag> {    def rr : I<0xF2, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2),              !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), -            [(set RC:$dst, EFLAGS, (X86andn_flag RC:$src1, RC:$src2))], +            [(set RC:$dst, EFLAGS, (X86and_flag (not RC:$src1), RC:$src2))],              IIC_BIN_NONMEM>;    def rm : I<0xF2, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2),              !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),              [(set RC:$dst, EFLAGS, -             (X86andn_flag RC:$src1, (ld_frag addr:$src2)))], IIC_BIN_MEM>; +             (X86and_flag (not RC:$src1), (ld_frag addr:$src2)))], IIC_BIN_MEM>;  }  let Predicates = [HasBMI], Defs = [EFLAGS] in { @@ -1217,6 +1217,17 @@ let Predicates = [HasBMI], Defs = [EFLAGS] in {    defm ANDN64 : bmi_andn<"andn{q}", GR64, i64mem, loadi64>, T8, VEX_4V, VEX_W;  } +let Predicates = [HasBMI] in { +  def : Pat<(and (not GR32:$src1), GR32:$src2), +            (ANDN32rr GR32:$src1, GR32:$src2)>; +  def : Pat<(and (not GR64:$src1), GR64:$src2), +            (ANDN64rr GR64:$src1, GR64:$src2)>; +  def : Pat<(and (not GR32:$src1), (loadi32 addr:$src2)), +            (ANDN32rm GR32:$src1, addr:$src2)>; +  def : Pat<(and (not GR64:$src1), (loadi64 addr:$src2)), +            (ANDN64rm GR64:$src1, addr:$src2)>; +} +  //===----------------------------------------------------------------------===//  // MULX Instruction  // diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index 962977f6520..d02e12fc4f8 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -3201,6 +3201,8 @@ inline static bool isDefConvertible(MachineInstr *MI) {    case X86::OR8ri:     case X86::OR64rr:   case X86::OR32rr:    case X86::OR16rr:    case X86::OR8rr:    case X86::OR64rm:    case X86::OR32rm:    case X86::OR16rm:   case X86::OR8rm: +  case X86::ANDN32rr:  case X86::ANDN32rm: +  case X86::ANDN64rr:  case X86::ANDN64rm:      return true;    }  }  | 

