Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/coreclr/jit/decomposelongs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1960,7 +1960,7 @@ GenTree* DecomposeLongs::DecomposeHWIntrinsicToScalar(LIR::Use& use, GenTreeHWIn
simdTmpVar = m_compiler->gtNewLclLNode(simdTmpVarNum, simdTmpVar->TypeGet());
Range().InsertAfter(loResult, simdTmpVar);

GenTree* one = m_compiler->gtNewIconNode(1);
GenTree* one = m_compiler->gtNewIconNode(1, TYP_I_IMPL);
GenTree* hiResult = m_compiler->gtNewSimdGetElementNode(TYP_INT, simdTmpVar, one, CORINFO_TYPE_INT, simdSize);

Range().InsertAfter(simdTmpVar, one, hiResult);
Expand Down
11 changes: 8 additions & 3 deletions src/coreclr/jit/gentree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21484,18 +21484,21 @@ GenTree* Compiler::gtNewSimdBinOpNode(
GenTree* op2Dup = fgMakeMultiUse(op2ToDup);

assert(!varTypeIsArithmetic(op1Dup));
op1Dup = gtNewSimdGetElementNode(TYP_LONG, op1Dup, gtNewIconNode(1), simdBaseJitType, simdSize);
op1Dup =
gtNewSimdGetElementNode(TYP_LONG, op1Dup, gtNewIconNode(1, TYP_I_IMPL), simdBaseJitType, simdSize);

if (!varTypeIsArithmetic(op2Dup))
{
op2Dup = gtNewSimdGetElementNode(TYP_LONG, op2Dup, gtNewIconNode(1), simdBaseJitType, simdSize);
op2Dup = gtNewSimdGetElementNode(TYP_LONG, op2Dup, gtNewIconNode(1, TYP_I_IMPL), simdBaseJitType,
simdSize);
}

// upper = op1.GetElement(1) * op2.GetElement(1)
GenTree* upper = gtNewOperNode(GT_MUL, TYP_LONG, op1Dup, op2Dup);

// return Vector128.Create(lower, upper)
return gtNewSimdWithElementNode(type, lower, gtNewIconNode(1), upper, simdBaseJitType, simdSize);
return gtNewSimdWithElementNode(type, lower, gtNewIconNode(1, TYP_I_IMPL), upper, simdBaseJitType,
simdSize);
}
#endif // !TARGET_XARCH && !TARGET_ARM64
unreached();
Expand Down Expand Up @@ -23270,6 +23273,7 @@ GenTree* Compiler::gtNewSimdGetElementNode(
var_types simdBaseType = JitType2PreciseVarType(simdBaseJitType);

assert(varTypeIsArithmetic(simdBaseType));
assert(op2->TypeIs(TYP_I_IMPL));

#if defined(TARGET_XARCH)
if (op2->IsIntegralConst(0))
Expand Down Expand Up @@ -27748,6 +27752,7 @@ GenTree* Compiler::gtNewSimdWithElementNode(

assert(varTypeIsArithmetic(simdBaseType));
assert(varTypeIsArithmetic(op3));
assert(op2->TypeIs(TYP_I_IMPL));

#if defined(TARGET_XARCH)
assert(!varTypeIsLong(simdBaseType) || compIsaSupportedDebugOnly(InstructionSet_X86Base_X64));
Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/jit/hwintrinsic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1590,7 +1590,7 @@ GenTree* Compiler::addRangeCheckForHWIntrinsic(GenTree* immOp, int immLowerBound
// The value of (immUpperBound - immLowerBound + 1) is denoted as adjustedUpperBound.

const ssize_t adjustedUpperBound = (ssize_t)immUpperBound - immLowerBound + 1;
GenTree* adjustedUpperBoundNode = gtNewIconNode(adjustedUpperBound, TYP_INT);
GenTree* adjustedUpperBoundNode = gtNewIconNode(adjustedUpperBound, TYP_I_IMPL);

GenTree* immOpDup = nullptr;

Expand All @@ -1599,7 +1599,7 @@ GenTree* Compiler::addRangeCheckForHWIntrinsic(GenTree* immOp, int immLowerBound

if (immLowerBound != 0)
{
immOpDup = gtNewOperNode(GT_SUB, TYP_INT, immOpDup, gtNewIconNode(immLowerBound, TYP_INT));
immOpDup = gtNewOperNode(GT_SUB, TYP_I_IMPL, immOpDup, gtNewIconNode(immLowerBound, TYP_I_IMPL));
}

GenTreeBoundsChk* hwIntrinsicChk =
Expand Down
13 changes: 9 additions & 4 deletions src/coreclr/jit/hwintrinsicarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -859,11 +859,11 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,

op1 = gtNewSimdHWIntrinsicNode(retType, op1, NI_Vector64_ToVector128Unsafe, simdBaseJitType, 8);

GenTree* idx = gtNewIconNode(2, TYP_INT);
GenTree* idx = gtNewIconNode(2, TYP_I_IMPL);
GenTree* zero = gtNewZeroConNode(TYP_FLOAT);
op1 = gtNewSimdWithElementNode(retType, op1, idx, zero, simdBaseJitType, 16);

idx = gtNewIconNode(3, TYP_INT);
idx = gtNewIconNode(3, TYP_I_IMPL);
zero = gtNewZeroConNode(TYP_FLOAT);
retNode = gtNewSimdWithElementNode(retType, op1, idx, zero, simdBaseJitType, 16);

Expand All @@ -887,7 +887,7 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,

op1 = gtNewSimdHWIntrinsicNode(retType, op1, NI_Vector128_AsVector128Unsafe, simdBaseJitType, 12);

GenTree* idx = gtNewIconNode(3, TYP_INT);
GenTree* idx = gtNewIconNode(3, TYP_I_IMPL);
GenTree* zero = gtNewZeroConNode(TYP_FLOAT);
retNode = gtNewSimdWithElementNode(retType, op1, idx, zero, simdBaseJitType, 16);
break;
Expand Down Expand Up @@ -1345,7 +1345,8 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
op1 = impSIMDPopStack();

retNode = gtNewSimdDotProdNode(simdType, op1, op2, simdBaseJitType, simdSize);
retNode = gtNewSimdGetElementNode(retType, retNode, gtNewIconNode(0), simdBaseJitType, simdSize);
retNode =
gtNewSimdGetElementNode(retType, retNode, gtNewIconNode(0, TYP_I_IMPL), simdBaseJitType, simdSize);
}
break;
}
Expand Down Expand Up @@ -1628,6 +1629,8 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
op2 = impPopStack().val;
op1 = impSIMDPopStack();

op2 = gtFoldExpr(impImplicitIorI4Cast(op2, TYP_I_IMPL, /* zeroExtend */ true));

retNode = gtNewSimdGetElementNode(retType, op1, op2, simdBaseJitType, simdSize);
break;
}
Expand Down Expand Up @@ -2750,6 +2753,8 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
assert(numArgs == 3);
GenTree* indexOp = impStackTop(1).val;

indexOp = gtFoldExpr(impImplicitIorI4Cast(indexOp, TYP_I_IMPL, /* zeroExtend */ true));

if (!indexOp->OperIsConst())
{
if (!opts.OptimizationEnabled())
Expand Down
4 changes: 4 additions & 0 deletions src/coreclr/jit/hwintrinsiccodegenxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2001,6 +2001,8 @@ void CodeGen::genBaseIntrinsic(GenTreeHWIntrinsic* node, insOpts instOptions)
assert(genStackLevel == 0);
#endif // !FEATURE_FIXED_OUT_ARGS

assert(op2->TypeIs(TYP_I_IMPL));

regNumber indexReg = op2->GetRegNum();
regNumber valueReg = op3->GetRegNum(); // New element value to be stored

Expand Down Expand Up @@ -2035,6 +2037,8 @@ void CodeGen::genBaseIntrinsic(GenTreeHWIntrinsic* node, insOpts instOptions)
simdType = TYP_SIMD16;
}

assert(op2->TypeIs(TYP_I_IMPL));

// Optimize the case of op1 is in memory and trying to access i'th element.
if (!op1->isUsedFromReg())
{
Expand Down
10 changes: 7 additions & 3 deletions src/coreclr/jit/hwintrinsicxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1573,11 +1573,11 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,

op1 = gtNewSimdHWIntrinsicNode(retType, op1, NI_Vector128_AsVector128Unsafe, simdBaseJitType, 8);

GenTree* idx = gtNewIconNode(2, TYP_INT);
GenTree* idx = gtNewIconNode(2, TYP_I_IMPL);
GenTree* zero = gtNewZeroConNode(TYP_FLOAT);
op1 = gtNewSimdWithElementNode(retType, op1, idx, zero, simdBaseJitType, 16);

idx = gtNewIconNode(3, TYP_INT);
idx = gtNewIconNode(3, TYP_I_IMPL);
zero = gtNewZeroConNode(TYP_FLOAT);
retNode = gtNewSimdWithElementNode(retType, op1, idx, zero, simdBaseJitType, 16);

Expand All @@ -1601,7 +1601,7 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,

op1 = gtNewSimdHWIntrinsicNode(retType, op1, NI_Vector128_AsVector128Unsafe, simdBaseJitType, 12);

GenTree* idx = gtNewIconNode(3, TYP_INT);
GenTree* idx = gtNewIconNode(3, TYP_I_IMPL);
GenTree* zero = gtNewZeroConNode(TYP_FLOAT);
retNode = gtNewSimdWithElementNode(retType, op1, idx, zero, simdBaseJitType, 16);
break;
Expand Down Expand Up @@ -2705,6 +2705,8 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
op2 = impPopStack().val;
op1 = impSIMDPopStack();

op2 = gtFoldExpr(impImplicitIorI4Cast(op2, TYP_I_IMPL, /* zeroExtend */ true));

retNode = gtNewSimdGetElementNode(retType, op1, op2, simdBaseJitType, simdSize);
break;
}
Expand Down Expand Up @@ -4146,6 +4148,8 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
GenTree* indexOp = impPopStack().val;
GenTree* vectorOp = impSIMDPopStack();

indexOp = gtFoldExpr(impImplicitIorI4Cast(indexOp, TYP_I_IMPL, /* zeroExtend */ true));

retNode = gtNewSimdWithElementNode(retType, vectorOp, indexOp, valueOp, simdBaseJitType, simdSize);
break;
}
Expand Down
8 changes: 4 additions & 4 deletions src/coreclr/jit/lclmorph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1732,7 +1732,7 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
case TYP_FLOAT:
{
// Handle case 1 or the float field of case 2
GenTree* indexNode = m_compiler->gtNewIconNode(offset / genTypeSize(elementType));
GenTree* indexNode = m_compiler->gtNewIconNode(offset / genTypeSize(elementType), TYP_I_IMPL);
hwiNode = m_compiler->gtNewSimdGetElementNode(elementType, lclNode, indexNode,
CORINFO_TYPE_FLOAT, genTypeSize(varDsc));
break;
Expand Down Expand Up @@ -1790,7 +1790,7 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
case TYP_FLOAT:
{
// Handle case 1 or the float field of case 2
GenTree* indexNode = m_compiler->gtNewIconNode(offset / genTypeSize(elementType));
GenTree* indexNode = m_compiler->gtNewIconNode(offset / genTypeSize(elementType), TYP_I_IMPL);
hwiNode =
m_compiler->gtNewSimdWithElementNode(varDsc->TypeGet(), simdLclNode, indexNode, elementNode,
CORINFO_TYPE_FLOAT, genTypeSize(varDsc));
Expand All @@ -1810,11 +1810,11 @@ class LocalAddressVisitor final : public GenTreeVisitor<LocalAddressVisitor>
NI_Vector128_AsVector128Unsafe,
CORINFO_TYPE_FLOAT, 12);

GenTree* indexNode1 = m_compiler->gtNewIconNode(3, TYP_INT);
GenTree* indexNode1 = m_compiler->gtNewIconNode(3, TYP_I_IMPL);
simdLclNode = m_compiler->gtNewSimdGetElementNode(TYP_FLOAT, simdLclNode, indexNode1,
CORINFO_TYPE_FLOAT, 16);

GenTree* indexNode2 = m_compiler->gtNewIconNode(3, TYP_INT);
GenTree* indexNode2 = m_compiler->gtNewIconNode(3, TYP_I_IMPL);
hwiNode = m_compiler->gtNewSimdWithElementNode(TYP_SIMD16, elementNode, indexNode2, simdLclNode,
CORINFO_TYPE_FLOAT, 16);
break;
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/jit/lowerxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5235,7 +5235,7 @@ GenTree* Lowering::LowerHWIntrinsicGetElement(GenTreeHWIntrinsic* node)
}
else
{
op2 = comp->gtNewIconNode(imm8);
op2 = comp->gtNewIconNode(imm8, TYP_I_IMPL);
BlockRange().InsertBefore(node, op2);

switch (simdBaseType)
Expand Down
18 changes: 10 additions & 8 deletions src/coreclr/jit/valuenum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8383,15 +8383,15 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunBinary(
case NI_Vector512_GetElement:
#endif
{
var_types simdType = TypeOfVN(arg0VN);
int32_t index = GetConstantInt32(arg1VN);
var_types simdType = TypeOfVN(arg0VN);
target_size_t index = ConstantValue<target_size_t>(arg1VN);

if (static_cast<uint32_t>(index) >= GenTreeVecCon::ElementCount(genTypeSize(simdType), baseType))
if (index >= GenTreeVecCon::ElementCount(genTypeSize(simdType), baseType))
{
// Nothing to fold for out of range indexes
break;
}
return EvaluateSimdGetElement(this, simdType, baseType, arg0VN, index);
return EvaluateSimdGetElement(this, simdType, baseType, arg0VN, static_cast<int32_t>(index));
}

#if defined(TARGET_ARM64)
Expand Down Expand Up @@ -9325,9 +9325,9 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunTernary(
break;
}

int32_t index = GetConstantInt32(arg1VN);
target_size_t index = ConstantValue<target_size_t>(arg1VN);

if (static_cast<uint32_t>(index) >= GenTreeVecCon::ElementCount(genTypeSize(type), baseType))
if (index >= GenTreeVecCon::ElementCount(genTypeSize(type), baseType))
{
// Nothing to fold for out of range indexes
break;
Expand All @@ -9345,7 +9345,8 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunTernary(
{
value = GetConstantDouble(arg2VN);
}
return EvaluateSimdWithElementFloating(this, type, baseType, arg0VN, index, value);
return EvaluateSimdWithElementFloating(this, type, baseType, arg0VN, static_cast<int32_t>(index),
value);
}
else
{
Expand All @@ -9360,7 +9361,8 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunTernary(
{
value = GetConstantInt32(arg2VN);
}
return EvaluateSimdWithElementIntegral(this, type, baseType, arg0VN, index, value);
return EvaluateSimdWithElementIntegral(this, type, baseType, arg0VN, static_cast<int32_t>(index),
value);
}
}

Expand Down
Loading