@@ -24711,15 +24711,13 @@ GenTree* Compiler::gtNewSimdMinMaxNode(var_types type,
24711
24711
24712
24712
if (isMax)
24713
24713
{
24714
- signMask = gtNewSimdIsPositiveNode(type, gtCloneExpr(op1Dup), simdBaseJitType, simdSize);
24715
- cmpMask = gtNewSimdCmpOpNode(GT_GT, type, gtCloneExpr(absOp1Dup), gtCloneExpr(absOp2Dup),
24716
- simdBaseJitType, simdSize);
24714
+ signMask = gtNewSimdIsPositiveNode(type, op1Dup, simdBaseJitType, simdSize);
24715
+ cmpMask = gtNewSimdCmpOpNode(GT_GT, type, absOp1Dup, absOp2Dup, simdBaseJitType, simdSize);
24717
24716
}
24718
24717
else
24719
24718
{
24720
- signMask = gtNewSimdIsNegativeNode(type, gtCloneExpr(op1Dup), simdBaseJitType, simdSize);
24721
- cmpMask = gtNewSimdCmpOpNode(GT_LT, type, gtCloneExpr(absOp1Dup), gtCloneExpr(absOp2Dup),
24722
- simdBaseJitType, simdSize);
24719
+ signMask = gtNewSimdIsNegativeNode(type, op1Dup, simdBaseJitType, simdSize);
24720
+ cmpMask = gtNewSimdCmpOpNode(GT_LT, type, absOp1Dup, absOp2Dup, simdBaseJitType, simdSize);
24723
24721
}
24724
24722
24725
24723
if (isNumber)
@@ -24737,15 +24735,13 @@ GenTree* Compiler::gtNewSimdMinMaxNode(var_types type,
24737
24735
24738
24736
if (isMax)
24739
24737
{
24740
- signMask = gtNewSimdIsNegativeNode(type, gtCloneExpr(op2Dup), simdBaseJitType, simdSize);
24741
- cmpMask = gtNewSimdCmpOpNode(GT_LT, type, gtCloneExpr(op2Dup), gtCloneExpr(op1Dup), simdBaseJitType,
24742
- simdSize);
24738
+ signMask = gtNewSimdIsNegativeNode(type, op2Dup, simdBaseJitType, simdSize);
24739
+ cmpMask = gtNewSimdCmpOpNode(GT_LT, type, gtCloneExpr(op2Dup), op1Dup, simdBaseJitType, simdSize);
24743
24740
}
24744
24741
else
24745
24742
{
24746
- signMask = gtNewSimdIsNegativeNode(type, gtCloneExpr(op1Dup), simdBaseJitType, simdSize);
24747
- cmpMask = gtNewSimdCmpOpNode(GT_LT, type, gtCloneExpr(op1Dup), gtCloneExpr(op2Dup), simdBaseJitType,
24748
- simdSize);
24743
+ signMask = gtNewSimdIsNegativeNode(type, op1Dup, simdBaseJitType, simdSize);
24744
+ cmpMask = gtNewSimdCmpOpNode(GT_LT, type, gtCloneExpr(op1Dup), op2Dup, simdBaseJitType, simdSize);
24749
24745
}
24750
24746
24751
24747
if (isNumber)
@@ -24756,14 +24752,15 @@ GenTree* Compiler::gtNewSimdMinMaxNode(var_types type,
24756
24752
{
24757
24753
nanMask = gtNewSimdIsNaNNode(type, gtCloneExpr(op1Dup), simdBaseJitType, simdSize);
24758
24754
}
24755
+
24756
+ op2Dup = gtCloneExpr(op2Dup);
24759
24757
}
24760
24758
24761
24759
GenTree* mask = gtNewSimdBinOpNode(GT_AND, type, equalsMask, signMask, simdBaseJitType, simdSize);
24762
24760
mask = gtNewSimdBinOpNode(GT_OR, type, mask, nanMask, simdBaseJitType, simdSize);
24763
24761
mask = gtNewSimdBinOpNode(GT_OR, type, mask, cmpMask, simdBaseJitType, simdSize);
24764
24762
24765
- retNode =
24766
- gtNewSimdCndSelNode(type, mask, gtCloneExpr(op1Dup), gtCloneExpr(op2Dup), simdBaseJitType, simdSize);
24763
+ retNode = gtNewSimdCndSelNode(type, mask, gtCloneExpr(op1Dup), op2Dup, simdBaseJitType, simdSize);
24767
24764
}
24768
24765
assert(retNode != nullptr);
24769
24766
@@ -24773,6 +24770,51 @@ GenTree* Compiler::gtNewSimdMinMaxNode(var_types type,
24773
24770
}
24774
24771
return retNode;
24775
24772
}
24773
+
24774
+ assert(!isScalar);
24775
+
24776
+ if (isMagnitude)
24777
+ {
24778
+ GenTree* op1Dup = fgMakeMultiUse(&op1);
24779
+ GenTree* op2Dup = fgMakeMultiUse(&op2);
24780
+
24781
+ GenTree* absOp1 = gtNewSimdAbsNode(type, op1, simdBaseJitType, simdSize);
24782
+ GenTree* absOp2 = gtNewSimdAbsNode(type, op2, simdBaseJitType, simdSize);
24783
+
24784
+ GenTree* absOp1Dup = fgMakeMultiUse(&absOp1);
24785
+ GenTree* absOp2Dup = fgMakeMultiUse(&absOp2);
24786
+
24787
+ GenTree* equalsMask = gtNewSimdCmpOpNode(GT_EQ, type, absOp1, absOp2, simdBaseJitType, simdSize);
24788
+ ;
24789
+ GenTree* signMask1 = nullptr;
24790
+ GenTree* signMask2 = nullptr;
24791
+ GenTree* signMask3 = nullptr;
24792
+ GenTree* cmpMask = nullptr;
24793
+
24794
+ if (isMax)
24795
+ {
24796
+ signMask1 = gtNewSimdIsNegativeNode(type, op2Dup, simdBaseJitType, simdSize);
24797
+ signMask2 = gtNewSimdIsPositiveNode(type, absOp2Dup, simdBaseJitType, simdSize);
24798
+ signMask3 = gtNewSimdIsNegativeNode(type, absOp1Dup, simdBaseJitType, simdSize);
24799
+ cmpMask = gtNewSimdCmpOpNode(GT_GT, type, gtCloneExpr(absOp1Dup), gtCloneExpr(absOp2Dup), simdBaseJitType,
24800
+ simdSize);
24801
+ }
24802
+ else
24803
+ {
24804
+ signMask1 = gtNewSimdIsNegativeNode(type, op1Dup, simdBaseJitType, simdSize);
24805
+ signMask2 = gtNewSimdIsPositiveNode(type, absOp1Dup, simdBaseJitType, simdSize);
24806
+ signMask3 = gtNewSimdIsNegativeNode(type, absOp2Dup, simdBaseJitType, simdSize);
24807
+ cmpMask = gtNewSimdCmpOpNode(GT_LT, type, gtCloneExpr(absOp1Dup), gtCloneExpr(absOp2Dup), simdBaseJitType,
24808
+ simdSize);
24809
+ }
24810
+
24811
+ GenTree* mask1 = gtNewSimdBinOpNode(GT_AND, type, equalsMask, signMask1, simdBaseJitType, simdSize);
24812
+ GenTree* mask2 = gtNewSimdBinOpNode(GT_AND, type, cmpMask, signMask2, simdBaseJitType, simdSize);
24813
+ GenTree* mask3 = gtNewSimdBinOpNode(GT_OR, type, mask1, mask2, simdBaseJitType, simdSize);
24814
+ mask3 = gtNewSimdBinOpNode(GT_OR, type, mask3, signMask3, simdBaseJitType, simdSize);
24815
+
24816
+ return gtNewSimdCndSelNode(type, mask3, gtCloneExpr(op1Dup), gtCloneExpr(op2Dup), simdBaseJitType, simdSize);
24817
+ }
24776
24818
return gtNewSimdMinMaxNativeNode(type, op1, op2, simdBaseJitType, simdSize, isMax);
24777
24819
}
24778
24820
0 commit comments