@@ -20830,21 +20830,14 @@ GenTree* Compiler::gtNewSimdBinOpNode(
20830
20830
{
20831
20831
GenTree** broadcastOp = nullptr;
20832
20832
20833
- #if defined(TARGET_ARM64)
20834
- if (varTypeIsLong(simdBaseType))
20835
- {
20836
- break;
20837
- }
20838
- #endif // TARGET_ARM64
20839
-
20840
20833
if (varTypeIsArithmetic(op1))
20841
20834
{
20842
20835
broadcastOp = &op1;
20843
20836
20844
20837
#if defined(TARGET_ARM64)
20845
20838
if (!varTypeIsByte(simdBaseType))
20846
20839
{
20847
- // MultiplyByScalar requires the scalar op to be op2fGetHWIntrinsicIdForBinOp
20840
+ // MultiplyByScalar requires the scalar op to be op2 for GetHWIntrinsicIdForBinOp
20848
20841
needsReverseOps = true;
20849
20842
}
20850
20843
#endif // TARGET_ARM64
@@ -20857,7 +20850,12 @@ GenTree* Compiler::gtNewSimdBinOpNode(
20857
20850
if (broadcastOp != nullptr)
20858
20851
{
20859
20852
#if defined(TARGET_ARM64)
20860
- if (!varTypeIsByte(simdBaseType))
20853
+ if (varTypeIsLong(simdBaseType))
20854
+ {
20855
+ // This is handled via emulation and the scalar is consumed directly
20856
+ break;
20857
+ }
20858
+ else if (!varTypeIsByte(simdBaseType))
20861
20859
{
20862
20860
op2ForLookup = *broadcastOp;
20863
20861
*broadcastOp = gtNewSimdCreateScalarUnsafeNode(TYP_SIMD8, *broadcastOp, simdBaseJitType, 8);
@@ -21261,24 +21259,26 @@ GenTree* Compiler::gtNewSimdBinOpNode(
21261
21259
#elif defined(TARGET_ARM64)
21262
21260
if (varTypeIsLong(simdBaseType))
21263
21261
{
21264
- GenTree** op1ToDup = &op1;
21265
- GenTree** op2ToDup = &op2;
21262
+ GenTree** op2ToDup = nullptr;
21266
21263
21267
- if (!varTypeIsArithmetic(op1))
21268
- {
21269
- op1 = gtNewSimdToScalarNode(TYP_LONG, op1, simdBaseJitType, simdSize);
21270
- op1ToDup = &op1->AsHWIntrinsic()->Op(1);
21271
- }
21264
+ assert(varTypeIsSIMD(op1));
21265
+ op1 = gtNewSimdToScalarNode(TYP_LONG, op1, simdBaseJitType, simdSize);
21266
+ GenTree** op1ToDup = &op1->AsHWIntrinsic()->Op(1);
21272
21267
21273
- if (!varTypeIsArithmetic (op2))
21268
+ if (varTypeIsSIMD (op2))
21274
21269
{
21275
21270
op2 = gtNewSimdToScalarNode(TYP_LONG, op2, simdBaseJitType, simdSize);
21276
21271
op2ToDup = &op2->AsHWIntrinsic()->Op(1);
21277
21272
}
21278
21273
21279
21274
// lower = op1.GetElement(0) * op2.GetElement(0)
21280
21275
GenTree* lower = gtNewOperNode(GT_MUL, TYP_LONG, op1, op2);
21281
- lower = gtNewSimdCreateScalarUnsafeNode(type, lower, simdBaseJitType, simdSize);
21276
+
21277
+ if (op2ToDup == nullptr)
21278
+ {
21279
+ op2ToDup = &lower->AsOp()->gtOp2;
21280
+ }
21281
+ lower = gtNewSimdCreateScalarUnsafeNode(type, lower, simdBaseJitType, simdSize);
21282
21282
21283
21283
if (simdSize == 8)
21284
21284
{
@@ -21290,10 +21290,8 @@ GenTree* Compiler::gtNewSimdBinOpNode(
21290
21290
GenTree* op1Dup = fgMakeMultiUse(op1ToDup);
21291
21291
GenTree* op2Dup = fgMakeMultiUse(op2ToDup);
21292
21292
21293
- if (!varTypeIsArithmetic(op1Dup))
21294
- {
21295
- op1Dup = gtNewSimdGetElementNode(TYP_LONG, op1Dup, gtNewIconNode(1), simdBaseJitType, simdSize);
21296
- }
21293
+ assert(!varTypeIsArithmetic(op1Dup));
21294
+ op1Dup = gtNewSimdGetElementNode(TYP_LONG, op1Dup, gtNewIconNode(1), simdBaseJitType, simdSize);
21297
21295
21298
21296
if (!varTypeIsArithmetic(op2Dup))
21299
21297
{
0 commit comments