Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
fc4f3b1
Introducing GenTreeMultiOp
SingleAccretion Sep 19, 2021
b8e6787
Rewrite gtNewSIMDNode
SingleAccretion Sep 19, 2021
97882b8
Rewrite gtNewSIMDVectorZero
SingleAccretion Sep 19, 2021
67332f3
Rewrite gtNewHWIntrinsicNode
SingleAccretion Sep 19, 2021
cb525ad
Rewrite GenTreeSIMD::OperIsMemoryLoad
SingleAccretion Sep 19, 2021
9fb378e
Rewrite GenTreeHWIntrinsic::OperIsMemoryLoad
SingleAccretion Sep 19, 2021
d3ec5c7
Rewrite GenTreeHWIntrinsic::OperIsMemoryStore
SingleAccretion Sep 19, 2021
ba32992
Rewrite GenTree::IsIntegralConstVector
SingleAccretion Sep 19, 2021
98bd7c6
Rewrite GenTree::NullOp1Legal
SingleAccretion Sep 19, 2021
d881afe
Rewrite GenTree::IsSIMDZero
SingleAccretion Sep 18, 2021
ad024f5
Rewrite GenTree::isCommutativeSIMDIntrinsic
SingleAccretion Sep 18, 2021
688d070
Rewrite GenTree::isCommutativeHWIntrinsic
SingleAccretion Sep 18, 2021
b6160fa
Rewrite GenTree::isContainableHWIntrinsic
SingleAccretion Sep 18, 2021
ea66ff0
Rewrite GenTree::isRMWHWIntrinsic
SingleAccretion Sep 18, 2021
cef84b3
Rewrite GenTreeVisitor
SingleAccretion Sep 19, 2021
da16e53
Rewrite GenTreeUseEdgeIterator
SingleAccretion Sep 19, 2021
c7e0026
Rewrite GenTree::VisitOperands
SingleAccretion Sep 19, 2021
01d2a07
Rewrite GenTree::TryGetUse
SingleAccretion Sep 19, 2021
27666fe
Rewrite gtGetChildPointer
SingleAccretion Sep 19, 2021
9cf6b98
Rewrite gtHasRef
SingleAccretion Sep 19, 2021
fdac99e
Rewrite fgSetTreeSeqHelper
SingleAccretion Sep 19, 2021
c294458
Rewrite GenTree::NumChildren
SingleAccretion Sep 19, 2021
74baa40
Rewrite GenTree::GetChild
SingleAccretion Sep 19, 2021
fc9367d
Rewrite GenTree::Compare
SingleAccretion Sep 19, 2021
bbcfd56
Rewrite gtCloneExpr
SingleAccretion Sep 19, 2021
8d11fa5
Rewrite gtSetEvalOrder
SingleAccretion Sep 19, 2021
75d4159
Rewrite gtHashValue
SingleAccretion Sep 19, 2021
0d79aa7
Rewrite gtDispTree
SingleAccretion Sep 19, 2021
425ae87
Rewrite fgDebugCheckFlags
SingleAccretion Sep 19, 2021
0495bf8
Add genConsumeMultiOpOperands
SingleAccretion Sep 19, 2021
f790bc3
Rewrite genConsumeRegs
SingleAccretion Sep 19, 2021
0ee852e
Rewrite HWIntrinsic::HWIntrinsic
SingleAccretion Sep 18, 2021
9bcbc1a
Rewrite HWIntrinsic::InitializeOperands
SingleAccretion Sep 18, 2021
ce27b50
Delete HWIntrinsicInfo::lookupNumArgs
SingleAccretion Sep 19, 2021
d84a932
Delete HWIntrinsicInfo::lookupLastOp
SingleAccretion Sep 19, 2021
ab3859f
Rewrite HWIntrinsicImmOpHelper ARM64
SingleAccretion Sep 18, 2021
6462406
Rewrite inst_RV_TT_IV
SingleAccretion Sep 19, 2021
6b3046e
Rewrite inst_RV_RV_TT
SingleAccretion Sep 19, 2021
4b166f8
Rewrite genSIMDIntrinsic XARCH
SingleAccretion Sep 18, 2021
609c167
Rewrite genSIMDIntrinsicInit XARCH
SingleAccretion Sep 19, 2021
2548050
Rewrite genSIMDIntrinsicInitN XARCH
SingleAccretion Sep 19, 2021
2da641c
Rewrite genSIMDIntrinsicUnOp XARCH
SingleAccretion Sep 19, 2021
ed2316c
Rewrite genSIMDIntrinsic32BitConvert XARCH
SingleAccretion Sep 19, 2021
4289c48
Rewrite genSIMDIntrinsic64BitConvert XARCH
SingleAccretion Sep 19, 2021
a2a0d0f
Rewrite genSIMDIntrinsicWiden XARCH
SingleAccretion Sep 19, 2021
d31386f
Rewrite genSIMDIntrinsicNarrow XARCH
SingleAccretion Sep 19, 2021
565e9e6
Rewrite genSIMDIntrinsicBinOp XARCH
SingleAccretion Sep 19, 2021
54e9239
Rewrite genSIMDIntrinsicRelOp XARCH
SingleAccretion Sep 18, 2021
7afd5be
Rewrite genSIMDIntrinsicShuffleSSE2 XARCH
SingleAccretion Sep 19, 2021
913ed8f
Rewrite genSIMDIntrinsicUpperSave XARCH
SingleAccretion Sep 19, 2021
1b38d92
Rewrite genSIMDIntrinsicUpperRestore XARCH
SingleAccretion Sep 19, 2021
a15c832
Rewrite genSIMDIntrinsic ARM64
SingleAccretion Sep 18, 2021
d6fd0a2
Rewrite genSIMDIntrinsicInit ARM64
SingleAccretion Sep 18, 2021
a80906e
Rewrite genSIMDIntrinsicInitN ARM64
SingleAccretion Sep 18, 2021
03724d4
Rewrite genSIMDIntrinsicUnOp ARM64
SingleAccretion Sep 18, 2021
5a40435
Rewrite genSIMDIntrinsicWiden ARM64
SingleAccretion Sep 18, 2021
e4bf675
Rewrite genSIMDIntrinsicNarrow ARM64
SingleAccretion Sep 18, 2021
973d6f5
Rewrite genSIMDIntrinsicBinOp ARM64
SingleAccretion Sep 18, 2021
4f7c38f
Rewrite genSIMDIntrinsicUpperSave ARM64
SingleAccretion Sep 18, 2021
fb2ba6f
Rewrite genSIMDIntrinsicUpperRestore ARM64
SingleAccretion Sep 18, 2021
edf1f90
Rewrite genHWIntrinsic_R_RM XARCH
SingleAccretion Sep 19, 2021
053a97b
Rewrite genHWIntrinsic_R_RM_I XARCH
SingleAccretion Sep 19, 2021
32ded29
Rewrite genHWIntrinsic_R_R_RM XARCH
SingleAccretion Sep 19, 2021
0dff891
Rewrite genHWIntrinsic_R_R_RM_I XARCH
SingleAccretion Sep 19, 2021
4c45da8
Rewrite genHWIntrinsic_R_R_RM_R XARCH
SingleAccretion Sep 19, 2021
0183e5d
Rewrite genHWIntrinsic_R_R_R_RM XARCH
SingleAccretion Sep 19, 2021
55afb24
Rewrite genHWIntrinsic XARCH
SingleAccretion Sep 19, 2021
e6e6c00
Rewrite genBaseIntrinsic XARCH
SingleAccretion Sep 19, 2021
c0e2d74
Rewrite genX86BaseIntrinsic XARCH
SingleAccretion Sep 19, 2021
71c87aa
Rewrite genSSEIntrinsic XARCH
SingleAccretion Sep 19, 2021
e7a79b9
Rewrite genSSE2Intrinsic XARCH
SingleAccretion Sep 19, 2021
0c71d16
Rewrite genSSE41Intrinsic XARCH
SingleAccretion Sep 19, 2021
0e5ac65
Rewrite genSSE42Intrinsic XARCH
SingleAccretion Sep 19, 2021
f67485b
Rewrite genAvxOrAvx2Intrinsic XARCH
SingleAccretion Sep 19, 2021
e34efe6
Rewrite genBMI1OrBMI2Intrinsic XARCH
SingleAccretion Sep 19, 2021
451481b
Rewrite genFMAIntrinsic XARCH
SingleAccretion Sep 19, 2021
af12e82
Rewrite genLZCNTIntrinsic XARCH
SingleAccretion Sep 19, 2021
793116b
Rewrite genPOPCNTIntrinsic XARCH
SingleAccretion Sep 19, 2021
fbd8a83
Rewrite genXCNTIntrinsic XARCH
SingleAccretion Sep 19, 2021
6ec5515
Rewrite genHWIntrinsic ARM64
SingleAccretion Sep 18, 2021
1f26bac
Rewrite insertUpperVectorSave
SingleAccretion Sep 19, 2021
bdccb8d
Rewrite insertUpperVectorRestore
SingleAccretion Sep 19, 2021
efb0497
Rewrite getKillSetForHWIntrinsic
SingleAccretion Sep 18, 2021
58179aa
Rewrite BuildSIMD XARCH
SingleAccretion Sep 19, 2021
93c0538
Rewrite BuildOperandUses/BuildDelayFreeUses
SingleAccretion Sep 19, 2021
baa4dd6
Rewrite BuildSIMD ARM64
SingleAccretion Sep 18, 2021
77a509c
Rewrite BuildHWIntrinsic XARCH
SingleAccretion Sep 19, 2021
3b01249
Rewrite LowerSIMD XARCH
SingleAccretion Sep 19, 2021
fda30f1
Rewrite ContainCheckSIMD XARCH
SingleAccretion Sep 19, 2021
c54b0ae
Rewrite LowerHWIntrinsicCC XARCH
SingleAccretion Sep 19, 2021
345baef
Rewrite LowerFusedMultiplyAdd XARCH
SingleAccretion Sep 19, 2021
ed27dfa
Rewrite LowerHWIntrinsic XARCH
SingleAccretion Sep 19, 2021
8cb253b
Rewrite LowerHWIntrinsicCmpOp XARCH
SingleAccretion Sep 19, 2021
1e8203a
Rewrite LowerHWIntrinsicGetElement XARCH
SingleAccretion Sep 19, 2021
8f8c5ab
Rewrite LowerHWIntrinsicWithElement XARCH
SingleAccretion Sep 19, 2021
fe43bf8
Rewrite LowerHWIntrinsicCreate XARCH
SingleAccretion Sep 19, 2021
b4bcb30
Rewrite LowerHWIntrinsicDot XARCH
SingleAccretion Sep 19, 2021
d75e9d6
Rewrite LowerHWIntrinsicToScalar XARCH
SingleAccretion Sep 19, 2021
5542069
Rewrite IsContainableHWIntrinsicOp XARCH
SingleAccretion Sep 19, 2021
0de2e7a
Rewrite ContainCheckHWIntrinsic XARCH
SingleAccretion Sep 19, 2021
0be52b3
Rewrite IsValidConstForMovImm ARM64
SingleAccretion Sep 18, 2021
0f9615f
Rewrite LowerHWIntrinsic ARM64
SingleAccretion Sep 18, 2021
ab6c992
Rewrite LowerHWIntrinsicFusedMultiplyAddScalar ARM64
SingleAccretion Sep 18, 2021
4d0b675
Rewrite LowerHWIntrinsicCmpOp ARM64
SingleAccretion Sep 18, 2021
b46e839
Rewrite LowerHWIntrinsicCreate ARM64
SingleAccretion Sep 18, 2021
9929e7b
Rewrite LowerHWIntrinsicDot ARM64
SingleAccretion Sep 18, 2021
4a96d7c
Rewrite ContainCheckStoreLoc ARM64
SingleAccretion Sep 18, 2021
07ba4d4
Rewrite ContainCheckSIMD ARM64
SingleAccretion Sep 18, 2021
11d39cd
Rewrite ContainCheckHWIntrinsic ARM64
SingleAccretion Sep 18, 2021
c438283
Rewrite DecomposeHWIntrinsicGetElement X86
SingleAccretion Sep 18, 2021
1932817
Rewrite DecomposeHWIntrinsic X86
SingleAccretion Sep 18, 2021
02dc5a7
Rewrite Rationalizer::RewriteNode
SingleAccretion Sep 19, 2021
4cc83da
Rewrite optIsCSEcandidate
SingleAccretion Sep 18, 2021
ffabd4e
Rewrite fgValueNumberTree
SingleAccretion Sep 19, 2021
8f9994c
Rewrite fgValueNumberSimd
SingleAccretion Sep 19, 2021
753a163
Rewrite fgValueNumberHWIntrinsic
SingleAccretion Sep 19, 2021
8c6e56f
Rewrite GetVNFuncForNode
SingleAccretion Sep 18, 2021
6a8b6d7
Rewrite fgMorphTree & fgMorphSmpOpOptional
SingleAccretion Sep 19, 2021
7687110
Rewrite fgMorphFieldToSimdGetElement/fgMorphField
SingleAccretion Sep 19, 2021
7fa5948
Rewrite fgMorphOneAsgBlockOp
SingleAccretion Oct 4, 2021
5b2e1fa
Rewrite impInlineFetchArg
SingleAccretion Oct 4, 2021
06c7e8c
Rewrite impSIMDRelOp
SingleAccretion Sep 19, 2021
4141820
Rewrite impSIMDIntrinsic
SingleAccretion Sep 19, 2021
3351111
Rewrite impBaseIntrinsic XARCH
SingleAccretion Sep 19, 2021
7f31729
Rewrite impAvxOrAvx2Intrinsic XARCH
SingleAccretion Sep 19, 2021
b65e3c0
Rewrite impSpecialIntrinsic ARM64
SingleAccretion Sep 19, 2021
04cfce7
Fix SSA Builder comments
SingleAccretion Sep 19, 2021
c417f73
Delete GT_LIST
SingleAccretion Sep 18, 2021
9a01ae4
Support GTF_REVERSE_OPS for GenTreeMultiOp
SingleAccretion Oct 3, 2021
5fccf67
Fix Linux x86 build break
SingleAccretion Nov 6, 2021
45171ec
Fix formatting
SingleAccretion Nov 10, 2021
a0991d3
Improve readability through the use of a local
SingleAccretion Nov 10, 2021
476d213
Merge branch 'main' into Make-Intrinsic-Nodes-Multi-Op
SingleAccretion Nov 10, 2021
b53c956
Support external operand arrays in GenTreeMultiOp
SingleAccretion Nov 11, 2021
fee7225
Fix formatting
SingleAccretion Nov 11, 2021
dcb4ed0
Merge branch 'main' into Make-Intrinsic-Nodes-Multi-Op
SingleAccretion Nov 12, 2021
2c077eb
Merge branch 'main' into Make-Intrinsic-Nodes-Multi-Op
SingleAccretion Nov 18, 2021
0910804
Tweak a constructor call
SingleAccretion Nov 18, 2021
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
Prev Previous commit
Next Next commit
Support external operand arrays in GenTreeMultiOp
  • Loading branch information
