diff options
Diffstat (limited to 'llvm/lib/Target')
21 files changed, 61 insertions, 37 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 64ceac4b6e2..62418791cda 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -106,7 +106,7 @@ void ARMTargetLowering::addTypeForNEON(EVT VT, EVT PromotedLdStVT,    EVT ElemTy = VT.getVectorElementType();    if (ElemTy != MVT::i64 && ElemTy != MVT::f64) -    setOperationAction(ISD::VSETCC, VT.getSimpleVT(), Custom); +    setOperationAction(ISD::SETCC, VT.getSimpleVT(), Custom);    setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT.getSimpleVT(), Custom);    if (ElemTy != MVT::i32) {      setOperationAction(ISD::SINT_TO_FP, VT.getSimpleVT(), Expand); @@ -178,6 +178,8 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)    RegInfo = TM.getRegisterInfo();    Itins = TM.getInstrItineraryData(); +  setBooleanVectorContents(ZeroOrNegativeOneBooleanContent); +    if (Subtarget->isTargetDarwin()) {      // Uses VFP for Thumb libfuncs if available.      if (Subtarget->isThumb() && Subtarget->hasVFP2()) { @@ -453,7 +455,7 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)      setOperationAction(ISD::FDIV, MVT::v2f64, Expand);      setOperationAction(ISD::FREM, MVT::v2f64, Expand);      setOperationAction(ISD::FCOPYSIGN, MVT::v2f64, Expand); -    setOperationAction(ISD::VSETCC, MVT::v2f64, Expand); +    setOperationAction(ISD::SETCC, MVT::v2f64, Expand);      setOperationAction(ISD::FNEG, MVT::v2f64, Expand);      setOperationAction(ISD::FABS, MVT::v2f64, Expand);      setOperationAction(ISD::FSQRT, MVT::v2f64, Expand); @@ -485,8 +487,8 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)      setOperationAction(ISD::SDIV, MVT::v8i8, Custom);      setOperationAction(ISD::UDIV, MVT::v4i16, Custom);      setOperationAction(ISD::UDIV, MVT::v8i8, Custom); -    setOperationAction(ISD::VSETCC, MVT::v1i64, Expand); -    setOperationAction(ISD::VSETCC, MVT::v2i64, Expand); +    setOperationAction(ISD::SETCC, MVT::v1i64, Expand); +    setOperationAction(ISD::SETCC, MVT::v2i64, Expand);      // Neon does not have single instruction SINT_TO_FP and UINT_TO_FP with      // a destination type that is wider than the source.      setOperationAction(ISD::SINT_TO_FP, MVT::v4i16, Custom); @@ -930,6 +932,11 @@ const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {    }  } +EVT ARMTargetLowering::getSetCCResultType(EVT VT) const { +  if (!VT.isVector()) return getPointerTy(); +  return VT.changeVectorElementTypeToInteger(); +} +  /// getRegClassFor - Return the register class that should be used for the  /// specified value type.  TargetRegisterClass *ARMTargetLowering::getRegClassFor(EVT VT) const { @@ -4925,7 +4932,7 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {    case ISD::SRL_PARTS:    case ISD::SRA_PARTS:     return LowerShiftRightParts(Op, DAG);    case ISD::CTTZ:          return LowerCTTZ(Op.getNode(), DAG, Subtarget); -  case ISD::VSETCC:        return LowerVSETCC(Op, DAG); +  case ISD::SETCC:         return LowerVSETCC(Op, DAG);    case ISD::BUILD_VECTOR:  return LowerBUILD_VECTOR(Op, DAG, Subtarget);    case ISD::VECTOR_SHUFFLE: return LowerVECTOR_SHUFFLE(Op, DAG);    case ISD::EXTRACT_VECTOR_ELT: return LowerEXTRACT_VECTOR_ELT(Op, DAG); diff --git a/llvm/lib/Target/ARM/ARMISelLowering.h b/llvm/lib/Target/ARM/ARMISelLowering.h index 5bf85d482bd..b06e6594afe 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.h +++ b/llvm/lib/Target/ARM/ARMISelLowering.h @@ -255,6 +255,9 @@ namespace llvm {      virtual const char *getTargetNodeName(unsigned Opcode) const; +    /// getSetCCResultType - Return the value type to use for ISD::SETCC. +    virtual EVT getSetCCResultType(EVT VT) const; +      virtual MachineBasicBlock *        EmitInstrWithCustomInserter(MachineInstr *MI,                                    MachineBasicBlock *MBB) const; diff --git a/llvm/lib/Target/Alpha/AlphaISelLowering.cpp b/llvm/lib/Target/Alpha/AlphaISelLowering.cpp index 68ae71530ac..3057eb8c57f 100644 --- a/llvm/lib/Target/Alpha/AlphaISelLowering.cpp +++ b/llvm/lib/Target/Alpha/AlphaISelLowering.cpp @@ -49,6 +49,7 @@ AlphaTargetLowering::AlphaTargetLowering(TargetMachine &TM)    // Set up the TargetLowering object.    //I am having problems with shr n i8 1    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    addRegisterClass(MVT::i64, Alpha::GPRCRegisterClass);    addRegisterClass(MVT::f64, Alpha::F8RCRegisterClass); @@ -168,7 +169,7 @@ AlphaTargetLowering::AlphaTargetLowering(TargetMachine &TM)    computeRegisterProperties();  } -MVT::SimpleValueType AlphaTargetLowering::getSetCCResultType(EVT VT) const { +EVT AlphaTargetLowering::getSetCCResultType(EVT VT) const {    return MVT::i64;  } diff --git a/llvm/lib/Target/Alpha/AlphaISelLowering.h b/llvm/lib/Target/Alpha/AlphaISelLowering.h index 13383f4430f..80f8efaea5d 100644 --- a/llvm/lib/Target/Alpha/AlphaISelLowering.h +++ b/llvm/lib/Target/Alpha/AlphaISelLowering.h @@ -66,7 +66,7 @@ namespace llvm {      virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i64; }      /// getSetCCResultType - Get the SETCC result ValueType -    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    virtual EVT getSetCCResultType(EVT VT) const;      /// LowerOperation - Provide custom lowering hooks for some operations.      /// diff --git a/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp b/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp index 43aad433401..7d4c45fdf66 100644 --- a/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp +++ b/llvm/lib/Target/Blackfin/BlackfinISelLowering.cpp @@ -42,6 +42,7 @@ using namespace llvm;  BlackfinTargetLowering::BlackfinTargetLowering(TargetMachine &TM)    : TargetLowering(TM, new TargetLoweringObjectFileELF()) {    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    setStackPointerRegisterToSaveRestore(BF::SP);    setIntDivIsCheap(false); @@ -135,7 +136,7 @@ const char *BlackfinTargetLowering::getTargetNodeName(unsigned Opcode) const {    }  } -MVT::SimpleValueType BlackfinTargetLowering::getSetCCResultType(EVT VT) const { +EVT BlackfinTargetLowering::getSetCCResultType(EVT VT) const {    // SETCC always sets the CC register. Technically that is an i1 register, but    // that type is not legal, so we treat it as an i32 register.    return MVT::i32; diff --git a/llvm/lib/Target/Blackfin/BlackfinISelLowering.h b/llvm/lib/Target/Blackfin/BlackfinISelLowering.h index b65775b9285..90908baaae9 100644 --- a/llvm/lib/Target/Blackfin/BlackfinISelLowering.h +++ b/llvm/lib/Target/Blackfin/BlackfinISelLowering.h @@ -33,7 +33,7 @@ namespace llvm {    public:      BlackfinTargetLowering(TargetMachine &TM);      virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i16; } -    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    virtual EVT getSetCCResultType(EVT VT) const;      virtual SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const;      virtual void ReplaceNodeResults(SDNode *N,                                      SmallVectorImpl<SDValue> &Results, diff --git a/llvm/lib/Target/CellSPU/SPUISelLowering.cpp b/llvm/lib/Target/CellSPU/SPUISelLowering.cpp index 1a081e9e6d7..cfd29cf90dd 100644 --- a/llvm/lib/Target/CellSPU/SPUISelLowering.cpp +++ b/llvm/lib/Target/CellSPU/SPUISelLowering.cpp @@ -439,6 +439,7 @@ SPUTargetLowering::SPUTargetLowering(SPUTargetMachine &TM)    setOperationAction(ISD::FDIV, MVT::v4f32, Legal);    setBooleanContents(ZeroOrNegativeOneBooleanContent); +  setBooleanVectorContents(ZeroOrNegativeOneBooleanContent); // FIXME: Is this correct?    setStackPointerRegisterToSaveRestore(SPU::R1); @@ -498,7 +499,7 @@ SPUTargetLowering::getTargetNodeName(unsigned Opcode) const  // Return the Cell SPU's SETCC result type  //===----------------------------------------------------------------------===// -MVT::SimpleValueType SPUTargetLowering::getSetCCResultType(EVT VT) const { +EVT SPUTargetLowering::getSetCCResultType(EVT VT) const {    // i8, i16 and i32 are valid SETCC result types    MVT::SimpleValueType retval; diff --git a/llvm/lib/Target/CellSPU/SPUISelLowering.h b/llvm/lib/Target/CellSPU/SPUISelLowering.h index 91bbdf26d85..aa4a1687278 100644 --- a/llvm/lib/Target/CellSPU/SPUISelLowering.h +++ b/llvm/lib/Target/CellSPU/SPUISelLowering.h @@ -107,7 +107,7 @@ namespace llvm {      virtual const char *getTargetNodeName(unsigned Opcode) const;      /// getSetCCResultType - Return the ValueType for ISD::SETCC -    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    virtual EVT getSetCCResultType(EVT VT) const;      virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i32; } diff --git a/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp b/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp index 8a1774e7a27..8ec548f1437 100644 --- a/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp +++ b/llvm/lib/Target/MBlaze/MBlazeISelLowering.cpp @@ -59,6 +59,7 @@ MBlazeTargetLowering::MBlazeTargetLowering(MBlazeTargetMachine &TM)    // MBlaze does not have i1 type, so use i32 for    // setcc operations results (slt, sgt, ...).    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    // Set up the register classes    addRegisterClass(MVT::i32, MBlaze::GPRRegisterClass); @@ -187,7 +188,7 @@ MBlazeTargetLowering::MBlazeTargetLowering(MBlazeTargetMachine &TM)    computeRegisterProperties();  } -MVT::SimpleValueType MBlazeTargetLowering::getSetCCResultType(EVT VT) const { +EVT MBlazeTargetLowering::getSetCCResultType(EVT VT) const {    return MVT::i32;  } diff --git a/llvm/lib/Target/MBlaze/MBlazeISelLowering.h b/llvm/lib/Target/MBlaze/MBlazeISelLowering.h index bb128da3c7c..8b49bc3de0c 100644 --- a/llvm/lib/Target/MBlaze/MBlazeISelLowering.h +++ b/llvm/lib/Target/MBlaze/MBlazeISelLowering.h @@ -102,7 +102,7 @@ namespace llvm {      virtual const char *getTargetNodeName(unsigned Opcode) const;      /// getSetCCResultType - get the ISD::SETCC result ValueType -    MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    EVT getSetCCResultType(EVT VT) const;    private:      // Subtarget Info diff --git a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp index 8405789a06d..dc374315171 100644 --- a/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp +++ b/llvm/lib/Target/MSP430/MSP430ISelLowering.cpp @@ -79,6 +79,7 @@ MSP430TargetLowering::MSP430TargetLowering(MSP430TargetMachine &tm) :    setStackPointerRegisterToSaveRestore(MSP430::SPW);    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    setSchedulingPreference(Sched::Latency);    // We have post-incremented loads / stores. diff --git a/llvm/lib/Target/Mips/MipsISelLowering.cpp b/llvm/lib/Target/Mips/MipsISelLowering.cpp index 3e1e0090022..56fe993e2b9 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsISelLowering.cpp @@ -88,6 +88,7 @@ MipsTargetLowering(MipsTargetMachine &TM)    // Mips does not have i1 type, so use i32 for    // setcc operations results (slt, sgt, ...).    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    // Set up the register classes    addRegisterClass(MVT::i32, Mips::CPURegsRegisterClass); @@ -219,7 +220,7 @@ bool MipsTargetLowering::allowsUnalignedMemoryAccesses(EVT VT) const {    return SVT == MVT::i32 || SVT == MVT::i16;   } -MVT::SimpleValueType MipsTargetLowering::getSetCCResultType(EVT VT) const { +EVT MipsTargetLowering::getSetCCResultType(EVT VT) const {    return MVT::i32;  } diff --git a/llvm/lib/Target/Mips/MipsISelLowering.h b/llvm/lib/Target/Mips/MipsISelLowering.h index ac3df7d3cb7..4990e7221ec 100644 --- a/llvm/lib/Target/Mips/MipsISelLowering.h +++ b/llvm/lib/Target/Mips/MipsISelLowering.h @@ -108,7 +108,7 @@ namespace llvm {      virtual const char *getTargetNodeName(unsigned Opcode) const;      /// getSetCCResultType - get the ISD::SETCC result ValueType -    MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    EVT getSetCCResultType(EVT VT) const;      virtual SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;    private: diff --git a/llvm/lib/Target/PTX/PTXISelLowering.cpp b/llvm/lib/Target/PTX/PTXISelLowering.cpp index 0961901c5f6..c8bd7bf2d84 100644 --- a/llvm/lib/Target/PTX/PTXISelLowering.cpp +++ b/llvm/lib/Target/PTX/PTXISelLowering.cpp @@ -48,6 +48,7 @@ PTXTargetLowering::PTXTargetLowering(TargetMachine &TM)    addRegisterClass(MVT::f64, PTX::RegF64RegisterClass);    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    setMinFunctionAlignment(2);    //////////////////////////////////// @@ -106,7 +107,7 @@ PTXTargetLowering::PTXTargetLowering(TargetMachine &TM)    computeRegisterProperties();  } -MVT::SimpleValueType PTXTargetLowering::getSetCCResultType(EVT VT) const { +EVT PTXTargetLowering::getSetCCResultType(EVT VT) const {    return MVT::i1;  } diff --git a/llvm/lib/Target/PTX/PTXISelLowering.h b/llvm/lib/Target/PTX/PTXISelLowering.h index f99ac7bc789..3112b03d4b1 100644 --- a/llvm/lib/Target/PTX/PTXISelLowering.h +++ b/llvm/lib/Target/PTX/PTXISelLowering.h @@ -71,7 +71,7 @@ class PTXTargetLowering : public TargetLowering {                  DebugLoc dl, SelectionDAG &DAG,                  SmallVectorImpl<SDValue> &InVals) const; -    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    virtual EVT getSetCCResultType(EVT VT) const;    private:      SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const; diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index 39e6c2412f6..cf9f27dda9e 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -370,6 +370,7 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)    setOperationAction(ISD::ATOMIC_STORE, MVT::i32, Expand);    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    if (TM.getSubtarget<PPCSubtarget>().isPPC64()) {      setStackPointerRegisterToSaveRestore(PPC::X1); @@ -469,7 +470,7 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {    }  } -MVT::SimpleValueType PPCTargetLowering::getSetCCResultType(EVT VT) const { +EVT PPCTargetLowering::getSetCCResultType(EVT VT) const {    return MVT::i32;  } diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.h b/llvm/lib/Target/PowerPC/PPCISelLowering.h index 602f70abfc4..5f825bdfd32 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.h +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.h @@ -246,7 +246,7 @@ namespace llvm {      virtual MVT getShiftAmountTy(EVT LHSTy) const { return MVT::i32; }      /// getSetCCResultType - Return the ISD::SETCC ValueType -    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    virtual EVT getSetCCResultType(EVT VT) const;      /// getPreIndexedAddressParts - returns true by value, base pointer and      /// offset pointer and addressing mode by reference if the node's address diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp index 871c2972a8c..48ca99ff9ea 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp @@ -81,6 +81,7 @@ SystemZTargetLowering::SystemZTargetLowering(SystemZTargetMachine &tm) :    setSchedulingPreference(Sched::RegPressure);    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    setOperationAction(ISD::BR_JT,            MVT::Other, Expand);    setOperationAction(ISD::BRCOND,           MVT::Other, Expand); diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index d220c59430a..1ed35d88c3c 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -181,6 +181,8 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)    // X86 is weird, it always uses i8 for shift amounts and setcc results.    setBooleanContents(ZeroOrOneBooleanContent); +  // X86-SSE is even stranger. It uses -1 or 0 for vector masks. +  setBooleanVectorContents(ZeroOrNegativeOneBooleanContent);    // For 64-bit since we have so many registers use the ILP scheduler, for    // 32-bit code use the register pressure specific scheduling. @@ -710,7 +712,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)      setOperationAction(ISD::ROTL, (MVT::SimpleValueType)VT, Expand);      setOperationAction(ISD::ROTR, (MVT::SimpleValueType)VT, Expand);      setOperationAction(ISD::BSWAP, (MVT::SimpleValueType)VT, Expand); -    setOperationAction(ISD::VSETCC, (MVT::SimpleValueType)VT, Expand); +    setOperationAction(ISD::SETCC, (MVT::SimpleValueType)VT, Expand);      setOperationAction(ISD::FLOG, (MVT::SimpleValueType)VT, Expand);      setOperationAction(ISD::FLOG2, (MVT::SimpleValueType)VT, Expand);      setOperationAction(ISD::FLOG10, (MVT::SimpleValueType)VT, Expand); @@ -787,7 +789,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)      setOperationAction(ISD::VECTOR_SHUFFLE,     MVT::v4f32, Custom);      setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v4f32, Custom);      setOperationAction(ISD::SELECT,             MVT::v4f32, Custom); -    setOperationAction(ISD::VSETCC,             MVT::v4f32, Custom); +    setOperationAction(ISD::SETCC,              MVT::v4f32, Custom);    }    if (!UseSoftFloat && Subtarget->hasXMMInt()) { @@ -817,10 +819,10 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)      setOperationAction(ISD::FSQRT,              MVT::v2f64, Legal);      setOperationAction(ISD::FNEG,               MVT::v2f64, Custom); -    setOperationAction(ISD::VSETCC,             MVT::v2f64, Custom); -    setOperationAction(ISD::VSETCC,             MVT::v16i8, Custom); -    setOperationAction(ISD::VSETCC,             MVT::v8i16, Custom); -    setOperationAction(ISD::VSETCC,             MVT::v4i32, Custom); +    setOperationAction(ISD::SETCC,              MVT::v2f64, Custom); +    setOperationAction(ISD::SETCC,              MVT::v16i8, Custom); +    setOperationAction(ISD::SETCC,              MVT::v8i16, Custom); +    setOperationAction(ISD::SETCC,              MVT::v4i32, Custom);      setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v16i8, Custom);      setOperationAction(ISD::SCALAR_TO_VECTOR,   MVT::v8i16, Custom); @@ -950,7 +952,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)    }    if (Subtarget->hasSSE42() || Subtarget->hasAVX()) -    setOperationAction(ISD::VSETCC,             MVT::v2i64, Custom); +    setOperationAction(ISD::SETCC,             MVT::v2i64, Custom);    if (!UseSoftFloat && Subtarget->hasAVX()) {      addRegisterClass(MVT::v32i8,  X86::VR256RegisterClass); @@ -1002,10 +1004,10 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)      setOperationAction(ISD::SRA,               MVT::v8i32, Custom);      setOperationAction(ISD::SRA,               MVT::v16i16, Custom); -    setOperationAction(ISD::VSETCC,            MVT::v32i8, Custom); -    setOperationAction(ISD::VSETCC,            MVT::v16i16, Custom); -    setOperationAction(ISD::VSETCC,            MVT::v8i32, Custom); -    setOperationAction(ISD::VSETCC,            MVT::v4i64, Custom); +    setOperationAction(ISD::SETCC,             MVT::v32i8, Custom); +    setOperationAction(ISD::SETCC,             MVT::v16i16, Custom); +    setOperationAction(ISD::SETCC,             MVT::v8i32, Custom); +    setOperationAction(ISD::SETCC,             MVT::v4i64, Custom);      setOperationAction(ISD::SELECT,            MVT::v4f64, Custom);      setOperationAction(ISD::SELECT,            MVT::v4i64, Custom); @@ -1145,8 +1147,9 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)  } -MVT::SimpleValueType X86TargetLowering::getSetCCResultType(EVT VT) const { -  return MVT::i8; +EVT X86TargetLowering::getSetCCResultType(EVT VT) const { +  if (!VT.isVector()) return MVT::i8; +  return VT.changeVectorElementTypeToInteger();  } @@ -8319,6 +8322,9 @@ SDValue X86TargetLowering::LowerToBT(SDValue And, ISD::CondCode CC,  }  SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const { + +  if (Op.getValueType().isVector()) return LowerVSETCC(Op, DAG); +    assert(Op.getValueType() == MVT::i8 && "SetCC type must be 8-bit integer");    SDValue Op0 = Op.getOperand(0);    SDValue Op1 = Op.getOperand(1); @@ -8374,7 +8380,7 @@ SDValue X86TargetLowering::LowerSETCC(SDValue Op, SelectionDAG &DAG) const {  static SDValue Lower256IntVETCC(SDValue Op, SelectionDAG &DAG) {    EVT VT = Op.getValueType(); -  assert(VT.getSizeInBits() == 256 && Op.getOpcode() == ISD::VSETCC && +  assert(VT.getSizeInBits() == 256 && Op.getOpcode() == ISD::SETCC &&           "Unsupported value type for operation");    int NumElems = VT.getVectorNumElements(); @@ -10038,7 +10044,6 @@ SDValue X86TargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op, SelectionDAG &DAG)    SDNode* Node = Op.getNode();    EVT ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT();    EVT VT = Node->getValueType(0); -    if (Subtarget->hasSSE2() && VT.isVector()) {      unsigned BitsDiff = VT.getScalarType().getSizeInBits() -                          ExtraVT.getScalarType().getSizeInBits(); @@ -10344,7 +10349,6 @@ SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {    case ISD::FCOPYSIGN:          return LowerFCOPYSIGN(Op, DAG);    case ISD::FGETSIGN:           return LowerFGETSIGN(Op, DAG);    case ISD::SETCC:              return LowerSETCC(Op, DAG); -  case ISD::VSETCC:             return LowerVSETCC(Op, DAG);    case ISD::SELECT:             return LowerSELECT(Op, DAG);    case ISD::BRCOND:             return LowerBRCOND(Op, DAG);    case ISD::JumpTable:          return LowerJumpTable(Op, DAG); diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index e83fea95cba..4d0e66a1e84 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -572,8 +572,8 @@ namespace llvm {      /// DAG node.      virtual const char *getTargetNodeName(unsigned Opcode) const; -    /// getSetCCResultType - Return the ISD::SETCC ValueType -    virtual MVT::SimpleValueType getSetCCResultType(EVT VT) const; +    /// getSetCCResultType - Return the value type to use for ISD::SETCC. +    virtual EVT getSetCCResultType(EVT VT) const;      /// computeMaskedBitsForTargetNode - Determine which of the bits specified      /// in Mask are known to be either zero or one and return them in the diff --git a/llvm/lib/Target/XCore/XCoreISelLowering.cpp b/llvm/lib/Target/XCore/XCoreISelLowering.cpp index 3926a7f87f4..42dfdb73554 100644 --- a/llvm/lib/Target/XCore/XCoreISelLowering.cpp +++ b/llvm/lib/Target/XCore/XCoreISelLowering.cpp @@ -81,6 +81,7 @@ XCoreTargetLowering::XCoreTargetLowering(XCoreTargetMachine &XTM)    // Use i32 for setcc operations results (slt, sgt, ...).    setBooleanContents(ZeroOrOneBooleanContent); +  setBooleanVectorContents(ZeroOrOneBooleanContent); // FIXME: Is this correct?    // XCore does not have the NodeTypes below.    setOperationAction(ISD::BR_CC,     MVT::Other, Expand);  | 

