mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Revert "[DebugInfo] Add debug locations to constant SD nodes"
This breaks a test: http://bb.pgr.jp/builders/cmake-llvm-x86_64-linux/builds/23870 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235987 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -249,7 +249,7 @@ SelectionDAGLegalize::ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP) {
|
||||
ConstantFP *LLVMC = const_cast<ConstantFP*>(CFP->getConstantFPValue());
|
||||
if (!UseCP) {
|
||||
assert((VT == MVT::f64 || VT == MVT::f32) && "Invalid type expansion");
|
||||
return DAG.getConstant(LLVMC->getValueAPF().bitcastToAPInt(), dl,
|
||||
return DAG.getConstant(LLVMC->getValueAPF().bitcastToAPInt(),
|
||||
(VT == MVT::f64) ? MVT::i64 : MVT::i32);
|
||||
}
|
||||
|
||||
@@ -331,7 +331,7 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
SDValue Store = DAG.getTruncStore(Chain, dl,
|
||||
Val, StackPtr, MachinePointerInfo(),
|
||||
StoredVT, false, false, 0);
|
||||
SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy(AS));
|
||||
SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy(AS));
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
unsigned Offset = 0;
|
||||
|
||||
@@ -385,7 +385,7 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
int IncrementSize = NumBits / 8;
|
||||
|
||||
// Divide the stored value in two parts.
|
||||
SDValue ShiftAmount = DAG.getConstant(NumBits, dl,
|
||||
SDValue ShiftAmount = DAG.getConstant(NumBits,
|
||||
TLI.getShiftAmountTy(Val.getValueType()));
|
||||
SDValue Lo = Val;
|
||||
SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount);
|
||||
@@ -397,7 +397,7 @@ static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG,
|
||||
ST->isVolatile(), ST->isNonTemporal(), Alignment);
|
||||
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl, TLI.getPointerTy(AS)));
|
||||
DAG.getConstant(IncrementSize, TLI.getPointerTy(AS)));
|
||||
Alignment = MinAlign(Alignment, IncrementSize);
|
||||
Store2 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Hi:Lo, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
@@ -448,7 +448,7 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
// Make sure the stack slot is also aligned for the register type.
|
||||
SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT);
|
||||
|
||||
SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy());
|
||||
SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy());
|
||||
SmallVector<SDValue, 8> Stores;
|
||||
SDValue StackPtr = StackBase;
|
||||
unsigned Offset = 0;
|
||||
@@ -528,7 +528,7 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
LD->isNonTemporal(), LD->isInvariant(), Alignment,
|
||||
LD->getAAInfo());
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl, Ptr.getValueType()));
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
@@ -540,7 +540,7 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
LD->isNonTemporal(), LD->isInvariant(), Alignment,
|
||||
LD->getAAInfo());
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl, Ptr.getValueType()));
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
NewLoadedVT, LD->isVolatile(),
|
||||
@@ -549,7 +549,7 @@ ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG,
|
||||
}
|
||||
|
||||
// aggregate the two parts
|
||||
SDValue ShiftAmount = DAG.getConstant(NumBits, dl,
|
||||
SDValue ShiftAmount = DAG.getConstant(NumBits,
|
||||
TLI.getShiftAmountTy(Hi.getValueType()));
|
||||
SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount);
|
||||
Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo);
|
||||
@@ -596,8 +596,7 @@ PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx,
|
||||
Tmp3 = DAG.getNode(CastOpc, dl, PtrVT, Tmp3);
|
||||
// Add the offset to the index.
|
||||
unsigned EltSize = EltVT.getSizeInBits()/8;
|
||||
Tmp3 = DAG.getNode(ISD::MUL, dl, IdxVT, Tmp3,
|
||||
DAG.getConstant(EltSize, dl, IdxVT));
|
||||
Tmp3 = DAG.getNode(ISD::MUL, dl, IdxVT, Tmp3,DAG.getConstant(EltSize, IdxVT));
|
||||
SDValue StackPtr2 = DAG.getNode(ISD::ADD, dl, IdxVT, Tmp3, StackPtr);
|
||||
// Store the scalar value.
|
||||
Ch = DAG.getTruncStore(Ch, dl, Tmp2, StackPtr2, MachinePointerInfo(), EltVT,
|
||||
@@ -656,7 +655,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
TLI.isTypeLegal(MVT::i32)) {
|
||||
SDValue Con = DAG.getConstant(CFP->getValueAPF().
|
||||
bitcastToAPInt().zextOrTrunc(32),
|
||||
SDLoc(CFP), MVT::i32);
|
||||
MVT::i32);
|
||||
return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
}
|
||||
@@ -665,7 +664,7 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
// If this target supports 64-bit registers, do a single 64-bit store.
|
||||
if (TLI.isTypeLegal(MVT::i64)) {
|
||||
SDValue Con = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt().
|
||||
zextOrTrunc(64), SDLoc(CFP), MVT::i64);
|
||||
zextOrTrunc(64), MVT::i64);
|
||||
return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(),
|
||||
isVolatile, isNonTemporal, Alignment, AAInfo);
|
||||
}
|
||||
@@ -674,15 +673,15 @@ SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) {
|
||||
// Otherwise, if the target supports 32-bit registers, use 2 32-bit
|
||||
// stores. If the target supports neither 32- nor 64-bits, this
|
||||
// xform is certainly not worth it.
|
||||
const APInt &IntVal = CFP->getValueAPF().bitcastToAPInt();
|
||||
SDValue Lo = DAG.getConstant(IntVal.trunc(32), dl, MVT::i32);
|
||||
SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), dl, MVT::i32);
|
||||
const APInt &IntVal =CFP->getValueAPF().bitcastToAPInt();
|
||||
SDValue Lo = DAG.getConstant(IntVal.trunc(32), MVT::i32);
|
||||
SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), MVT::i32);
|
||||
if (TLI.isBigEndian()) std::swap(Lo, Hi);
|
||||
|
||||
Lo = DAG.getStore(Chain, dl, Lo, Ptr, ST->getPointerInfo(), isVolatile,
|
||||
isNonTemporal, Alignment, AAInfo);
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(4, dl, Ptr.getValueType()));
|
||||
DAG.getConstant(4, Ptr.getValueType()));
|
||||
Hi = DAG.getStore(Chain, dl, Hi, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(4),
|
||||
isVolatile, isNonTemporal, MinAlign(Alignment, 4U),
|
||||
@@ -793,10 +792,9 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
Ptr.getValueType()));
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Hi = DAG.getNode(ISD::SRL, dl, Value.getValueType(), Value,
|
||||
DAG.getConstant(RoundWidth, dl,
|
||||
DAG.getConstant(RoundWidth,
|
||||
TLI.getShiftAmountTy(Value.getValueType())));
|
||||
Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
@@ -807,7 +805,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
// TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X
|
||||
// Store the top RoundWidth bits.
|
||||
Hi = DAG.getNode(ISD::SRL, dl, Value.getValueType(), Value,
|
||||
DAG.getConstant(ExtraWidth, dl,
|
||||
DAG.getConstant(ExtraWidth,
|
||||
TLI.getShiftAmountTy(Value.getValueType())));
|
||||
Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr, ST->getPointerInfo(),
|
||||
RoundVT, isVolatile, isNonTemporal, Alignment,
|
||||
@@ -816,8 +814,7 @@ void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) {
|
||||
// Store the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
Ptr.getValueType()));
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Lo = DAG.getTruncStore(Chain, dl, Value, Ptr,
|
||||
ST->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal,
|
||||
@@ -1007,8 +1004,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
Ptr.getValueType()));
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
ExtraVT, isVolatile, isNonTemporal, isInvariant,
|
||||
@@ -1021,7 +1017,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
|
||||
// Move the top bits to the right place.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi,
|
||||
DAG.getConstant(RoundWidth, dl,
|
||||
DAG.getConstant(RoundWidth,
|
||||
TLI.getShiftAmountTy(Hi.getValueType())));
|
||||
|
||||
// Join the hi and lo parts.
|
||||
@@ -1037,8 +1033,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
// Load the remaining ExtraWidth bits.
|
||||
IncrementSize = RoundWidth / 8;
|
||||
Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
|
||||
DAG.getConstant(IncrementSize, dl,
|
||||
Ptr.getValueType()));
|
||||
DAG.getConstant(IncrementSize, Ptr.getValueType()));
|
||||
Lo = DAG.getExtLoad(ISD::ZEXTLOAD,
|
||||
dl, Node->getValueType(0), Chain, Ptr,
|
||||
LD->getPointerInfo().getWithOffset(IncrementSize),
|
||||
@@ -1052,7 +1047,7 @@ void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) {
|
||||
|
||||
// Move the top bits to the right place.
|
||||
Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi,
|
||||
DAG.getConstant(ExtraWidth, dl,
|
||||
DAG.getConstant(ExtraWidth,
|
||||
TLI.getShiftAmountTy(Hi.getValueType())));
|
||||
|
||||
// Join the hi and lo parts.
|
||||
@@ -1442,7 +1437,7 @@ SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) {
|
||||
unsigned EltSize =
|
||||
Vec.getValueType().getVectorElementType().getSizeInBits()/8;
|
||||
Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx,
|
||||
DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType()));
|
||||
DAG.getConstant(EltSize, Idx.getValueType()));
|
||||
|
||||
Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy());
|
||||
StackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, StackPtr);
|
||||
@@ -1495,7 +1490,7 @@ SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) {
|
||||
Vec.getValueType().getVectorElementType().getSizeInBits()/8;
|
||||
|
||||
Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx,
|
||||
DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType()));
|
||||
DAG.getConstant(EltSize, Idx.getValueType()));
|
||||
Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy());
|
||||
|
||||
SDValue SubStackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx,
|
||||
@@ -1532,7 +1527,7 @@ SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) {
|
||||
|
||||
unsigned Offset = TypeByteSize*i;
|
||||
|
||||
SDValue Idx = DAG.getConstant(Offset, dl, FIPtr.getValueType());
|
||||
SDValue Idx = DAG.getConstant(Offset, FIPtr.getValueType());
|
||||
Idx = DAG.getNode(ISD::ADD, dl, FIPtr.getValueType(), FIPtr, Idx);
|
||||
|
||||
// If the destination vector element type is narrower than the source
|
||||
@@ -1594,8 +1589,7 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
||||
unsigned Strides = (FloatVT.getSizeInBits()-1)/LoadTy.getSizeInBits();
|
||||
unsigned ByteOffset = (Strides * LoadTy.getSizeInBits()) / 8;
|
||||
LoadPtr = DAG.getNode(ISD::ADD, dl, LoadPtr.getValueType(), LoadPtr,
|
||||
DAG.getConstant(ByteOffset, dl,
|
||||
LoadPtr.getValueType()));
|
||||
DAG.getConstant(ByteOffset, LoadPtr.getValueType()));
|
||||
// Load a legal integer containing the sign bit.
|
||||
SignBit = DAG.getLoad(LoadTy, dl, Ch, LoadPtr, MachinePointerInfo(),
|
||||
false, false, false, 0);
|
||||
@@ -1605,14 +1599,13 @@ SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) {
|
||||
assert(BitShift < LoadTy.getSizeInBits() && "Pointer advanced wrong?");
|
||||
if (BitShift)
|
||||
SignBit = DAG.getNode(ISD::SHL, dl, LoadTy, SignBit,
|
||||
DAG.getConstant(BitShift, dl,
|
||||
DAG.getConstant(BitShift,
|
||||
TLI.getShiftAmountTy(SignBit.getValueType())));
|
||||
}
|
||||
}
|
||||
// Now get the sign bit proper, by seeing whether the value is negative.
|
||||
SignBit = DAG.getSetCC(dl, getSetCCResultType(SignBit.getValueType()),
|
||||
SignBit,
|
||||
DAG.getConstant(0, dl, SignBit.getValueType()),
|
||||
SignBit, DAG.getConstant(0, SignBit.getValueType()),
|
||||
ISD::SETLT);
|
||||
// Get the absolute value of the result.
|
||||
SDValue AbsVal = DAG.getNode(ISD::FABS, dl, Tmp1.getValueType(), Tmp1);
|
||||
@@ -1637,7 +1630,8 @@ void SelectionDAGLegalize::ExpandDYNAMIC_STACKALLOC(SDNode* Node,
|
||||
|
||||
// Chain the dynamic stack allocation so that it doesn't modify the stack
|
||||
// pointer when other instructions are using the stack.
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, dl, true), dl);
|
||||
Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, true),
|
||||
SDLoc(Node));
|
||||
|
||||
SDValue Size = Tmp2.getOperand(1);
|
||||
SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT);
|
||||
@@ -1648,11 +1642,12 @@ void SelectionDAGLegalize::ExpandDYNAMIC_STACKALLOC(SDNode* Node,
|
||||
Tmp1 = DAG.getNode(ISD::SUB, dl, VT, SP, Size); // Value
|
||||
if (Align > StackAlign)
|
||||
Tmp1 = DAG.getNode(ISD::AND, dl, VT, Tmp1,
|
||||
DAG.getConstant(-(uint64_t)Align, dl, VT));
|
||||
DAG.getConstant(-(uint64_t)Align, VT));
|
||||
Chain = DAG.getCopyToReg(Chain, dl, SPReg, Tmp1); // Output chain
|
||||
|
||||
Tmp2 = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, dl, true),
|
||||
DAG.getIntPtrConstant(0, dl, true), SDValue(), dl);
|
||||
Tmp2 = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, true),
|
||||
DAG.getIntPtrConstant(0, true), SDValue(),
|
||||
SDLoc(Node));
|
||||
|
||||
Results.push_back(Tmp1);
|
||||
Results.push_back(Tmp2);
|
||||
@@ -2423,8 +2418,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
SDValue StackSlot = DAG.CreateStackTemporary(MVT::f64);
|
||||
|
||||
// word offset constant for Hi/Lo address computation
|
||||
SDValue WordOff = DAG.getConstant(sizeof(int), dl,
|
||||
StackSlot.getValueType());
|
||||
SDValue WordOff = DAG.getConstant(sizeof(int), StackSlot.getValueType());
|
||||
// set up Hi and Lo (into buffer) address based on endian
|
||||
SDValue Hi = StackSlot;
|
||||
SDValue Lo = DAG.getNode(ISD::ADD, dl, StackSlot.getValueType(),
|
||||
@@ -2436,7 +2430,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
SDValue Op0Mapped;
|
||||
if (isSigned) {
|
||||
// constant used to invert sign bit (signed to unsigned mapping)
|
||||
SDValue SignBit = DAG.getConstant(0x80000000u, dl, MVT::i32);
|
||||
SDValue SignBit = DAG.getConstant(0x80000000u, MVT::i32);
|
||||
Op0Mapped = DAG.getNode(ISD::XOR, dl, MVT::i32, Op0, SignBit);
|
||||
} else {
|
||||
Op0Mapped = Op0;
|
||||
@@ -2446,7 +2440,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
Op0Mapped, Lo, MachinePointerInfo(),
|
||||
false, false, 0);
|
||||
// initial hi portion of constructed double
|
||||
SDValue InitialHi = DAG.getConstant(0x43300000u, dl, MVT::i32);
|
||||
SDValue InitialHi = DAG.getConstant(0x43300000u, MVT::i32);
|
||||
// store the hi of the constructed double - biased exponent
|
||||
SDValue Store2 = DAG.getStore(Store1, dl, InitialHi, Hi,
|
||||
MachinePointerInfo(),
|
||||
@@ -2458,7 +2452,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
SDValue Bias = DAG.getConstantFP(isSigned ?
|
||||
BitsToDouble(0x4330000080000000ULL) :
|
||||
BitsToDouble(0x4330000000000000ULL),
|
||||
dl, MVT::f64);
|
||||
MVT::f64);
|
||||
// subtract the bias
|
||||
SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Load, Bias);
|
||||
// final result
|
||||
@@ -2469,7 +2463,7 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
Result = Sub;
|
||||
} else if (DestVT.bitsLT(MVT::f64)) {
|
||||
Result = DAG.getNode(ISD::FP_ROUND, dl, DestVT, Sub,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
DAG.getIntPtrConstant(0));
|
||||
} else if (DestVT.bitsGT(MVT::f64)) {
|
||||
Result = DAG.getNode(ISD::FP_EXTEND, dl, DestVT, Sub);
|
||||
}
|
||||
@@ -2485,16 +2479,15 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
// TODO: Generalize this for use with other types.
|
||||
if (Op0.getValueType() == MVT::i64 && DestVT == MVT::f64) {
|
||||
SDValue TwoP52 =
|
||||
DAG.getConstant(UINT64_C(0x4330000000000000), dl, MVT::i64);
|
||||
DAG.getConstant(UINT64_C(0x4330000000000000), MVT::i64);
|
||||
SDValue TwoP84PlusTwoP52 =
|
||||
DAG.getConstantFP(BitsToDouble(UINT64_C(0x4530000000100000)), dl,
|
||||
MVT::f64);
|
||||
DAG.getConstantFP(BitsToDouble(UINT64_C(0x4530000000100000)), MVT::f64);
|
||||
SDValue TwoP84 =
|
||||
DAG.getConstant(UINT64_C(0x4530000000000000), dl, MVT::i64);
|
||||
DAG.getConstant(UINT64_C(0x4530000000000000), MVT::i64);
|
||||
|
||||
SDValue Lo = DAG.getZeroExtendInReg(Op0, dl, MVT::i32);
|
||||
SDValue Hi = DAG.getNode(ISD::SRL, dl, MVT::i64, Op0,
|
||||
DAG.getConstant(32, dl, MVT::i64));
|
||||
DAG.getConstant(32, MVT::i64));
|
||||
SDValue LoOr = DAG.getNode(ISD::OR, dl, MVT::i64, Lo, TwoP52);
|
||||
SDValue HiOr = DAG.getNode(ISD::OR, dl, MVT::i64, Hi, TwoP84);
|
||||
SDValue LoFlt = DAG.getNode(ISD::BITCAST, dl, MVT::f64, LoOr);
|
||||
@@ -2513,9 +2506,9 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
SDValue Fast = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, Op0);
|
||||
|
||||
SDValue ShiftConst =
|
||||
DAG.getConstant(1, dl, TLI.getShiftAmountTy(Op0.getValueType()));
|
||||
DAG.getConstant(1, TLI.getShiftAmountTy(Op0.getValueType()));
|
||||
SDValue Shr = DAG.getNode(ISD::SRL, dl, MVT::i64, Op0, ShiftConst);
|
||||
SDValue AndConst = DAG.getConstant(1, dl, MVT::i64);
|
||||
SDValue AndConst = DAG.getConstant(1, MVT::i64);
|
||||
SDValue And = DAG.getNode(ISD::AND, dl, MVT::i64, Op0, AndConst);
|
||||
SDValue Or = DAG.getNode(ISD::OR, dl, MVT::i64, And, Shr);
|
||||
|
||||
@@ -2527,52 +2520,47 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned,
|
||||
// thing most of the time. This would be a good candidate for a
|
||||
//pseudo-op, or, even better, for whole-function isel.
|
||||
SDValue SignBitTest = DAG.getSetCC(dl, getSetCCResultType(MVT::i64),
|
||||
Op0, DAG.getConstant(0, dl, MVT::i64), ISD::SETLT);
|
||||
Op0, DAG.getConstant(0, MVT::i64), ISD::SETLT);
|
||||
return DAG.getSelect(dl, MVT::f32, SignBitTest, Slow, Fast);
|
||||
}
|
||||
|
||||
// Otherwise, implement the fully general conversion.
|
||||
|
||||
SDValue And = DAG.getNode(ISD::AND, dl, MVT::i64, Op0,
|
||||
DAG.getConstant(UINT64_C(0xfffffffffffff800), dl, MVT::i64));
|
||||
DAG.getConstant(UINT64_C(0xfffffffffffff800), MVT::i64));
|
||||
SDValue Or = DAG.getNode(ISD::OR, dl, MVT::i64, And,
|
||||
DAG.getConstant(UINT64_C(0x800), dl, MVT::i64));
|
||||
DAG.getConstant(UINT64_C(0x800), MVT::i64));
|
||||
SDValue And2 = DAG.getNode(ISD::AND, dl, MVT::i64, Op0,
|
||||
DAG.getConstant(UINT64_C(0x7ff), dl, MVT::i64));
|
||||
SDValue Ne = DAG.getSetCC(dl, getSetCCResultType(MVT::i64), And2,
|
||||
DAG.getConstant(UINT64_C(0), dl, MVT::i64),
|
||||
ISD::SETNE);
|
||||
DAG.getConstant(UINT64_C(0x7ff), MVT::i64));
|
||||
SDValue Ne = DAG.getSetCC(dl, getSetCCResultType(MVT::i64),
|
||||
And2, DAG.getConstant(UINT64_C(0), MVT::i64), ISD::SETNE);
|
||||
SDValue Sel = DAG.getSelect(dl, MVT::i64, Ne, Or, Op0);
|
||||
SDValue Ge = DAG.getSetCC(dl, getSetCCResultType(MVT::i64), Op0,
|
||||
DAG.getConstant(UINT64_C(0x0020000000000000), dl,
|
||||
MVT::i64),
|
||||
ISD::SETUGE);
|
||||
SDValue Ge = DAG.getSetCC(dl, getSetCCResultType(MVT::i64),
|
||||
Op0, DAG.getConstant(UINT64_C(0x0020000000000000), MVT::i64),
|
||||
ISD::SETUGE);
|
||||
SDValue Sel2 = DAG.getSelect(dl, MVT::i64, Ge, Sel, Op0);
|
||||
EVT SHVT = TLI.getShiftAmountTy(Sel2.getValueType());
|
||||
|
||||
SDValue Sh = DAG.getNode(ISD::SRL, dl, MVT::i64, Sel2,
|
||||
DAG.getConstant(32, dl, SHVT));
|
||||
DAG.getConstant(32, SHVT));
|
||||
SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Sh);
|
||||
SDValue Fcvt = DAG.getNode(ISD::UINT_TO_FP, dl, MVT::f64, Trunc);
|
||||
SDValue TwoP32 =
|
||||
DAG.getConstantFP(BitsToDouble(UINT64_C(0x41f0000000000000)), dl,
|
||||
MVT::f64);
|
||||
DAG.getConstantFP(BitsToDouble(UINT64_C(0x41f0000000000000)), MVT::f64);
|
||||
SDValue Fmul = DAG.getNode(ISD::FMUL, dl, MVT::f64, TwoP32, Fcvt);
|
||||
SDValue Lo = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Sel2);
|
||||
SDValue Fcvt2 = DAG.getNode(ISD::UINT_TO_FP, dl, MVT::f64, Lo);
|
||||
SDValue Fadd = DAG.getNode(ISD::FADD, dl, MVT::f64, Fmul, Fcvt2);
|
||||
return DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Fadd,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
DAG.getIntPtrConstant(0));
|
||||
}
|
||||
|
||||
SDValue Tmp1 = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Op0);
|
||||
|
||||
SDValue SignSet = DAG.getSetCC(dl, getSetCCResultType(Op0.getValueType()),
|
||||
Op0,
|
||||
DAG.getConstant(0, dl, Op0.getValueType()),
|
||||
Op0, DAG.getConstant(0, Op0.getValueType()),
|
||||
ISD::SETLT);
|
||||
SDValue Zero = DAG.getIntPtrConstant(0, dl),
|
||||
Four = DAG.getIntPtrConstant(4, dl);
|
||||
SDValue Zero = DAG.getIntPtrConstant(0), Four = DAG.getIntPtrConstant(4);
|
||||
SDValue CstOffset = DAG.getSelect(dl, Zero.getValueType(),
|
||||
SignSet, Four, Zero);
|
||||
|
||||
@@ -2707,41 +2695,34 @@ SDValue SelectionDAGLegalize::ExpandBSWAP(SDValue Op, SDLoc dl) {
|
||||
switch (VT.getSimpleVT().SimpleTy) {
|
||||
default: llvm_unreachable("Unhandled Expand type in BSWAP!");
|
||||
case MVT::i16:
|
||||
Tmp2 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
|
||||
Tmp2 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, SHVT));
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, SHVT));
|
||||
return DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2);
|
||||
case MVT::i32:
|
||||
Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
|
||||
Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
|
||||
Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
|
||||
Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3,
|
||||
DAG.getConstant(0xFF0000, dl, VT));
|
||||
Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, dl, VT));
|
||||
Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, SHVT));
|
||||
Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, SHVT));
|
||||
Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, SHVT));
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, SHVT));
|
||||
Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3, DAG.getConstant(0xFF0000, VT));
|
||||
Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, VT));
|
||||
Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
|
||||
Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1);
|
||||
return DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2);
|
||||
case MVT::i64:
|
||||
Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
|
||||
Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(40, dl, SHVT));
|
||||
Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
|
||||
Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
|
||||
Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT));
|
||||
Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT));
|
||||
Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT));
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT));
|
||||
Tmp7 = DAG.getNode(ISD::AND, dl, VT, Tmp7,
|
||||
DAG.getConstant(255ULL<<48, dl, VT));
|
||||
Tmp6 = DAG.getNode(ISD::AND, dl, VT, Tmp6,
|
||||
DAG.getConstant(255ULL<<40, dl, VT));
|
||||
Tmp5 = DAG.getNode(ISD::AND, dl, VT, Tmp5,
|
||||
DAG.getConstant(255ULL<<32, dl, VT));
|
||||
Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4,
|
||||
DAG.getConstant(255ULL<<24, dl, VT));
|
||||
Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3,
|
||||
DAG.getConstant(255ULL<<16, dl, VT));
|
||||
Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2,
|
||||
DAG.getConstant(255ULL<<8 , dl, VT));
|
||||
Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, SHVT));
|
||||
Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(40, SHVT));
|
||||
Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, SHVT));
|
||||
Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, SHVT));
|
||||
Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, SHVT));
|
||||
Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, SHVT));
|
||||
Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, SHVT));
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, SHVT));
|
||||
Tmp7 = DAG.getNode(ISD::AND, dl, VT, Tmp7, DAG.getConstant(255ULL<<48, VT));
|
||||
Tmp6 = DAG.getNode(ISD::AND, dl, VT, Tmp6, DAG.getConstant(255ULL<<40, VT));
|
||||
Tmp5 = DAG.getNode(ISD::AND, dl, VT, Tmp5, DAG.getConstant(255ULL<<32, VT));
|
||||
Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4, DAG.getConstant(255ULL<<24, VT));
|
||||
Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3, DAG.getConstant(255ULL<<16, VT));
|
||||
Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(255ULL<<8 , VT));
|
||||
Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp7);
|
||||
Tmp6 = DAG.getNode(ISD::OR, dl, VT, Tmp6, Tmp5);
|
||||
Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3);
|
||||
@@ -2768,38 +2749,34 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,
|
||||
// This is the "best" algorithm from
|
||||
// http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
|
||||
|
||||
SDValue Mask55 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)),
|
||||
dl, VT);
|
||||
SDValue Mask33 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)),
|
||||
dl, VT);
|
||||
SDValue Mask0F = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)),
|
||||
dl, VT);
|
||||
SDValue Mask01 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)),
|
||||
dl, VT);
|
||||
SDValue Mask55 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), VT);
|
||||
SDValue Mask33 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), VT);
|
||||
SDValue Mask0F = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), VT);
|
||||
SDValue Mask01 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), VT);
|
||||
|
||||
// v = v - ((v >> 1) & 0x55555555...)
|
||||
Op = DAG.getNode(ISD::SUB, dl, VT, Op,
|
||||
DAG.getNode(ISD::AND, dl, VT,
|
||||
DAG.getNode(ISD::SRL, dl, VT, Op,
|
||||
DAG.getConstant(1, dl, ShVT)),
|
||||
DAG.getConstant(1, ShVT)),
|
||||
Mask55));
|
||||
// v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...)
|
||||
Op = DAG.getNode(ISD::ADD, dl, VT,
|
||||
DAG.getNode(ISD::AND, dl, VT, Op, Mask33),
|
||||
DAG.getNode(ISD::AND, dl, VT,
|
||||
DAG.getNode(ISD::SRL, dl, VT, Op,
|
||||
DAG.getConstant(2, dl, ShVT)),
|
||||
DAG.getConstant(2, ShVT)),
|
||||
Mask33));
|
||||
// v = (v + (v >> 4)) & 0x0F0F0F0F...
|
||||
Op = DAG.getNode(ISD::AND, dl, VT,
|
||||
DAG.getNode(ISD::ADD, dl, VT, Op,
|
||||
DAG.getNode(ISD::SRL, dl, VT, Op,
|
||||
DAG.getConstant(4, dl, ShVT))),
|
||||
DAG.getConstant(4, ShVT))),
|
||||
Mask0F);
|
||||
// v = (v * 0x01010101...) >> (Len - 8)
|
||||
Op = DAG.getNode(ISD::SRL, dl, VT,
|
||||
DAG.getNode(ISD::MUL, dl, VT, Op, Mask01),
|
||||
DAG.getConstant(Len - 8, dl, ShVT));
|
||||
DAG.getConstant(Len - 8, ShVT));
|
||||
|
||||
return Op;
|
||||
}
|
||||
@@ -2820,7 +2797,7 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,
|
||||
EVT ShVT = TLI.getShiftAmountTy(VT);
|
||||
unsigned len = VT.getSizeInBits();
|
||||
for (unsigned i = 0; (1U << i) <= (len / 2); ++i) {
|
||||
SDValue Tmp3 = DAG.getConstant(1ULL << i, dl, ShVT);
|
||||
SDValue Tmp3 = DAG.getConstant(1ULL << i, ShVT);
|
||||
Op = DAG.getNode(ISD::OR, dl, VT, Op,
|
||||
DAG.getNode(ISD::SRL, dl, VT, Op, Tmp3));
|
||||
}
|
||||
@@ -2839,12 +2816,12 @@ SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op,
|
||||
SDValue Tmp3 = DAG.getNode(ISD::AND, dl, VT,
|
||||
DAG.getNOT(dl, Op, VT),
|
||||
DAG.getNode(ISD::SUB, dl, VT, Op,
|
||||
DAG.getConstant(1, dl, VT)));
|
||||
DAG.getConstant(1, VT)));
|
||||
// If ISD::CTLZ is legal and CTPOP isn't, then do that instead.
|
||||
if (!TLI.isOperationLegalOrCustom(ISD::CTPOP, VT) &&
|
||||
TLI.isOperationLegalOrCustom(ISD::CTLZ, VT))
|
||||
return DAG.getNode(ISD::SUB, dl, VT,
|
||||
DAG.getConstant(VT.getSizeInBits(), dl, VT),
|
||||
DAG.getConstant(VT.getSizeInBits(), VT),
|
||||
DAG.getNode(ISD::CTLZ, dl, VT, Tmp3));
|
||||
return DAG.getNode(ISD::CTPOP, dl, VT, Tmp3);
|
||||
}
|
||||
@@ -2880,10 +2857,10 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
case ISD::FRAMEADDR:
|
||||
case ISD::RETURNADDR:
|
||||
case ISD::FRAME_TO_ARGS_OFFSET:
|
||||
Results.push_back(DAG.getConstant(0, dl, Node->getValueType(0)));
|
||||
Results.push_back(DAG.getConstant(0, Node->getValueType(0)));
|
||||
break;
|
||||
case ISD::FLT_ROUNDS_:
|
||||
Results.push_back(DAG.getConstant(1, dl, Node->getValueType(0)));
|
||||
Results.push_back(DAG.getConstant(1, Node->getValueType(0)));
|
||||
break;
|
||||
case ISD::EH_RETURN:
|
||||
case ISD::EH_LABEL:
|
||||
@@ -2897,7 +2874,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
case ISD::EH_SJLJ_SETJMP:
|
||||
// If the target didn't expand this, just return 'zero' and preserve the
|
||||
// chain.
|
||||
Results.push_back(DAG.getConstant(0, dl, MVT::i32));
|
||||
Results.push_back(DAG.getConstant(0, MVT::i32));
|
||||
Results.push_back(Node->getOperand(0));
|
||||
break;
|
||||
case ISD::ATOMIC_FENCE: {
|
||||
@@ -2918,7 +2895,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
}
|
||||
case ISD::ATOMIC_LOAD: {
|
||||
// There is no libcall for atomic load; fake it with ATOMIC_CMP_SWAP.
|
||||
SDValue Zero = DAG.getConstant(0, dl, Node->getValueType(0));
|
||||
SDValue Zero = DAG.getConstant(0, Node->getValueType(0));
|
||||
SDVTList VTs = DAG.getVTList(Node->getValueType(0), MVT::Other);
|
||||
SDValue Swap = DAG.getAtomicCmpSwap(
|
||||
ISD::ATOMIC_CMP_SWAP, dl, cast<AtomicSDNode>(Node)->getMemoryVT(), VTs,
|
||||
@@ -2994,10 +2971,10 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
case ISD::UNDEF: {
|
||||
EVT VT = Node->getValueType(0);
|
||||
if (VT.isInteger())
|
||||
Results.push_back(DAG.getConstant(0, dl, VT));
|
||||
Results.push_back(DAG.getConstant(0, VT));
|
||||
else {
|
||||
assert(VT.isFloatingPoint() && "Unknown value type!");
|
||||
Results.push_back(DAG.getConstantFP(0, dl, VT));
|
||||
Results.push_back(DAG.getConstantFP(0, VT));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3036,7 +3013,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
ShiftAmountTy = VT;
|
||||
unsigned BitsDiff = VT.getScalarType().getSizeInBits() -
|
||||
ExtraVT.getScalarType().getSizeInBits();
|
||||
SDValue ShiftCst = DAG.getConstant(BitsDiff, dl, ShiftAmountTy);
|
||||
SDValue ShiftCst = DAG.getConstant(BitsDiff, ShiftAmountTy);
|
||||
Tmp1 = DAG.getNode(ISD::SHL, dl, Node->getValueType(0),
|
||||
Node->getOperand(0), ShiftCst);
|
||||
Tmp1 = DAG.getNode(ISD::SRA, dl, Node->getValueType(0), Tmp1, ShiftCst);
|
||||
@@ -3074,7 +3051,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
APInt::getNullValue(VT.getSizeInBits()));
|
||||
APInt x = APInt::getSignBit(NVT.getSizeInBits());
|
||||
(void)apf.convertFromAPInt(x, false, APFloat::rmNearestTiesToEven);
|
||||
Tmp1 = DAG.getConstantFP(apf, dl, VT);
|
||||
Tmp1 = DAG.getConstantFP(apf, VT);
|
||||
Tmp2 = DAG.getSetCC(dl, getSetCCResultType(VT),
|
||||
Node->getOperand(0),
|
||||
Tmp1, ISD::SETLT);
|
||||
@@ -3083,7 +3060,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
DAG.getNode(ISD::FSUB, dl, VT,
|
||||
Node->getOperand(0), Tmp1));
|
||||
False = DAG.getNode(ISD::XOR, dl, NVT, False,
|
||||
DAG.getConstant(x, dl, NVT));
|
||||
DAG.getConstant(x, NVT));
|
||||
Tmp1 = DAG.getSelect(dl, NVT, Tmp2, True, False);
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
@@ -3104,11 +3081,11 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
assert(((Align & (Align-1)) == 0) && "Expected Align to be a power of 2");
|
||||
|
||||
VAList = DAG.getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
|
||||
DAG.getConstant(Align - 1, dl,
|
||||
DAG.getConstant(Align - 1,
|
||||
VAList.getValueType()));
|
||||
|
||||
VAList = DAG.getNode(ISD::AND, dl, VAList.getValueType(), VAList,
|
||||
DAG.getConstant(-(int64_t)Align, dl,
|
||||
DAG.getConstant(-(int64_t)Align,
|
||||
VAList.getValueType()));
|
||||
}
|
||||
|
||||
@@ -3116,7 +3093,6 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp3 = DAG.getNode(ISD::ADD, dl, VAList.getValueType(), VAList,
|
||||
DAG.getConstant(TLI.getDataLayout()->
|
||||
getTypeAllocSize(VT.getTypeForEVT(*DAG.getContext())),
|
||||
dl,
|
||||
VAList.getValueType()));
|
||||
// Store the incremented VAList to the legalized pointer
|
||||
Tmp3 = DAG.getStore(VAListLoad.getValue(1), dl, Tmp3, Tmp2,
|
||||
@@ -3231,11 +3207,11 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
if (Idx < NumElems)
|
||||
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT,
|
||||
Op0,
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())));
|
||||
DAG.getConstant(Idx, TLI.getVectorIdxTy())));
|
||||
else
|
||||
Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT,
|
||||
Op1,
|
||||
DAG.getConstant(Idx - NumElems, dl,
|
||||
DAG.getConstant(Idx - NumElems,
|
||||
TLI.getVectorIdxTy())));
|
||||
}
|
||||
|
||||
@@ -3250,7 +3226,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
if (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) {
|
||||
// 1 -> Hi
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, OpTy, Node->getOperand(0),
|
||||
DAG.getConstant(OpTy.getSizeInBits()/2, dl,
|
||||
DAG.getConstant(OpTy.getSizeInBits()/2,
|
||||
TLI.getShiftAmountTy(Node->getOperand(0).getValueType())));
|
||||
Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Tmp1);
|
||||
} else {
|
||||
@@ -3288,7 +3264,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
break;
|
||||
case ISD::FNEG:
|
||||
// Expand Y = FNEG(X) -> Y = SUB -0.0, X
|
||||
Tmp1 = DAG.getConstantFP(-0.0, dl, Node->getValueType(0));
|
||||
Tmp1 = DAG.getConstantFP(-0.0, Node->getValueType(0));
|
||||
Tmp1 = DAG.getNode(ISD::FSUB, dl, Node->getValueType(0), Tmp1,
|
||||
Node->getOperand(0));
|
||||
Results.push_back(Tmp1);
|
||||
@@ -3297,7 +3273,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// Expand Y = FABS(X) -> Y = (X >u 0.0) ? X : fneg(X).
|
||||
EVT VT = Node->getValueType(0);
|
||||
Tmp1 = Node->getOperand(0);
|
||||
Tmp2 = DAG.getConstantFP(0.0, dl, VT);
|
||||
Tmp2 = DAG.getConstantFP(0.0, VT);
|
||||
Tmp2 = DAG.getSetCC(dl, getSetCCResultType(Tmp1.getValueType()),
|
||||
Tmp1, Tmp2, ISD::SETUGT);
|
||||
Tmp3 = DAG.getNode(ISD::FNEG, dl, VT, Tmp1);
|
||||
@@ -3470,7 +3446,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// Under fastmath, we can expand this node into a fround followed by
|
||||
// a float-half conversion.
|
||||
SDValue FloatVal = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Op,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
DAG.getIntPtrConstant(0));
|
||||
Results.push_back(
|
||||
DAG.getNode(ISD::FP_TO_FP16, dl, MVT::i16, FloatVal));
|
||||
break;
|
||||
@@ -3511,9 +3487,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
TLI.isOperationLegalOrCustom(ISD::XOR, VT) &&
|
||||
"Don't know how to expand this subtraction!");
|
||||
Tmp1 = DAG.getNode(ISD::XOR, dl, VT, Node->getOperand(1),
|
||||
DAG.getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), dl,
|
||||
VT));
|
||||
Tmp1 = DAG.getNode(ISD::ADD, dl, VT, Tmp1, DAG.getConstant(1, dl, VT));
|
||||
DAG.getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), VT));
|
||||
Tmp1 = DAG.getNode(ISD::ADD, dl, VT, Tmp1, DAG.getConstant(1, VT));
|
||||
Results.push_back(DAG.getNode(ISD::ADD, dl, VT, Node->getOperand(0), Tmp1));
|
||||
break;
|
||||
}
|
||||
@@ -3629,7 +3604,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
TLI.expandMUL(Node, Lo, Hi, HalfType, DAG)) {
|
||||
Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Lo);
|
||||
Hi = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Hi);
|
||||
SDValue Shift = DAG.getConstant(HalfType.getSizeInBits(), dl,
|
||||
SDValue Shift = DAG.getConstant(HalfType.getSizeInBits(),
|
||||
TLI.getShiftAmountTy(HalfType));
|
||||
Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift);
|
||||
Results.push_back(DAG.getNode(ISD::OR, dl, VT, Lo, Hi));
|
||||
@@ -3654,7 +3629,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
EVT ResultType = Node->getValueType(1);
|
||||
EVT OType = getSetCCResultType(Node->getValueType(0));
|
||||
|
||||
SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType());
|
||||
SDValue Zero = DAG.getConstant(0, LHS.getValueType());
|
||||
|
||||
// LHSSign -> LHS >= 0
|
||||
// RHSSign -> RHS >= 0
|
||||
@@ -3720,9 +3695,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
RHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, RHS);
|
||||
Tmp1 = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS);
|
||||
BottomHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Tmp1,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
DAG.getIntPtrConstant(0));
|
||||
TopHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Tmp1,
|
||||
DAG.getIntPtrConstant(1, dl));
|
||||
DAG.getIntPtrConstant(1));
|
||||
} else {
|
||||
// We can fall back to a libcall with an illegal type for the MUL if we
|
||||
// have a libcall big enough.
|
||||
@@ -3743,11 +3718,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// part.
|
||||
unsigned LoSize = VT.getSizeInBits();
|
||||
SDValue HiLHS = DAG.getNode(ISD::SRA, dl, VT, RHS,
|
||||
DAG.getConstant(LoSize - 1, dl,
|
||||
TLI.getPointerTy()));
|
||||
DAG.getConstant(LoSize-1, TLI.getPointerTy()));
|
||||
SDValue HiRHS = DAG.getNode(ISD::SRA, dl, VT, LHS,
|
||||
DAG.getConstant(LoSize - 1, dl,
|
||||
TLI.getPointerTy()));
|
||||
DAG.getConstant(LoSize-1, TLI.getPointerTy()));
|
||||
|
||||
// Here we're passing the 2 arguments explicitly as 4 arguments that are
|
||||
// pre-lowered to the correct types. This all depends upon WideVT not
|
||||
@@ -3756,9 +3729,9 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
SDValue Args[] = { LHS, HiLHS, RHS, HiRHS };
|
||||
SDValue Ret = ExpandLibCall(LC, WideVT, Args, 4, isSigned, dl);
|
||||
BottomHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Ret,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
DAG.getIntPtrConstant(0));
|
||||
TopHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Ret,
|
||||
DAG.getIntPtrConstant(1, dl));
|
||||
DAG.getIntPtrConstant(1));
|
||||
// Ret is a node with an illegal type. Because such things are not
|
||||
// generally permitted during this phase of legalization, make sure the
|
||||
// node has no more uses. The above EXTRACT_ELEMENT nodes should have been
|
||||
@@ -3768,14 +3741,14 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
}
|
||||
|
||||
if (isSigned) {
|
||||
Tmp1 = DAG.getConstant(VT.getSizeInBits() - 1, dl,
|
||||
Tmp1 = DAG.getConstant(VT.getSizeInBits() - 1,
|
||||
TLI.getShiftAmountTy(BottomHalf.getValueType()));
|
||||
Tmp1 = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, Tmp1);
|
||||
TopHalf = DAG.getSetCC(dl, getSetCCResultType(VT), TopHalf, Tmp1,
|
||||
ISD::SETNE);
|
||||
} else {
|
||||
TopHalf = DAG.getSetCC(dl, getSetCCResultType(VT), TopHalf,
|
||||
DAG.getConstant(0, dl, VT), ISD::SETNE);
|
||||
DAG.getConstant(0, VT), ISD::SETNE);
|
||||
}
|
||||
Results.push_back(BottomHalf);
|
||||
Results.push_back(TopHalf);
|
||||
@@ -3786,7 +3759,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, PairTy, Node->getOperand(0));
|
||||
Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, PairTy, Node->getOperand(1));
|
||||
Tmp2 = DAG.getNode(ISD::SHL, dl, PairTy, Tmp2,
|
||||
DAG.getConstant(PairTy.getSizeInBits()/2, dl,
|
||||
DAG.getConstant(PairTy.getSizeInBits()/2,
|
||||
TLI.getShiftAmountTy(PairTy)));
|
||||
Results.push_back(DAG.getNode(ISD::OR, dl, PairTy, Tmp1, Tmp2));
|
||||
break;
|
||||
@@ -3801,7 +3774,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
cast<CondCodeSDNode>(Tmp1.getOperand(2))->get());
|
||||
} else {
|
||||
Tmp1 = DAG.getSelectCC(dl, Tmp1,
|
||||
DAG.getConstant(0, dl, Tmp1.getValueType()),
|
||||
DAG.getConstant(0, Tmp1.getValueType()),
|
||||
Tmp2, Tmp3, ISD::SETNE);
|
||||
}
|
||||
Results.push_back(Tmp1);
|
||||
@@ -3817,8 +3790,8 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
unsigned EntrySize =
|
||||
DAG.getMachineFunction().getJumpTableInfo()->getEntrySize(TD);
|
||||
|
||||
Index = DAG.getNode(ISD::MUL, dl, Index.getValueType(), Index,
|
||||
DAG.getConstant(EntrySize, dl, Index.getValueType()));
|
||||
Index = DAG.getNode(ISD::MUL, dl, Index.getValueType(),
|
||||
Index, DAG.getConstant(EntrySize, Index.getValueType()));
|
||||
SDValue Addr = DAG.getNode(ISD::ADD, dl, Index.getValueType(),
|
||||
Index, Table);
|
||||
|
||||
@@ -3852,10 +3825,10 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
// We test only the i1 bit. Skip the AND if UNDEF.
|
||||
Tmp3 = (Tmp2.getOpcode() == ISD::UNDEF) ? Tmp2 :
|
||||
DAG.getNode(ISD::AND, dl, Tmp2.getValueType(), Tmp2,
|
||||
DAG.getConstant(1, dl, Tmp2.getValueType()));
|
||||
DAG.getConstant(1, Tmp2.getValueType()));
|
||||
Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1,
|
||||
DAG.getCondCode(ISD::SETNE), Tmp3,
|
||||
DAG.getConstant(0, dl, Tmp3.getValueType()),
|
||||
DAG.getConstant(0, Tmp3.getValueType()),
|
||||
Node->getOperand(2));
|
||||
}
|
||||
Results.push_back(Tmp1);
|
||||
@@ -3897,8 +3870,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
break;
|
||||
}
|
||||
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2,
|
||||
DAG.getConstant(TrueValue, dl, VT),
|
||||
DAG.getConstant(0, dl, VT),
|
||||
DAG.getConstant(TrueValue, VT), DAG.getConstant(0, VT),
|
||||
Tmp3);
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
@@ -3966,7 +3938,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0),
|
||||
Tmp1, Tmp2, Tmp3, Tmp4, CC);
|
||||
} else {
|
||||
Tmp2 = DAG.getConstant(0, dl, Tmp1.getValueType());
|
||||
Tmp2 = DAG.getConstant(0, Tmp1.getValueType());
|
||||
CC = DAG.getCondCode(ISD::SETNE);
|
||||
Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1,
|
||||
Tmp2, Tmp3, Tmp4, CC);
|
||||
@@ -3997,7 +3969,7 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1,
|
||||
Tmp4, Tmp2, Tmp3, Node->getOperand(4));
|
||||
} else {
|
||||
Tmp3 = DAG.getConstant(0, dl, Tmp2.getValueType());
|
||||
Tmp3 = DAG.getConstant(0, Tmp2.getValueType());
|
||||
Tmp4 = DAG.getCondCode(ISD::SETNE);
|
||||
Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, Tmp4,
|
||||
Tmp2, Tmp3, Node->getOperand(4));
|
||||
@@ -4021,12 +3993,12 @@ void SelectionDAGLegalize::ExpandNode(SDNode *Node) {
|
||||
for (unsigned Idx = 0; Idx < NumElem; Idx++) {
|
||||
SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
VT.getScalarType(),
|
||||
Node->getOperand(0),
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()));
|
||||
Node->getOperand(0), DAG.getConstant(Idx,
|
||||
TLI.getVectorIdxTy()));
|
||||
SDValue Sh = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
|
||||
VT.getScalarType(),
|
||||
Node->getOperand(1),
|
||||
DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()));
|
||||
Node->getOperand(1), DAG.getConstant(Idx,
|
||||
TLI.getVectorIdxTy()));
|
||||
Scalars.push_back(DAG.getNode(Node->getOpcode(), dl,
|
||||
VT.getScalarType(), Ex, Sh));
|
||||
}
|
||||
@@ -4080,16 +4052,16 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
if (Node->getOpcode() == ISD::CTTZ) {
|
||||
// FIXME: This should set a bit in the zero extended value instead.
|
||||
Tmp2 = DAG.getSetCC(dl, getSetCCResultType(NVT),
|
||||
Tmp1, DAG.getConstant(NVT.getSizeInBits(), dl, NVT),
|
||||
Tmp1, DAG.getConstant(NVT.getSizeInBits(), NVT),
|
||||
ISD::SETEQ);
|
||||
Tmp1 = DAG.getSelect(dl, NVT, Tmp2,
|
||||
DAG.getConstant(OVT.getSizeInBits(), dl, NVT), Tmp1);
|
||||
DAG.getConstant(OVT.getSizeInBits(), NVT), Tmp1);
|
||||
} 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() -
|
||||
OVT.getSizeInBits(), dl, NVT));
|
||||
OVT.getSizeInBits(), NVT));
|
||||
}
|
||||
Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1));
|
||||
break;
|
||||
@@ -4098,8 +4070,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0));
|
||||
Tmp1 = DAG.getNode(ISD::BSWAP, dl, NVT, Tmp1);
|
||||
Tmp1 = DAG.getNode(ISD::SRL, dl, NVT, Tmp1,
|
||||
DAG.getConstant(DiffBits, dl,
|
||||
TLI.getShiftAmountTy(NVT)));
|
||||
DAG.getConstant(DiffBits, TLI.getShiftAmountTy(NVT)));
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
@@ -4189,7 +4160,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1);
|
||||
else
|
||||
Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
DAG.getIntPtrConstant(0));
|
||||
Results.push_back(Tmp1);
|
||||
break;
|
||||
}
|
||||
@@ -4246,7 +4217,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1));
|
||||
Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
|
||||
Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT,
|
||||
Tmp3, DAG.getIntPtrConstant(0, dl)));
|
||||
Tmp3, DAG.getIntPtrConstant(0)));
|
||||
break;
|
||||
}
|
||||
case ISD::FMA: {
|
||||
@@ -4256,7 +4227,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
Results.push_back(
|
||||
DAG.getNode(ISD::FP_ROUND, dl, OVT,
|
||||
DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2, Tmp3),
|
||||
DAG.getIntPtrConstant(0, dl)));
|
||||
DAG.getIntPtrConstant(0)));
|
||||
break;
|
||||
}
|
||||
case ISD::FPOWI: {
|
||||
@@ -4264,7 +4235,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
Tmp2 = Node->getOperand(1);
|
||||
Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2);
|
||||
Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT,
|
||||
Tmp3, DAG.getIntPtrConstant(0, dl)));
|
||||
Tmp3, DAG.getIntPtrConstant(0)));
|
||||
break;
|
||||
}
|
||||
case ISD::FFLOOR:
|
||||
@@ -4286,7 +4257,7 @@ void SelectionDAGLegalize::PromoteNode(SDNode *Node) {
|
||||
Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0));
|
||||
Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1);
|
||||
Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT,
|
||||
Tmp2, DAG.getIntPtrConstant(0, dl)));
|
||||
Tmp2, DAG.getIntPtrConstant(0)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user