SingleAccretion committed Nov 11, 2021
commit b53c956efa6d20b90d3fcebaf6298d8cfdc87dfe
6 changes: 6 additions & 0 deletions src/coreclr/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -3167,6 +3167,12 @@ class Compiler
CorInfoType simdBaseJitType,
unsigned simdSize,
bool isSimdAsHWIntrinsic = false);
GenTreeHWIntrinsic* gtNewSimdHWIntrinsicNode(var_types type,
IntrinsicNodeBuilder&& nodeBuilder,
NamedIntrinsic hwIntrinsicID,
CorInfoType simdBaseJitType,
unsigned simdSize,
bool isSimdAsHWIntrinsic = false);

GenTreeHWIntrinsic* gtNewSimdAsHWIntrinsicNode(var_types type,
NamedIntrinsic hwIntrinsicID,
Expand Down
40 changes: 26 additions & 14 deletions src/coreclr/jit/gentree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8013,16 +8013,16 @@ GenTree* Compiler::gtCloneExpr(
#ifdef FEATURE_SIMD
case GT_SIMD:
copy = new (this, GT_SIMD)
GenTreeSIMD(tree->TypeGet(), getAllocator(CMK_ASTNode), tree->AsSIMD()->GetOperandArray(),
tree->AsSIMD()->GetOperandCount(), tree->AsSIMD()->GetSIMDIntrinsicId(),
tree->AsSIMD()->GetSimdBaseJitType(), tree->AsSIMD()->GetSimdSize());
GenTreeSIMD(tree->TypeGet(), IntrinsicNodeBuilder(getAllocator(CMK_ASTNode), tree->AsSIMD()),
tree->AsSIMD()->GetSIMDIntrinsicId(), tree->AsSIMD()->GetSimdBaseJitType(),
tree->AsSIMD()->GetSimdSize());
goto CLONE_MULTIOP_OPERANDS;
#endif
#ifdef FEATURE_HW_INTRINSICS
case GT_HWINTRINSIC:
copy = new (this, GT_HWINTRINSIC)
GenTreeHWIntrinsic(tree->TypeGet(), getAllocator(CMK_ASTNode), tree->AsHWIntrinsic()->GetOperandArray(),
tree->AsHWIntrinsic()->GetOperandCount(), tree->AsHWIntrinsic()->GetHWIntrinsicId(),
GenTreeHWIntrinsic(tree->TypeGet(), IntrinsicNodeBuilder(getAllocator(CMK_ASTNode), tree->AsMultiOp()),
tree->AsHWIntrinsic()->GetHWIntrinsicId(),
tree->AsHWIntrinsic()->GetSimdBaseJitType(), tree->AsHWIntrinsic()->GetSimdSize(),
tree->AsHWIntrinsic()->IsSimdAsHWIntrinsic());
copy->AsHWIntrinsic()->SetAuxiliaryJitType(tree->AsHWIntrinsic()->GetAuxiliaryJitType());
Expand Down Expand Up @@ -18708,14 +18708,8 @@ void GenTreeMultiOp::ResetOperandArray(size_t newOperandCount,
return true;
}

void GenTreeMultiOp::InitializeOperands(CompAllocator allocator,
GenTree** operands,
size_t operandCount,
GenTree** inlineOperands,
size_t inlineOperandCount)
void GenTreeMultiOp::InitializeOperands(GenTree** operands, size_t operandCount)
{
m_operands = (operandCount <= inlineOperandCount) ? inlineOperands : allocator.allocate<GenTree*>(operandCount);

for (size_t i = 0; i < operandCount; i++)
{
m_operands[i] = operands[i];
Expand Down Expand Up @@ -18935,13 +18929,31 @@ GenTreeHWIntrinsic* Compiler::gtNewSimdHWIntrinsicNode(var_types type,
unsigned simdSize,
bool isSimdAsHWIntrinsic)
{
IntrinsicNodeBuilder nodeBuilder(getAllocator(CMK_ASTNode), operandCount);
for (size_t i = 0; i < operandCount; i++)
{
nodeBuilder.AddOperand(i, operands[i]);
SetOpLclRelatedToSIMDIntrinsic(operands[i]);
}

return new (this, GT_HWINTRINSIC) GenTreeHWIntrinsic(type, getAllocator(CMK_ASTNode), operands, operandCount,
hwIntrinsicID, simdBaseJitType, simdSize, isSimdAsHWIntrinsic);
return new (this, GT_HWINTRINSIC) GenTreeHWIntrinsic(type, std::move(nodeBuilder), hwIntrinsicID, simdBaseJitType,
simdSize, isSimdAsHWIntrinsic);
}

GenTreeHWIntrinsic* Compiler::gtNewSimdHWIntrinsicNode(var_types type,
IntrinsicNodeBuilder&& nodeBuilder,
NamedIntrinsic hwIntrinsicID,
CorInfoType simdBaseJitType,
unsigned simdSize,
bool isSimdAsHWIntrinsic)
{
for (size_t i = 0; i < nodeBuilder.GetOperandCount(); i++)
{
SetOpLclRelatedToSIMDIntrinsic(nodeBuilder.GetOperand(i));
}

return new (this, GT_HWINTRINSIC) GenTreeHWIntrinsic(type, std::move(nodeBuilder), hwIntrinsicID, simdBaseJitType,
simdSize, isSimdAsHWIntrinsic);
}

GenTree* Compiler::gtNewSimdAbsNode(
Expand Down
139 changes: 102 additions & 37 deletions src/coreclr/jit/gentree.h
Original file line number Diff line number Diff line change
Expand Up @@ -5131,21 +5131,25 @@ struct GenTreeMultiOp : public GenTree
{
const size_t OperandCount = sizeof...(Operands);

m_operands = (OperandCount <= InlineOperandCount) ? inlineOperands : allocator.allocate<GenTree*>(OperandCount);

// "OperandCount + 1" so that it works well when OperandCount is 0.
GenTree* operandsArray[OperandCount + 1]{operands...};
InitializeOperands(allocator, operandsArray, OperandCount, inlineOperands, InlineOperandCount);
InitializeOperands(operandsArray, OperandCount);
}

// Note that this constructor takes the owndership of the "operands" array.
template <unsigned InlineOperandCount>
GenTreeMultiOp(genTreeOps oper,
var_types type,
CompAllocator allocator,
GenTree** operands,
size_t operandCount,
GenTreeMultiOp(genTreeOps oper,
var_types type,
GenTree** operands,
size_t operandCount,
GenTree* (&inlineOperands)[InlineOperandCount] DEBUGARG(bool largeNode))
: GenTree(oper, type DEBUGARG(largeNode))
{
InitializeOperands(allocator, operands, operandCount, inlineOperands, InlineOperandCount);
m_operands = (operandCount <= InlineOperandCount) ? inlineOperands : operands;

InitializeOperands(operands, operandCount);
}

public:
Expand Down Expand Up @@ -5203,11 +5207,7 @@ struct GenTreeMultiOp : public GenTree
static bool OperandsAreEqual(GenTreeMultiOp* op1, GenTreeMultiOp* op2);

private:
void InitializeOperands(CompAllocator allocator,
GenTree** operands,
size_t operandCount,
GenTree** inlineOperands,
size_t inlineOperandCount);
void InitializeOperands(GenTree** operands, size_t operandCount);

void SetOperandCount(size_t newOperandCount)
{
Expand All @@ -5216,6 +5216,72 @@ struct GenTreeMultiOp : public GenTree
}
};

// Helper class used to implement the constructor of GenTreeJitIntrinsic which
// transfers the ownership of the passed-in array to the underlying MultiOp node.
class IntrinsicNodeBuilder final
{
friend struct GenTreeJitIntrinsic;

GenTree** m_operands;
size_t m_operandCount;
GenTree* m_inlineOperands[2];

public:
IntrinsicNodeBuilder(CompAllocator allocator, size_t operandCount) : m_operandCount(operandCount)
{
m_operands = (operandCount <= ArrLen(m_inlineOperands)) ? m_inlineOperands
: allocator.allocate<GenTree*>(operandCount);
#ifdef DEBUG
for (size_t i = 0; i < operandCount; i++)
{
m_operands[i] = nullptr;
}
#endif // DEBUG
}

IntrinsicNodeBuilder(CompAllocator allocator, GenTreeMultiOp* source) : m_operandCount(source->GetOperandCount())
{
m_operands = (m_operandCount <= ArrLen(m_inlineOperands)) ? m_inlineOperands
: allocator.allocate<GenTree*>(m_operandCount);
for (size_t i = 0; i < m_operandCount; i++)
{
m_operands[i] = source->Op(i + 1);
}
}

void AddOperand(size_t index, GenTree* operand)
{
assert(index < m_operandCount);
assert(m_operands[index] == nullptr);
m_operands[index] = operand;
}

GenTree* GetOperand(size_t index) const
{
assert(index < m_operandCount);
assert(m_operands[index] != nullptr);
return m_operands[index];
}

size_t GetOperandCount() const
{
return m_operandCount;
}

private:
GenTree** GetBuiltOperands()
{
#ifdef DEBUG
for (size_t i = 0; i < m_operandCount; i++)
{
assert(m_operands[i] != nullptr);
}
#endif // DEBUG

return m_operands;
}
};

struct GenTreeJitIntrinsic : public GenTreeMultiOp
{
protected:
Expand Down Expand Up @@ -5321,14 +5387,17 @@ struct GenTreeJitIntrinsic : public GenTreeMultiOp
#endif

protected:
GenTreeJitIntrinsic(genTreeOps oper,
var_types type,
CompAllocator allocator,
GenTree** operands,
size_t operandCount,
CorInfoType simdBaseJitType,
unsigned simdSize)
: GenTreeMultiOp(oper, type, allocator, operands, operandCount, gtInlineOperands DEBUGARG(false))
GenTreeJitIntrinsic(genTreeOps oper,
var_types type,
IntrinsicNodeBuilder&& nodeBuilder,
CorInfoType simdBaseJitType,
unsigned simdSize)
: GenTreeMultiOp(oper,
type,
nodeBuilder.GetBuiltOperands(),
nodeBuilder.GetOperandCount(),
gtInlineOperands
DEBUGARG(false))
, gtLayoutNum(0)
, gtAuxiliaryJitType(CORINFO_TYPE_UNDEF)
, gtOtherReg(REG_NA)
Expand All @@ -5352,14 +5421,12 @@ struct GenTreeJitIntrinsic : public GenTreeMultiOp
/* gtSIMD -- SIMD intrinsic (possibly-binary op [NULL op2 is allowed] with additional fields) */
struct GenTreeSIMD : public GenTreeJitIntrinsic
{
GenTreeSIMD(var_types type,
CompAllocator allocator,
GenTree** operands,
size_t operandCount,
SIMDIntrinsicID simdIntrinsicID,
CorInfoType simdBaseJitType,
unsigned simdSize)
: GenTreeJitIntrinsic(GT_SIMD, type, allocator, operands, operandCount, simdBaseJitType, simdSize)
GenTreeSIMD(var_types type,
IntrinsicNodeBuilder&& nodeBuilder,
SIMDIntrinsicID simdIntrinsicID,
CorInfoType simdBaseJitType,
unsigned simdSize)
: GenTreeJitIntrinsic(GT_SIMD, type, std::move(nodeBuilder), simdBaseJitType, simdSize)
{
gtSIMDIntrinsicID = simdIntrinsicID;
}
Expand Down Expand Up @@ -5408,15 +5475,13 @@ struct GenTreeSIMD : public GenTreeJitIntrinsic
#ifdef FEATURE_HW_INTRINSICS
struct GenTreeHWIntrinsic : public GenTreeJitIntrinsic
{
GenTreeHWIntrinsic(var_types type,
CompAllocator allocator,
GenTree** operands,
size_t operandCount,
NamedIntrinsic hwIntrinsicID,
CorInfoType simdBaseJitType,
unsigned simdSize,
bool isSimdAsHWIntrinsic)
: GenTreeJitIntrinsic(GT_HWINTRINSIC, type, allocator, operands, operandCount, simdBaseJitType, simdSize)
GenTreeHWIntrinsic(var_types type,
IntrinsicNodeBuilder&& nodeBuilder,
NamedIntrinsic hwIntrinsicID,
CorInfoType simdBaseJitType,
unsigned simdSize,
bool isSimdAsHWIntrinsic)
: GenTreeJitIntrinsic(GT_HWINTRINSIC, type, std::move(nodeBuilder), simdBaseJitType, simdSize)
{
SetHWIntrinsicId(hwIntrinsicID);

Expand Down
7 changes: 3 additions & 4 deletions src/coreclr/jit/hwintrinsicarm64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -482,15 +482,14 @@ GenTree* Compiler::impSpecialIntrinsic(NamedIntrinsic intrinsic,
// We shouldn't handle this as an intrinsic if the
// respective ISAs have been disabled by the user.

GenTree* args[32];
assert(sig->numArgs <= ArrLen(args));
IntrinsicNodeBuilder nodeBuilder(getAllocator(CMK_ASTNode), sig->numArgs);

for (int i = sig->numArgs - 1; i >= 0; i--)
{
args[i] = impPopStack().val;
nodeBuilder.AddOperand(i, impPopStack().val);
}

retNode = gtNewSimdHWIntrinsicNode(retType, args, sig->numArgs, intrinsic, simdBaseJitType, simdSize);
retNode = gtNewSimdHWIntrinsicNode(retType, std::move(nodeBuilder), intrinsic, simdBaseJitType, simdSize);
break;
}

Expand Down
7 changes: 3 additions & 4 deletions src/coreclr/jit/hwintrinsicxarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -858,15 +858,14 @@ GenTree* Compiler::impBaseIntrinsic(NamedIntrinsic intrinsic,
}
#endif // TARGET_X86

GenTree* args[32];
assert(sig->numArgs <= ArrLen(args));
IntrinsicNodeBuilder nodeBuilder(getAllocator(CMK_ASTNode), sig->numArgs);

for (int i = sig->numArgs - 1; i >= 0; i--)
{
args[i] = impPopStack().val;
nodeBuilder.AddOperand(i, impPopStack().val);
}

retNode = gtNewSimdHWIntrinsicNode(retType, args, sig->numArgs, intrinsic, simdBaseJitType, simdSize);
retNode = gtNewSimdHWIntrinsicNode(retType, std::move(nodeBuilder), intrinsic, simdBaseJitType, simdSize);
break;
}

Expand Down
17 changes: 8 additions & 9 deletions src/coreclr/jit/simd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1985,13 +1985,13 @@ GenTree* Compiler::impSIMDIntrinsic(OPCODE opcode,
// SIMDIntrinsicInitN
// op2 - list of initializer values stitched into a list
// op1 - byref of vector
GenTree* args[4]{};
bool initFromFirstArgIndir = false;
IntrinsicNodeBuilder nodeBuilder(getAllocator(CMK_ASTNode), argCount - 1);
bool initFromFirstArgIndir = false;

if (simdIntrinsicID == SIMDIntrinsicInit)
{
op2 = impSIMDPopStack(simdBaseType);
args[0] = op2;
op2 = impSIMDPopStack(simdBaseType);
nodeBuilder.AddOperand(0, op2);
}
else
{
Expand All @@ -2001,7 +2001,6 @@ GenTree* Compiler::impSIMDIntrinsic(OPCODE opcode,
unsigned initCount = argCount - 1;
unsigned elementCount = getSIMDVectorLength(size, simdBaseType);
noway_assert(initCount == elementCount);
assert(initCount <= ArrLen(args));

// Build an array with the N values.
// We must maintain left-to-right order of the args, but we will pop
Expand All @@ -2026,7 +2025,7 @@ GenTree* Compiler::impSIMDIntrinsic(OPCODE opcode,
}

assert(genActualType(arg) == genActualType(simdBaseType));
args[initCount - i - 1] = arg;
nodeBuilder.AddOperand(initCount - i - 1, arg);
}

if (areArgsContiguous && simdBaseType == TYP_FLOAT)
Expand All @@ -2035,7 +2034,7 @@ GenTree* Compiler::impSIMDIntrinsic(OPCODE opcode,
// we intialize the vector from first argument address, only when
// the simdBaseType is TYP_FLOAT and the arguments are located contiguously in memory
initFromFirstArgIndir = true;
GenTree* op2Address = createAddressNodeForSIMDInit(args[0], size);
GenTree* op2Address = createAddressNodeForSIMDInit(nodeBuilder.GetOperand(0), size);
var_types simdType = getSIMDTypeForSize(size);
op2 = gtNewOperNode(GT_IND, simdType, op2Address);
}
Expand Down Expand Up @@ -2111,8 +2110,8 @@ GenTree* Compiler::impSIMDIntrinsic(OPCODE opcode,
}
else
{
simdTree = new (this, GT_SIMD) GenTreeSIMD(simdType, getAllocator(CMK_ASTNode), args, argCount - 1,
simdIntrinsicID, simdBaseJitType, size);
simdTree = new (this, GT_SIMD) GenTreeSIMD(simdType, std::move(nodeBuilder), simdIntrinsicID,
simdBaseJitType, size);
}
}

Expand Down