@@ -1508,43 +1508,41 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
1508
1508
+- t1
1509
1509
t2 = binary logical op2
1510
1510
*/
1511
- GenTree* second = use.User ();
1512
- if (!second ->OperIs (GT_HWINTRINSIC))
1511
+ GenTree* user = use.User ();
1512
+ if (!user ->OperIs (GT_HWINTRINSIC))
1513
1513
{
1514
1514
break ;
1515
1515
}
1516
1516
1517
- bool nestedIsScalar = false ;
1518
- genTreeOps nestedOper = second->AsHWIntrinsic ()->GetOperForHWIntrinsicId (&isScalar);
1517
+ GenTreeHWIntrinsic* userIntrin = user->AsHWIntrinsic ();
1519
1518
1520
- if (nestedOper == GT_NONE)
1521
- {
1522
- // TODO: We should support cases like CNDSEL
1523
- break ;
1524
- }
1519
+ bool userIsScalar = false ;
1520
+ genTreeOps userOper = userIntrin->GetOperForHWIntrinsicId (&isScalar);
1525
1521
1526
- if (nestedIsScalar )
1522
+ if ((userOper != GT_AND) && (userOper != GT_OR) && (userOper != GT_XOR) )
1527
1523
{
1524
+ // TODO: We should support other cases like AND_NOT, CNDSEL, and TernaryLogic
1528
1525
break ;
1529
1526
}
1527
+ assert (!userIsScalar);
1530
1528
1531
- if ((nestedOper != GT_AND) && (nestedOper != GT_OR ) && (nestedOper != GT_XOR ))
1529
+ if ((userOper == GT_AND) && (oper == GT_XOR ) && op2-> IsVectorAllBitsSet ( ))
1532
1530
{
1533
- // TODO: We should support other cases like AND_NOT, NOT, and CNDSEL
1534
- break ;
1531
+ // We have something that will transform to AND_NOT, which we want to
1532
+ // prefer over TernaryLogic or any other transform.
1533
+ return node->gtNext ;
1535
1534
}
1536
1535
1537
- GenTree* op3 = second->AsHWIntrinsic ()->Op (1 ) == node ? second->AsHWIntrinsic ()->Op (2 )
1538
- : second->AsHWIntrinsic ()->Op (1 );
1539
- GenTree* control = comp->gtNewIconNode (node->GetTernaryControlByte (second->AsHWIntrinsic ()));
1536
+ GenTree* op3 = userIntrin->Op (1 ) == node ? userIntrin->Op (2 ) : userIntrin->Op (1 );
1537
+ GenTree* control = comp->gtNewIconNode (node->GetTernaryControlByte (userIntrin));
1540
1538
CorInfoType simdBaseJitType = node->GetSimdBaseJitType ();
1541
1539
unsigned simdSize = node->GetSimdSize ();
1542
1540
var_types simdType = Compiler::getSIMDTypeForSize (simdSize);
1543
1541
GenTree* ternaryNode =
1544
1542
comp->gtNewSimdTernaryLogicNode (simdType, op1, op2, op3, control, simdBaseJitType, simdSize);
1545
- BlockRange ().InsertBefore (second , control, ternaryNode);
1543
+ BlockRange ().InsertBefore (userIntrin , control, ternaryNode);
1546
1544
LIR::Use finalRes;
1547
- if (BlockRange ().TryGetUse (second , &finalRes))
1545
+ if (BlockRange ().TryGetUse (userIntrin , &finalRes))
1548
1546
{
1549
1547
finalRes.ReplaceWith (ternaryNode);
1550
1548
}
@@ -1554,7 +1552,7 @@ GenTree* Lowering::LowerHWIntrinsic(GenTreeHWIntrinsic* node)
1554
1552
}
1555
1553
GenTree* next = node->gtNext ;
1556
1554
BlockRange ().Remove (node);
1557
- BlockRange ().Remove (second );
1555
+ BlockRange ().Remove (userIntrin );
1558
1556
return next;
1559
1557
}
1560
1558
break ;
0 commit comments