forked from OSchip/llvm-project
parent
bf6a4e0b39
commit
def496c04b
|
@ -503,19 +503,6 @@ namespace ISD {
|
|||
/// address spaces.
|
||||
ADDRSPACECAST,
|
||||
|
||||
/// CONVERT_RNDSAT - This operator is used to support various conversions
|
||||
/// between various types (float, signed, unsigned and vectors of those
|
||||
/// types) with rounding and saturation. NOTE: Avoid using this operator as
|
||||
/// most target don't support it and the operator might be removed in the
|
||||
/// future. It takes the following arguments:
|
||||
/// 0) value
|
||||
/// 1) dest type (type to convert to)
|
||||
/// 2) src type (type to convert from)
|
||||
/// 3) rounding imm
|
||||
/// 4) saturation imm
|
||||
/// 5) ISD::CvtCode indicating the type of conversion to do
|
||||
CONVERT_RNDSAT,
|
||||
|
||||
/// FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions
|
||||
/// and truncation for half-precision (16 bit) floating numbers. These nodes
|
||||
/// form a semi-softened interface for dealing with f16 (as an i16), which
|
||||
|
@ -927,21 +914,6 @@ namespace ISD {
|
|||
/// SETCC_INVALID if it is not possible to represent the resultant comparison.
|
||||
CondCode getSetCCAndOperation(CondCode Op1, CondCode Op2, bool isInteger);
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
/// This enum defines the various converts CONVERT_RNDSAT supports.
|
||||
enum CvtCode {
|
||||
CVT_FF, /// Float from Float
|
||||
CVT_FS, /// Float from Signed
|
||||
CVT_FU, /// Float from Unsigned
|
||||
CVT_SF, /// Signed from Float
|
||||
CVT_UF, /// Unsigned from Float
|
||||
CVT_SS, /// Signed from Signed
|
||||
CVT_SU, /// Signed from Unsigned
|
||||
CVT_US, /// Unsigned from Signed
|
||||
CVT_UU, /// Unsigned from Unsigned
|
||||
CVT_INVALID /// Marker - Invalid opcode
|
||||
};
|
||||
|
||||
} // end llvm::ISD namespace
|
||||
|
||||
} // end llvm namespace
|
||||
|
|
|
@ -626,12 +626,6 @@ public:
|
|||
|
||||
SDValue getCondCode(ISD::CondCode Cond);
|
||||
|
||||
/// Returns the ConvertRndSat Note: Avoid using this node because it may
|
||||
/// disappear in the future and most targets don't support it.
|
||||
SDValue getConvertRndSat(EVT VT, const SDLoc &dl, SDValue Val, SDValue DTy,
|
||||
SDValue STy, SDValue Rnd, SDValue Sat,
|
||||
ISD::CvtCode Code);
|
||||
|
||||
/// Return an ISD::VECTOR_SHUFFLE node. The number of elements in VT,
|
||||
/// which must be a vector type, must match the number of mask elements
|
||||
/// NumElts. An integer mask element equal to -1 is treated as undefined.
|
||||
|
|
|
@ -1860,26 +1860,6 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// NOTE: avoid using this node as this may disappear in the
|
||||
/// future and most targets don't support it.
|
||||
class CvtRndSatSDNode : public SDNode {
|
||||
ISD::CvtCode CvtCode;
|
||||
|
||||
friend class SelectionDAG;
|
||||
|
||||
explicit CvtRndSatSDNode(EVT VT, unsigned Order, const DebugLoc &dl,
|
||||
ISD::CvtCode Code)
|
||||
: SDNode(ISD::CONVERT_RNDSAT, Order, dl, getSDVTList(VT)), CvtCode(Code) {
|
||||
}
|
||||
|
||||
public:
|
||||
ISD::CvtCode getCvtCode() const { return CvtCode; }
|
||||
|
||||
static bool classof(const SDNode *N) {
|
||||
return N->getOpcode() == ISD::CONVERT_RNDSAT;
|
||||
}
|
||||
};
|
||||
|
||||
/// This class is used to represent EVT's, which are used
|
||||
/// to parameterize some operations.
|
||||
class VTSDNode : public SDNode {
|
||||
|
@ -2041,7 +2021,7 @@ public:
|
|||
friend class SelectionDAG;
|
||||
|
||||
MaskedStoreSDNode(unsigned Order, const DebugLoc &dl, SDVTList VTs,
|
||||
bool isTrunc, bool isCompressing, EVT MemVT,
|
||||
bool isTrunc, bool isCompressing, EVT MemVT,
|
||||
MachineMemOperand *MMO)
|
||||
: MaskedLoadStoreSDNode(ISD::MSTORE, Order, dl, VTs, MemVT, MMO) {
|
||||
StoreSDNodeBits.IsTruncating = isTrunc;
|
||||
|
@ -2054,8 +2034,8 @@ public:
|
|||
bool isTruncatingStore() const { return StoreSDNodeBits.IsTruncating; }
|
||||
|
||||
/// Returns true if the op does a compression to the vector before storing.
|
||||
/// The node contiguously stores the active elements (integers or floats)
|
||||
/// in src (those with their respective bit set in writemask k) to unaligned
|
||||
/// The node contiguously stores the active elements (integers or floats)
|
||||
/// in src (those with their respective bit set in writemask k) to unaligned
|
||||
/// memory at base_addr.
|
||||
bool isCompressingStore() const { return StoreSDNodeBits.IsCompressing; }
|
||||
|
||||
|
|
|
@ -578,8 +578,8 @@ def int_invariant_end : Intrinsic<[],
|
|||
llvm_anyptr_ty],
|
||||
[IntrArgMemOnly, NoCapture<2>]>;
|
||||
|
||||
def int_invariant_group_barrier : Intrinsic<[llvm_ptr_ty],
|
||||
[llvm_ptr_ty],
|
||||
def int_invariant_group_barrier : Intrinsic<[llvm_ptr_ty],
|
||||
[llvm_ptr_ty],
|
||||
[IntrNoMem]>;
|
||||
|
||||
//===------------------------ Stackmap Intrinsics -------------------------===//
|
||||
|
@ -683,29 +683,6 @@ def int_convert_to_fp16 : Intrinsic<[llvm_i16_ty], [llvm_anyfloat_ty]>;
|
|||
def int_convert_from_fp16 : Intrinsic<[llvm_anyfloat_ty], [llvm_i16_ty]>;
|
||||
}
|
||||
|
||||
// These convert intrinsics are to support various conversions between
|
||||
// various types with rounding and saturation. NOTE: avoid using these
|
||||
// intrinsics as they might be removed sometime in the future and
|
||||
// most targets don't support them.
|
||||
def int_convertff : Intrinsic<[llvm_anyfloat_ty],
|
||||
[llvm_anyfloat_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertfsi : Intrinsic<[llvm_anyfloat_ty],
|
||||
[llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertfui : Intrinsic<[llvm_anyfloat_ty],
|
||||
[llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertsif : Intrinsic<[llvm_anyint_ty],
|
||||
[llvm_anyfloat_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertuif : Intrinsic<[llvm_anyint_ty],
|
||||
[llvm_anyfloat_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertss : Intrinsic<[llvm_anyint_ty],
|
||||
[llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertsu : Intrinsic<[llvm_anyint_ty],
|
||||
[llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertus : Intrinsic<[llvm_anyint_ty],
|
||||
[llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
def int_convertuu : Intrinsic<[llvm_anyint_ty],
|
||||
[llvm_anyint_ty, llvm_i32_ty, llvm_i32_ty]>;
|
||||
|
||||
// Clear cache intrinsic, default to ignore (ie. emit nothing)
|
||||
// maps to void __clear_cache() on supporting platforms
|
||||
def int_clear_cache : Intrinsic<[], [llvm_ptr_ty, llvm_ptr_ty],
|
||||
|
|
|
@ -575,9 +575,6 @@ def intrinsic_w_chain : SDNode<"ISD::INTRINSIC_W_CHAIN",
|
|||
def intrinsic_wo_chain : SDNode<"ISD::INTRINSIC_WO_CHAIN",
|
||||
SDTypeProfile<1, -1, [SDTCisPtrTy<1>]>, []>;
|
||||
|
||||
// Do not use cvt directly. Use cvt forms below
|
||||
def cvt : SDNode<"ISD::CONVERT_RNDSAT", SDTConvertOp>;
|
||||
|
||||
def SDT_assertext : SDTypeProfile<1, 1,
|
||||
[SDTCisInt<0>, SDTCisInt<1>, SDTCisSameAs<1, 0>]>;
|
||||
def assertsext : SDNode<"ISD::AssertSext", SDT_assertext>;
|
||||
|
@ -1084,54 +1081,6 @@ def atomic_load_64 :
|
|||
return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
|
||||
}]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Selection DAG CONVERT_RNDSAT patterns
|
||||
|
||||
def cvtff : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FF;
|
||||
}]>;
|
||||
|
||||
def cvtss : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SS;
|
||||
}]>;
|
||||
|
||||
def cvtsu : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SU;
|
||||
}]>;
|
||||
|
||||
def cvtus : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_US;
|
||||
}]>;
|
||||
|
||||
def cvtuu : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_UU;
|
||||
}]>;
|
||||
|
||||
def cvtsf : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SF;
|
||||
}]>;
|
||||
|
||||
def cvtuf : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_UF;
|
||||
}]>;
|
||||
|
||||
def cvtfs : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FS;
|
||||
}]>;
|
||||
|
||||
def cvtfu : PatFrag<(ops node:$val, node:$dty, node:$sty, node:$rd, node:$sat),
|
||||
(cvt node:$val, node:$dty, node:$sty, node:$rd, node:$sat), [{
|
||||
return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FU;
|
||||
}]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Selection DAG Pattern Support.
|
||||
//
|
||||
|
|
|
@ -57,8 +57,6 @@ void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
|
|||
case ISD::BSWAP: Res = PromoteIntRes_BSWAP(N); break;
|
||||
case ISD::BUILD_PAIR: Res = PromoteIntRes_BUILD_PAIR(N); break;
|
||||
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;
|
||||
|
@ -354,18 +352,6 @@ SDValue DAGTypeLegalizer::PromoteIntRes_Constant(SDNode *N) {
|
|||
return Result;
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_CONVERT_RNDSAT(SDNode *N) {
|
||||
ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
|
||||
assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
|
||||
CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
|
||||
CvtCode == ISD::CVT_SF || CvtCode == ISD::CVT_UF) &&
|
||||
"can only promote integers");
|
||||
EVT OutVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
return DAG.getConvertRndSat(OutVT, SDLoc(N), N->getOperand(0),
|
||||
N->getOperand(1), N->getOperand(2),
|
||||
N->getOperand(3), N->getOperand(4), CvtCode);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
|
||||
// Zero extend to the promoted type and do the count there.
|
||||
SDValue Op = ZExtPromotedInteger(N->getOperand(0));
|
||||
|
@ -512,7 +498,7 @@ SDValue DAGTypeLegalizer::PromoteIntRes_MGATHER(MaskedGatherSDNode *N) {
|
|||
N->getIndex()};
|
||||
SDValue Res = DAG.getMaskedGather(DAG.getVTList(NVT, MVT::Other),
|
||||
N->getMemoryVT(), dl, Ops,
|
||||
N->getMemOperand());
|
||||
N->getMemOperand());
|
||||
// Legalize the chain result - switch anything that used the old chain to
|
||||
// use the new one.
|
||||
ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
|
||||
|
@ -887,8 +873,6 @@ bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
|
|||
case ISD::BUILD_VECTOR: Res = PromoteIntOp_BUILD_VECTOR(N); break;
|
||||
case ISD::CONCAT_VECTORS: Res = PromoteIntOp_CONCAT_VECTORS(N); break;
|
||||
case ISD::EXTRACT_VECTOR_ELT: Res = PromoteIntOp_EXTRACT_VECTOR_ELT(N); break;
|
||||
case ISD::CONVERT_RNDSAT:
|
||||
Res = PromoteIntOp_CONVERT_RNDSAT(N); break;
|
||||
case ISD::INSERT_VECTOR_ELT:
|
||||
Res = PromoteIntOp_INSERT_VECTOR_ELT(N, OpNo);break;
|
||||
case ISD::SCALAR_TO_VECTOR:
|
||||
|
@ -1068,18 +1052,6 @@ SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) {
|
|||
return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_CONVERT_RNDSAT(SDNode *N) {
|
||||
ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
|
||||
assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
|
||||
CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
|
||||
CvtCode == ISD::CVT_FS || CvtCode == ISD::CVT_FU) &&
|
||||
"can only promote integer arguments");
|
||||
SDValue InOp = GetPromotedInteger(N->getOperand(0));
|
||||
return DAG.getConvertRndSat(N->getValueType(0), SDLoc(N), InOp,
|
||||
N->getOperand(1), N->getOperand(2),
|
||||
N->getOperand(3), N->getOperand(4), CvtCode);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
|
||||
unsigned OpNo) {
|
||||
if (OpNo == 1) {
|
||||
|
|
|
@ -249,7 +249,6 @@ private:
|
|||
SDValue PromoteIntRes_BITREVERSE(SDNode *N);
|
||||
SDValue PromoteIntRes_BUILD_PAIR(SDNode *N);
|
||||
SDValue PromoteIntRes_Constant(SDNode *N);
|
||||
SDValue PromoteIntRes_CONVERT_RNDSAT(SDNode *N);
|
||||
SDValue PromoteIntRes_CTLZ(SDNode *N);
|
||||
SDValue PromoteIntRes_CTPOP(SDNode *N);
|
||||
SDValue PromoteIntRes_CTTZ(SDNode *N);
|
||||
|
@ -288,7 +287,6 @@ private:
|
|||
SDValue PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo);
|
||||
SDValue PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo);
|
||||
SDValue PromoteIntOp_BUILD_VECTOR(SDNode *N);
|
||||
SDValue PromoteIntOp_CONVERT_RNDSAT(SDNode *N);
|
||||
SDValue PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N, unsigned OpNo);
|
||||
SDValue PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N);
|
||||
SDValue PromoteIntOp_EXTRACT_SUBVECTOR(SDNode *N);
|
||||
|
@ -602,7 +600,6 @@ private:
|
|||
|
||||
SDValue ScalarizeVecRes_BITCAST(SDNode *N);
|
||||
SDValue ScalarizeVecRes_BUILD_VECTOR(SDNode *N);
|
||||
SDValue ScalarizeVecRes_CONVERT_RNDSAT(SDNode *N);
|
||||
SDValue ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N);
|
||||
SDValue ScalarizeVecRes_FP_ROUND(SDNode *N);
|
||||
SDValue ScalarizeVecRes_FPOWI(SDNode *N);
|
||||
|
@ -708,7 +705,6 @@ private:
|
|||
SDValue WidenVecRes_BITCAST(SDNode* N);
|
||||
SDValue WidenVecRes_BUILD_VECTOR(SDNode* N);
|
||||
SDValue WidenVecRes_CONCAT_VECTORS(SDNode* N);
|
||||
SDValue WidenVecRes_CONVERT_RNDSAT(SDNode* N);
|
||||
SDValue WidenVecRes_EXTEND_VECTOR_INREG(SDNode* N);
|
||||
SDValue WidenVecRes_EXTRACT_SUBVECTOR(SDNode* N);
|
||||
SDValue WidenVecRes_INSERT_VECTOR_ELT(SDNode* N);
|
||||
|
|
|
@ -51,7 +51,6 @@ void DAGTypeLegalizer::ScalarizeVectorResult(SDNode *N, unsigned ResNo) {
|
|||
case ISD::MERGE_VALUES: R = ScalarizeVecRes_MERGE_VALUES(N, ResNo);break;
|
||||
case ISD::BITCAST: R = ScalarizeVecRes_BITCAST(N); break;
|
||||
case ISD::BUILD_VECTOR: R = ScalarizeVecRes_BUILD_VECTOR(N); break;
|
||||
case ISD::CONVERT_RNDSAT: R = ScalarizeVecRes_CONVERT_RNDSAT(N); break;
|
||||
case ISD::EXTRACT_SUBVECTOR: R = ScalarizeVecRes_EXTRACT_SUBVECTOR(N); break;
|
||||
case ISD::FP_ROUND: R = ScalarizeVecRes_FP_ROUND(N); break;
|
||||
case ISD::FP_ROUND_INREG: R = ScalarizeVecRes_InregOp(N); break;
|
||||
|
@ -179,17 +178,6 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_BUILD_VECTOR(SDNode *N) {
|
|||
return InOp;
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::ScalarizeVecRes_CONVERT_RNDSAT(SDNode *N) {
|
||||
EVT NewVT = N->getValueType(0).getVectorElementType();
|
||||
SDValue Op0 = GetScalarizedVector(N->getOperand(0));
|
||||
return DAG.getConvertRndSat(NewVT, SDLoc(N),
|
||||
Op0, DAG.getValueType(NewVT),
|
||||
DAG.getValueType(Op0.getValueType()),
|
||||
N->getOperand(3),
|
||||
N->getOperand(4),
|
||||
cast<CvtRndSatSDNode>(N)->getCvtCode());
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::ScalarizeVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, SDLoc(N),
|
||||
N->getValueType(0).getVectorElementType(),
|
||||
|
@ -621,7 +609,6 @@ void DAGTypeLegalizer::SplitVectorResult(SDNode *N, unsigned ResNo) {
|
|||
|
||||
case ISD::BITREVERSE:
|
||||
case ISD::BSWAP:
|
||||
case ISD::CONVERT_RNDSAT:
|
||||
case ISD::CTLZ:
|
||||
case ISD::CTTZ:
|
||||
case ISD::CTLZ_ZERO_UNDEF:
|
||||
|
@ -1235,18 +1222,6 @@ void DAGTypeLegalizer::SplitVecRes_UnaryOp(SDNode *N, SDValue &Lo,
|
|||
if (N->getOpcode() == ISD::FP_ROUND) {
|
||||
Lo = DAG.getNode(N->getOpcode(), dl, LoVT, Lo, N->getOperand(1));
|
||||
Hi = DAG.getNode(N->getOpcode(), dl, HiVT, Hi, N->getOperand(1));
|
||||
} else if (N->getOpcode() == ISD::CONVERT_RNDSAT) {
|
||||
SDValue DTyOpLo = DAG.getValueType(LoVT);
|
||||
SDValue DTyOpHi = DAG.getValueType(HiVT);
|
||||
SDValue STyOpLo = DAG.getValueType(Lo.getValueType());
|
||||
SDValue STyOpHi = DAG.getValueType(Hi.getValueType());
|
||||
SDValue RndOp = N->getOperand(3);
|
||||
SDValue SatOp = N->getOperand(4);
|
||||
ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
|
||||
Lo = DAG.getConvertRndSat(LoVT, dl, Lo, DTyOpLo, STyOpLo, RndOp, SatOp,
|
||||
CvtCode);
|
||||
Hi = DAG.getConvertRndSat(HiVT, dl, Hi, DTyOpHi, STyOpHi, RndOp, SatOp,
|
||||
CvtCode);
|
||||
} else {
|
||||
Lo = DAG.getNode(N->getOpcode(), dl, LoVT, Lo);
|
||||
Hi = DAG.getNode(N->getOpcode(), dl, HiVT, Hi);
|
||||
|
@ -2044,7 +2019,6 @@ void DAGTypeLegalizer::WidenVectorResult(SDNode *N, unsigned ResNo) {
|
|||
case ISD::BITCAST: Res = WidenVecRes_BITCAST(N); break;
|
||||
case ISD::BUILD_VECTOR: Res = WidenVecRes_BUILD_VECTOR(N); break;
|
||||
case ISD::CONCAT_VECTORS: Res = WidenVecRes_CONCAT_VECTORS(N); break;
|
||||
case ISD::CONVERT_RNDSAT: Res = WidenVecRes_CONVERT_RNDSAT(N); break;
|
||||
case ISD::EXTRACT_SUBVECTOR: Res = WidenVecRes_EXTRACT_SUBVECTOR(N); break;
|
||||
case ISD::FP_ROUND_INREG: Res = WidenVecRes_InregOp(N); break;
|
||||
case ISD::INSERT_VECTOR_ELT: Res = WidenVecRes_INSERT_VECTOR_ELT(N); break;
|
||||
|
@ -2692,86 +2666,6 @@ SDValue DAGTypeLegalizer::WidenVecRes_CONCAT_VECTORS(SDNode *N) {
|
|||
return DAG.getNode(ISD::BUILD_VECTOR, dl, WidenVT, Ops);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::WidenVecRes_CONVERT_RNDSAT(SDNode *N) {
|
||||
SDLoc dl(N);
|
||||
SDValue InOp = N->getOperand(0);
|
||||
SDValue RndOp = N->getOperand(3);
|
||||
SDValue SatOp = N->getOperand(4);
|
||||
|
||||
EVT WidenVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
|
||||
unsigned WidenNumElts = WidenVT.getVectorNumElements();
|
||||
|
||||
EVT InVT = InOp.getValueType();
|
||||
EVT InEltVT = InVT.getVectorElementType();
|
||||
EVT InWidenVT = EVT::getVectorVT(*DAG.getContext(), InEltVT, WidenNumElts);
|
||||
|
||||
SDValue DTyOp = DAG.getValueType(WidenVT);
|
||||
SDValue STyOp = DAG.getValueType(InWidenVT);
|
||||
ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
|
||||
|
||||
unsigned InVTNumElts = InVT.getVectorNumElements();
|
||||
if (getTypeAction(InVT) == TargetLowering::TypeWidenVector) {
|
||||
InOp = GetWidenedVector(InOp);
|
||||
InVT = InOp.getValueType();
|
||||
InVTNumElts = InVT.getVectorNumElements();
|
||||
if (InVTNumElts == WidenNumElts)
|
||||
return DAG.getConvertRndSat(WidenVT, dl, InOp, DTyOp, STyOp, RndOp,
|
||||
SatOp, CvtCode);
|
||||
}
|
||||
|
||||
if (TLI.isTypeLegal(InWidenVT)) {
|
||||
// Because the result and the input are different vector types, widening
|
||||
// the result could create a legal type but widening the input might make
|
||||
// it an illegal type that might lead to repeatedly splitting the input
|
||||
// and then widening it. To avoid this, we widen the input only if
|
||||
// it results in a legal type.
|
||||
if (WidenNumElts % InVTNumElts == 0) {
|
||||
// Widen the input and call convert on the widened input vector.
|
||||
unsigned NumConcat = WidenNumElts/InVTNumElts;
|
||||
SmallVector<SDValue, 16> Ops(NumConcat);
|
||||
Ops[0] = InOp;
|
||||
SDValue UndefVal = DAG.getUNDEF(InVT);
|
||||
for (unsigned i = 1; i != NumConcat; ++i)
|
||||
Ops[i] = UndefVal;
|
||||
|
||||
InOp = DAG.getNode(ISD::CONCAT_VECTORS, dl, InWidenVT, Ops);
|
||||
return DAG.getConvertRndSat(WidenVT, dl, InOp, DTyOp, STyOp, RndOp,
|
||||
SatOp, CvtCode);
|
||||
}
|
||||
|
||||
if (InVTNumElts % WidenNumElts == 0) {
|
||||
// Extract the input and convert the shorten input vector.
|
||||
InOp = DAG.getNode(
|
||||
ISD::EXTRACT_SUBVECTOR, dl, InWidenVT, InOp,
|
||||
DAG.getConstant(0, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
return DAG.getConvertRndSat(WidenVT, dl, InOp, DTyOp, STyOp, RndOp,
|
||||
SatOp, CvtCode);
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise unroll into some nasty scalar code and rebuild the vector.
|
||||
SmallVector<SDValue, 16> Ops(WidenNumElts);
|
||||
EVT EltVT = WidenVT.getVectorElementType();
|
||||
DTyOp = DAG.getValueType(EltVT);
|
||||
STyOp = DAG.getValueType(InEltVT);
|
||||
|
||||
unsigned MinElts = std::min(InVTNumElts, WidenNumElts);
|
||||
unsigned i;
|
||||
for (i=0; i < MinElts; ++i) {
|
||||
SDValue ExtVal = DAG.getNode(
|
||||
ISD::EXTRACT_VECTOR_ELT, dl, InEltVT, InOp,
|
||||
DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout())));
|
||||
Ops[i] = DAG.getConvertRndSat(WidenVT, dl, ExtVal, DTyOp, STyOp, RndOp,
|
||||
SatOp, CvtCode);
|
||||
}
|
||||
|
||||
SDValue UndefVal = DAG.getUNDEF(EltVT);
|
||||
for (; i < WidenNumElts; ++i)
|
||||
Ops[i] = UndefVal;
|
||||
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, dl, WidenVT, Ops);
|
||||
}
|
||||
|
||||
SDValue DAGTypeLegalizer::WidenVecRes_EXTRACT_SUBVECTOR(SDNode *N) {
|
||||
EVT VT = N->getValueType(0);
|
||||
EVT WidenVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
|
||||
|
|
|
@ -1629,31 +1629,6 @@ SDValue SelectionDAG::getCommutedVectorShuffle(const ShuffleVectorSDNode &SV) {
|
|||
return getVectorShuffle(VT, SDLoc(&SV), Op1, Op0, MaskVec);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getConvertRndSat(EVT VT, const SDLoc &dl, SDValue Val,
|
||||
SDValue DTy, SDValue STy, SDValue Rnd,
|
||||
SDValue Sat, ISD::CvtCode Code) {
|
||||
// If the src and dest types are the same and the conversion is between
|
||||
// integer types of the same sign or two floats, no conversion is necessary.
|
||||
if (DTy == STy &&
|
||||
(Code == ISD::CVT_UU || Code == ISD::CVT_SS || Code == ISD::CVT_FF))
|
||||
return Val;
|
||||
|
||||
FoldingSetNodeID ID;
|
||||
SDValue Ops[] = { Val, DTy, STy, Rnd, Sat };
|
||||
AddNodeIDNode(ID, ISD::CONVERT_RNDSAT, getVTList(VT), Ops);
|
||||
void* IP = nullptr;
|
||||
if (SDNode *E = FindNodeOrInsertPos(ID, dl, IP))
|
||||
return SDValue(E, 0);
|
||||
|
||||
auto *N =
|
||||
newSDNode<CvtRndSatSDNode>(VT, dl.getIROrder(), dl.getDebugLoc(), Code);
|
||||
createOperands(N, Ops);
|
||||
|
||||
CSEMap.InsertNode(N, IP);
|
||||
InsertNode(N);
|
||||
return SDValue(N, 0);
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getRegister(unsigned RegNo, EVT VT) {
|
||||
FoldingSetNodeID ID;
|
||||
AddNodeIDNode(ID, ISD::Register, getVTList(VT), None);
|
||||
|
|
|
@ -5211,39 +5211,6 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
|||
setValue(&I, Res);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::convertff:
|
||||
case Intrinsic::convertfsi:
|
||||
case Intrinsic::convertfui:
|
||||
case Intrinsic::convertsif:
|
||||
case Intrinsic::convertuif:
|
||||
case Intrinsic::convertss:
|
||||
case Intrinsic::convertsu:
|
||||
case Intrinsic::convertus:
|
||||
case Intrinsic::convertuu: {
|
||||
ISD::CvtCode Code = ISD::CVT_INVALID;
|
||||
switch (Intrinsic) {
|
||||
default: llvm_unreachable("Impossible intrinsic"); // Can't reach here.
|
||||
case Intrinsic::convertff: Code = ISD::CVT_FF; break;
|
||||
case Intrinsic::convertfsi: Code = ISD::CVT_FS; break;
|
||||
case Intrinsic::convertfui: Code = ISD::CVT_FU; break;
|
||||
case Intrinsic::convertsif: Code = ISD::CVT_SF; break;
|
||||
case Intrinsic::convertuif: Code = ISD::CVT_UF; break;
|
||||
case Intrinsic::convertss: Code = ISD::CVT_SS; break;
|
||||
case Intrinsic::convertsu: Code = ISD::CVT_SU; break;
|
||||
case Intrinsic::convertus: Code = ISD::CVT_US; break;
|
||||
case Intrinsic::convertuu: Code = ISD::CVT_UU; break;
|
||||
}
|
||||
EVT DestVT = TLI.getValueType(DAG.getDataLayout(), I.getType());
|
||||
const Value *Op1 = I.getArgOperand(0);
|
||||
Res = DAG.getConvertRndSat(DestVT, sdl, getValue(Op1),
|
||||
DAG.getValueType(DestVT),
|
||||
DAG.getValueType(getValue(Op1).getValueType()),
|
||||
getValue(I.getArgOperand(1)),
|
||||
getValue(I.getArgOperand(2)),
|
||||
Code);
|
||||
setValue(&I, Res);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::powi:
|
||||
setValue(&I, ExpandPowI(sdl, getValue(I.getArgOperand(0)),
|
||||
getValue(I.getArgOperand(1)), DAG));
|
||||
|
|
|
@ -262,21 +262,6 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
|
|||
case ISD::FP16_TO_FP: return "fp16_to_fp";
|
||||
case ISD::FP_TO_FP16: return "fp_to_fp16";
|
||||
|
||||
case ISD::CONVERT_RNDSAT: {
|
||||
switch (cast<CvtRndSatSDNode>(this)->getCvtCode()) {
|
||||
default: llvm_unreachable("Unknown cvt code!");
|
||||
case ISD::CVT_FF: return "cvt_ff";
|
||||
case ISD::CVT_FS: return "cvt_fs";
|
||||
case ISD::CVT_FU: return "cvt_fu";
|
||||
case ISD::CVT_SF: return "cvt_sf";
|
||||
case ISD::CVT_UF: return "cvt_uf";
|
||||
case ISD::CVT_SS: return "cvt_ss";
|
||||
case ISD::CVT_SU: return "cvt_su";
|
||||
case ISD::CVT_US: return "cvt_us";
|
||||
case ISD::CVT_UU: return "cvt_uu";
|
||||
}
|
||||
}
|
||||
|
||||
// Control flow instructions
|
||||
case ISD::BR: return "br";
|
||||
case ISD::BRIND: return "brind";
|
||||
|
@ -322,7 +307,7 @@ std::string SDNode::getOperationName(const SelectionDAG *G) const {
|
|||
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";
|
||||
case ISD::ADJUST_TRAMPOLINE: return "adjust_trampoline";
|
||||
|
|
Loading…
Reference in New Issue