mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-30 17:33:24 +00:00
Initial CodeGen support for CTTZ/CTLZ where a zero input produces an
undefined result. This adds new ISD nodes for the new semantics, selecting them when the LLVM intrinsic indicates that the undef behavior is desired. The new nodes expand trivially to the old nodes, so targets don't actually need to do anything to support these new nodes besides indicating that they should be expanded. I've done this for all the operand types that I could figure out for all the targets. Owners of various targets, please review and let me know if any of these are incorrect. Note that the expand behavior is *conservatively correct*, and exactly matches LLVM's current behavior with these operations. Ideally this patch will not change behavior in any way. For example the regtest suite finds the exact same instruction sequences coming out of the code generator. That's why there are no new tests here -- all of this is being exercised by the existing test suite. Thanks to Duncan Sands for reviewing the various bits of this patch and helping me get the wrinkles ironed out with expanding for each target. Also thanks to Chris for clarifying through all the discussions that this is indeed the approach he was looking for. That said, there are likely still rough spots. Further review much appreciated. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146466 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a349539f87
commit
63974b2144
@ -312,6 +312,9 @@ namespace ISD {
|
||||
/// Byte Swap and Counting operators.
|
||||
BSWAP, CTTZ, CTLZ, CTPOP,
|
||||
|
||||
/// Bit counting operators with an undefined result for zero inputs.
|
||||
CTTZ_ZERO_UNDEF, CTLZ_ZERO_UNDEF,
|
||||
|
||||
// Select(COND, TRUEVAL, FALSEVAL). If the type of the boolean COND is not
|
||||
// i1 then the high bits must conform to getBooleanContents.
|
||||
SELECT,
|
||||
|
@ -352,6 +352,8 @@ def bswap : SDNode<"ISD::BSWAP" , SDTIntUnaryOp>;
|
||||
def ctlz : SDNode<"ISD::CTLZ" , SDTIntUnaryOp>;
|
||||
def cttz : SDNode<"ISD::CTTZ" , SDTIntUnaryOp>;
|
||||
def ctpop : SDNode<"ISD::CTPOP" , SDTIntUnaryOp>;
|
||||
def ctlz_zero_undef : SDNode<"ISD::CTLZ_ZERO_UNDEF", SDTIntUnaryOp>;
|
||||
def cttz_zero_undef : SDNode<"ISD::CTTZ_ZERO_UNDEF", SDTIntUnaryOp>;
|
||||
def sext : SDNode<"ISD::SIGN_EXTEND", SDTIntExtendOp>;
|
||||
def zext : SDNode<"ISD::ZERO_EXTEND", SDTIntExtendOp>;
|
||||
def anyext : SDNode<"ISD::ANY_EXTEND" , SDTIntExtendOp>;
|
||||
|
@ -180,7 +180,9 @@ namespace {
|
||||
SDValue visitSRA(SDNode *N);
|
||||
SDValue visitSRL(SDNode *N);
|
||||
SDValue visitCTLZ(SDNode *N);
|
||||
SDValue visitCTLZ_ZERO_UNDEF(SDNode *N);
|
||||
SDValue visitCTTZ(SDNode *N);
|
||||
SDValue visitCTTZ_ZERO_UNDEF(SDNode *N);
|
||||
SDValue visitCTPOP(SDNode *N);
|
||||
SDValue visitSELECT(SDNode *N);
|
||||
SDValue visitSELECT_CC(SDNode *N);
|
||||
@ -1078,7 +1080,9 @@ SDValue DAGCombiner::visit(SDNode *N) {
|
||||
case ISD::SRA: return visitSRA(N);
|
||||
case ISD::SRL: return visitSRL(N);
|
||||
case ISD::CTLZ: return visitCTLZ(N);
|
||||
case ISD::CTLZ_ZERO_UNDEF: return visitCTLZ_ZERO_UNDEF(N);
|
||||
case ISD::CTTZ: return visitCTTZ(N);
|
||||
case ISD::CTTZ_ZERO_UNDEF: return visitCTTZ_ZERO_UNDEF(N);
|
||||
case ISD::CTPOP: return visitCTPOP(N);
|
||||
case ISD::SELECT: return visitSELECT(N);
|
||||
case ISD::SELECT_CC: return visitSELECT_CC(N);
|
||||
@ -3717,6 +3721,16 @@ SDValue DAGCombiner::visitCTLZ(SDNode *N) {
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitCTLZ_ZERO_UNDEF(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
|
||||
// fold (ctlz_zero_undef c1) -> c2
|
||||
if (isa<ConstantSDNode>(N0))
|
||||
return DAG.getNode(ISD::CTLZ_ZERO_UNDEF, N->getDebugLoc(), VT, N0);
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitCTTZ(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
@ -3727,6 +3741,16 @@ SDValue DAGCombiner::visitCTTZ(SDNode *N) {
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitCTTZ_ZERO_UNDEF(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
|
||||
// fold (cttz_zero_undef c1) -> c2
|
||||
if (isa<ConstantSDNode>(N0))
|
||||
return DAG.getNode(ISD::CTTZ_ZERO_UNDEF, N->getDebugLoc(), VT, N0);
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
SDValue DAGCombiner::visitCTPOP(SDNode *N) {
|
||||
SDValue N0 = N->getOperand(0);
|
||||
EVT VT = N->getValueType(0);
|
||||
|
@ -2382,6 +2382,9 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,
|
||||
|
||||
return Op;
|
||||
}
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
// This trivially expands to CTLZ.
|
||||
return DAG.getNode(ISD::CTLZ, dl, Op.getValueType(), Op);
|
||||
case ISD::CTLZ: {
|
||||
// for now, we do this:
|
||||
// x = x | (x >> 1);
|
||||
@ -2403,6 +2406,9 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,
|
||||
Op = DAG.getNOT(dl, Op, VT);
|
||||
return DAG.getNode(ISD::CTPOP, dl, VT, Op);
|
||||
}
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
// This trivially expands to CTTZ.
|
||||
return DAG.getNode(ISD::CTTZ, dl, Op.getValueType(), Op);
|
||||
case ISD::CTTZ: {
|
||||
// for now, we use: { return popcount(~x & (x - 1)); }
|
||||
// unless the target has ctlz but not ctpop, in which case we use:
|
||||
@ -2517,7 +2523,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
switch (Node->getOpcode()) {
|
||||
case ISD::CTPOP:
|
||||
case ISD::CTLZ:
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
Tmp1 = ExpandBitCount(Node->getOpcode(), Node->getOperand(0), dl);
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
@ -3419,20 +3427,24 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
SDValue Tmp1, Tmp2, Tmp3;
|
||||
switch (Node->getOpcode()) {
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
case ISD::CTLZ:
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTPOP:
|
||||
// Zero extend the argument.
|
||||
Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
|
||||
// Perform the larger operation.
|
||||
// Perform the larger operation. For CTPOP and CTTZ_ZERO_UNDEF, this is
|
||||
// already the correct result.
|
||||
Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
|
||||
if (Node->getOpcode() == ISD::CTTZ) {
|
||||
//if Tmp1 == sizeinbits(NVT) then Tmp1 = sizeinbits(Old VT)
|
||||
// FIXME: This should set a bit in the zero extended value instead.
|
||||
Tmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT),
|
||||
Tmp1, DAG.getConstant(NVT.getSizeInBits(), NVT),
|
||||
ISD::SETEQ);
|
||||
Tmp1 = DAG.getNode(ISD::SELECT, dl, NVT, Tmp2,
|
||||
DAG.getConstant(OVT.getSizeInBits(), NVT), Tmp1);
|
||||
} else if (Node->getOpcode() == ISD::CTLZ) {
|
||||
} else if (Node->getOpcode() == ISD::CTLZ ||
|
||||
Node->getOpcode() == ISD::CTLZ_ZERO_UNDEF) {
|
||||
// Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT))
|
||||
Tmp1 = DAG.getNode(ISD::SUB, dl, NVT, Tmp1,
|
||||
DAG.getConstant(NVT.getSizeInBits() -
|
||||
|
@ -56,8 +56,10 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
|
||||
case ISD::Constant: Res = PromoteIntRes_Constant(N); break;
|
||||
case ISD::CONVERT_RNDSAT:
|
||||
Res = PromoteIntRes_CONVERT_RNDSAT(N); break;
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTLZ: Res = PromoteIntRes_CTLZ(N); break;
|
||||
case ISD::CTPOP: Res = PromoteIntRes_CTPOP(N); break;
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
case ISD::CTTZ: Res = PromoteIntRes_CTTZ(N); break;
|
||||
case ISD::EXTRACT_VECTOR_ELT:
|
||||
Res = PromoteIntRes_EXTRACT_VECTOR_ELT(N); break;
|
||||
@ -311,7 +313,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
EVT OVT = N->getValueType(0);
|
||||
EVT NVT = Op.getValueType();
|
||||
Op = DAG.getNode(ISD::CTLZ, dl, NVT, Op);
|
||||
Op = DAG.getNode(N->getOpcode(), dl, NVT, Op);
|
||||
// Subtract off the extra leading bits in the bigger type.
|
||||
return DAG.getNode(ISD::SUB, dl, NVT, Op,
|
||||
DAG.getConstant(NVT.getSizeInBits() -
|
||||
@ -329,13 +331,15 @@ SDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
|
||||
EVT OVT = N->getValueType(0);
|
||||
EVT NVT = Op.getValueType();
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
// The count is the same in the promoted type except if the original
|
||||
// value was zero. This can be handled by setting the bit just off
|
||||
// the top of the original type.
|
||||
APInt TopBit(NVT.getSizeInBits(), 0);
|
||||
TopBit.setBit(OVT.getSizeInBits());
|
||||
Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, NVT));
|
||||
return DAG.getNode(ISD::CTTZ, dl, NVT, Op);
|
||||
if (N->getOpcode() == ISD::CTTZ) {
|
||||
// The count is the same in the promoted type except if the original
|
||||
// value was zero. This can be handled by setting the bit just off
|
||||
// the top of the original type.
|
||||
APInt TopBit(NVT.getSizeInBits(), 0);
|
||||
TopBit.setBit(OVT.getSizeInBits());
|
||||
Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, NVT));
|
||||
}
|
||||
return DAG.getNode(N->getOpcode(), dl, NVT, Op);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N) {
|
||||
@ -1097,8 +1101,10 @@ void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
|
||||
case ISD::AssertZext: ExpandIntRes_AssertZext(N, Lo, Hi); break;
|
||||
case ISD::BSWAP: ExpandIntRes_BSWAP(N, Lo, Hi); break;
|
||||
case ISD::Constant: ExpandIntRes_Constant(N, Lo, Hi); break;
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTLZ: ExpandIntRes_CTLZ(N, Lo, Hi); break;
|
||||
case ISD::CTPOP: ExpandIntRes_CTPOP(N, Lo, Hi); break;
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
case ISD::CTTZ: ExpandIntRes_CTTZ(N, Lo, Hi); break;
|
||||
case ISD::FP_TO_SINT: ExpandIntRes_FP_TO_SINT(N, Lo, Hi); break;
|
||||
case ISD::FP_TO_UINT: ExpandIntRes_FP_TO_UINT(N, Lo, Hi); break;
|
||||
@ -1701,8 +1707,8 @@ void DAGTypeLegalizer::ExpandIntRes_CTLZ(SDNode *N,
|
||||
SDValue HiNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Hi,
|
||||
DAG.getConstant(0, NVT), ISD::SETNE);
|
||||
|
||||
SDValue LoLZ = DAG.getNode(ISD::CTLZ, dl, NVT, Lo);
|
||||
SDValue HiLZ = DAG.getNode(ISD::CTLZ, dl, NVT, Hi);
|
||||
SDValue LoLZ = DAG.getNode(N->getOpcode(), dl, NVT, Lo);
|
||||
SDValue HiLZ = DAG.getNode(ISD::CTLZ_ZERO_UNDEF, dl, NVT, Hi);
|
||||
|
||||
Lo = DAG.getNode(ISD::SELECT, dl, NVT, HiNotZero, HiLZ,
|
||||
DAG.getNode(ISD::ADD, dl, NVT, LoLZ,
|
||||
@ -1731,8 +1737,8 @@ void DAGTypeLegalizer::ExpandIntRes_CTTZ(SDNode *N,
|
||||
SDValue LoNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Lo,
|
||||
DAG.getConstant(0, NVT), ISD::SETNE);
|
||||
|
||||
SDValue LoLZ = DAG.getNode(ISD::CTTZ, dl, NVT, Lo);
|
||||
SDValue HiLZ = DAG.getNode(ISD::CTTZ, dl, NVT, Hi);
|
||||
SDValue LoLZ = DAG.getNode(ISD::CTTZ_ZERO_UNDEF, dl, NVT, Lo);
|
||||
SDValue HiLZ = DAG.getNode(N->getOpcode(), dl, NVT, Hi);
|
||||
|
||||
Lo = DAG.getNode(ISD::SELECT, dl, NVT, LoNotZero, LoLZ,
|
||||
DAG.getNode(ISD::ADD, dl, NVT, HiLZ,
|
||||
|
@ -185,8 +185,10 @@ SDValue VectorLegalizer::LegalizeOp(SDValue Op) {
|
||||
case ISD::SRL:
|
||||
case ISD::ROTL:
|
||||
case ISD::ROTR:
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTLZ:
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
case ISD::CTPOP:
|
||||
case ISD::SELECT:
|
||||
case ISD::VSELECT:
|
||||
|
@ -441,8 +441,10 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
|
||||
case ISD::ANY_EXTEND:
|
||||
case ISD::CONVERT_RNDSAT:
|
||||
case ISD::CTLZ:
|
||||
case ISD::CTPOP:
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
case ISD::CTPOP:
|
||||
case ISD::FABS:
|
||||
case ISD::FCEIL:
|
||||
case ISD::FCOS:
|
||||
|
@ -1856,7 +1856,9 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, const APInt &Mask,
|
||||
return;
|
||||
}
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
case ISD::CTLZ:
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
case ISD::CTPOP: {
|
||||
unsigned LowBits = Log2_32(BitWidth)+1;
|
||||
KnownZero = APInt::getHighBitsSet(BitWidth, BitWidth - LowBits);
|
||||
@ -2429,8 +2431,10 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL,
|
||||
case ISD::CTPOP:
|
||||
return getConstant(Val.countPopulation(), VT);
|
||||
case ISD::CTLZ:
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
return getConstant(Val.countLeadingZeros(), VT);
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTTZ_ZERO_UNDEF:
|
||||
return getConstant(Val.countTrailingZeros(), VT);
|
||||
}
|
||||
}
|
||||
@ -6111,10 +6115,12 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
|
||||
case ISD::TRAP: return "trap";
|
||||
|
||||
// Bit manipulation
|
||||
case ISD::BSWAP: return "bswap";
|
||||
case ISD::CTPOP: return "ctpop";
|
||||
case ISD::CTTZ: return "cttz";
|
||||
case ISD::CTLZ: return "ctlz";
|
||||
case ISD::BSWAP: return "bswap";
|
||||
case ISD::CTPOP: return "ctpop";
|
||||
case ISD::CTTZ: return "cttz";
|
||||
case ISD::CTTZ_ZERO_UNDEF: return "cttz_zero_undef";
|
||||
case ISD::CTLZ: return "ctlz";
|
||||
case ISD::CTLZ_ZERO_UNDEF: return "ctlz_zero_undef";
|
||||
|
||||
// Trampolines
|
||||
case ISD::INIT_TRAMPOLINE: return "init_trampoline";
|
||||
|
@ -4948,14 +4948,18 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
return 0;
|
||||
case Intrinsic::cttz: {
|
||||
SDValue Arg = getValue(I.getArgOperand(0));
|
||||
ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
|
||||
EVT Ty = Arg.getValueType();
|
||||
setValue(&I, DAG.getNode(ISD::CTTZ, dl, Ty, Arg));
|
||||
setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTTZ : ISD::CTTZ_ZERO_UNDEF,
|
||||
dl, Ty, Arg));
|
||||
return 0;
|
||||
}
|
||||
case Intrinsic::ctlz: {
|
||||
SDValue Arg = getValue(I.getArgOperand(0));
|
||||
ConstantInt *CI = cast<ConstantInt>(I.getArgOperand(1));
|
||||
EVT Ty = Arg.getValueType();
|
||||
setValue(&I, DAG.getNode(ISD::CTLZ, dl, Ty, Arg));
|
||||
setValue(&I, DAG.getNode(CI->isZero() ? ISD::CTLZ : ISD::CTLZ_ZERO_UNDEF,
|
||||
dl, Ty, Arg));
|
||||
return 0;
|
||||
}
|
||||
case Intrinsic::ctpop: {
|
||||
|
@ -609,6 +609,10 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
|
||||
if (!Subtarget->hasV5TOps() || Subtarget->isThumb1Only())
|
||||
setOperationAction(ISD::CTLZ, MVT::i32, Expand);
|
||||
|
||||
// These just redirect to CTTZ and CTLZ on ARM.
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF , MVT::i32 , Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF , MVT::i32 , Expand);
|
||||
|
||||
// Only ARMv6 has BSWAP.
|
||||
if (!Subtarget->hasV6Ops())
|
||||
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
|
||||
|
@ -296,12 +296,22 @@ SPUTargetLowering::SPUTargetLowering(SPUTargetMachine &TM)
|
||||
setOperationAction(ISD::CTTZ , MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ , MVT::i64, Expand);
|
||||
setOperationAction(ISD::CTTZ , MVT::i128, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i8, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i16, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i128, Expand);
|
||||
|
||||
setOperationAction(ISD::CTLZ , MVT::i8, Promote);
|
||||
setOperationAction(ISD::CTLZ , MVT::i16, Promote);
|
||||
setOperationAction(ISD::CTLZ , MVT::i32, Legal);
|
||||
setOperationAction(ISD::CTLZ , MVT::i64, Expand);
|
||||
setOperationAction(ISD::CTLZ , MVT::i128, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i8, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i16, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i64, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i128, Expand);
|
||||
|
||||
// SPU has a version of select that implements (a&~c)|(b&c), just like
|
||||
// select ought to work:
|
||||
|
@ -1250,7 +1250,9 @@ HexagonTargetLowering::HexagonTargetLowering(HexagonTargetMachine
|
||||
setOperationAction(ISD::FREM , MVT::f32, Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ , MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ , MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::ROTL , MVT::i32, Expand);
|
||||
setOperationAction(ISD::ROTR , MVT::i32, Expand);
|
||||
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
|
||||
|
@ -167,7 +167,9 @@ MBlazeTargetLowering::MBlazeTargetLowering(MBlazeTargetMachine &TM)
|
||||
setOperationAction(ISD::SRA_PARTS, MVT::i32, Expand);
|
||||
setOperationAction(ISD::SRL_PARTS, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i32, Expand);
|
||||
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
|
||||
|
||||
|
@ -122,8 +122,12 @@ MSP430TargetLowering::MSP430TargetLowering(MSP430TargetMachine &tm) :
|
||||
|
||||
setOperationAction(ISD::CTTZ, MVT::i8, Expand);
|
||||
setOperationAction(ISD::CTTZ, MVT::i16, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i8, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i16, Expand);
|
||||
setOperationAction(ISD::CTLZ, MVT::i8, Expand);
|
||||
setOperationAction(ISD::CTLZ, MVT::i16, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i8, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i16, Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i8, Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i16, Expand);
|
||||
|
||||
|
@ -156,6 +156,10 @@ MipsTargetLowering(MipsTargetMachine &TM)
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i64, Expand);
|
||||
setOperationAction(ISD::ROTL, MVT::i32, Expand);
|
||||
setOperationAction(ISD::ROTL, MVT::i64, Expand);
|
||||
|
||||
|
@ -153,9 +153,13 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
|
||||
setOperationAction(ISD::BSWAP, MVT::i32 , Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i32 , Expand);
|
||||
setOperationAction(ISD::CTTZ , MVT::i32 , Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::BSWAP, MVT::i64 , Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i64 , Expand);
|
||||
setOperationAction(ISD::CTTZ , MVT::i64 , Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i64, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i64, Expand);
|
||||
|
||||
// PowerPC does not have ROTR
|
||||
setOperationAction(ISD::ROTR, MVT::i32 , Expand);
|
||||
@ -339,7 +343,9 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
|
||||
setOperationAction(ISD::FPOW, VT, Expand);
|
||||
setOperationAction(ISD::CTPOP, VT, Expand);
|
||||
setOperationAction(ISD::CTLZ, VT, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, VT, Expand);
|
||||
setOperationAction(ISD::CTTZ, VT, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, VT, Expand);
|
||||
}
|
||||
|
||||
// We can custom expand all VECTOR_SHUFFLEs to VPERM, others we can handle
|
||||
|
@ -763,7 +763,9 @@ SparcTargetLowering::SparcTargetLowering(TargetMachine &TM)
|
||||
setOperationAction(ISD::FMA , MVT::f32, Expand);
|
||||
setOperationAction(ISD::CTPOP, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ , MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ , MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::ROTL , MVT::i32, Expand);
|
||||
setOperationAction(ISD::ROTR , MVT::i32, Expand);
|
||||
setOperationAction(ISD::BSWAP, MVT::i32, Expand);
|
||||
|
@ -378,6 +378,10 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FREM , MVT::f80 , Expand);
|
||||
setOperationAction(ISD::FLT_ROUNDS_ , MVT::i32 , Custom);
|
||||
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF , MVT::i8 , Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF , MVT::i16 , Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF , MVT::i32 , Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF , MVT::i64 , Expand);
|
||||
if (Subtarget->hasBMI()) {
|
||||
setOperationAction(ISD::CTTZ , MVT::i8 , Promote);
|
||||
} else {
|
||||
@ -388,6 +392,10 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::CTTZ , MVT::i64 , Custom);
|
||||
}
|
||||
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF , MVT::i8 , Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF , MVT::i16 , Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF , MVT::i32 , Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF , MVT::i64 , Expand);
|
||||
if (Subtarget->hasLZCNT()) {
|
||||
setOperationAction(ISD::CTLZ , MVT::i8 , Promote);
|
||||
} else {
|
||||
@ -719,7 +727,9 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
setOperationAction(ISD::FPOW, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::CTPOP, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::CTTZ, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::CTLZ, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::SHL, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::SRA, (MVT::SimpleValueType)VT, Expand);
|
||||
setOperationAction(ISD::SRL, (MVT::SimpleValueType)VT, Expand);
|
||||
|
@ -109,6 +109,8 @@ XCoreTargetLowering::XCoreTargetLowering(XCoreTargetMachine &XTM)
|
||||
setOperationAction(ISD::CTPOP, MVT::i32, Expand);
|
||||
setOperationAction(ISD::ROTL , MVT::i32, Expand);
|
||||
setOperationAction(ISD::ROTR , MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, MVT::i32, Expand);
|
||||
|
||||
setOperationAction(ISD::TRAP, MVT::Other, Legal);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user