@@ -682,8 +682,8 @@ TR_VectorAPIExpansion::validateSymRef(int32_t id, int32_t i, vec_sz_t &classLeng
682
682
methodType != classType)
683
683
{
684
684
if (_trace)
685
- traceMsg (comp (), " %s invalidating6 class #%d due to symref #%d method type %d , seen type %d \n " ,
686
- OPT_DETAILS_VECTOR, id, i, ( int ) methodType, ( int ) classType);
685
+ traceMsg (comp (), " %s invalidating6 class #%d due to symref #%d method type %s , seen type %s \n " ,
686
+ OPT_DETAILS_VECTOR, id, i, TR::DataType::getName ( methodType), TR::DataType::getName ( classType) );
687
687
return false ;
688
688
}
689
689
}
@@ -1602,6 +1602,14 @@ TR::Node *TR_VectorAPIExpansion::binaryIntrinsicHandler(TR_VectorAPIExpansion *o
1602
1602
return naryIntrinsicHandler (opt, treeTop, node, elementType, vectorLength, numLanes, mode, 2 , Other);
1603
1603
}
1604
1604
1605
+ TR::Node *TR_VectorAPIExpansion::maskReductionCoercedIntrinsicHandler (TR_VectorAPIExpansion *opt, TR::TreeTop *treeTop, TR::Node *node,
1606
+ TR::DataType elementType, TR::VectorLength vectorLength, int32_t numLanes,
1607
+ handlerMode mode)
1608
+ {
1609
+ return naryIntrinsicHandler (opt, treeTop, node, elementType, vectorLength, numLanes, mode, 1 , MaskReduction);
1610
+ }
1611
+
1612
+
1605
1613
TR::Node *TR_VectorAPIExpansion::reductionCoercedIntrinsicHandler (TR_VectorAPIExpansion *opt, TR::TreeTop *treeTop, TR::Node *node,
1606
1614
TR::DataType elementType, TR::VectorLength vectorLength, int32_t numLanes,
1607
1615
handlerMode mode)
@@ -1633,11 +1641,16 @@ TR::Node *TR_VectorAPIExpansion::naryIntrinsicHandler(TR_VectorAPIExpansion *opt
1633
1641
TR::Node *opcodeNode = node->getFirstChild ();
1634
1642
int firstOperand = 5 ;
1635
1643
1636
- if (opCodeType == Test)
1644
+ if (opCodeType == Test || opCodeType == MaskReduction )
1637
1645
firstOperand = 4 ;
1638
1646
1639
- TR::Node *maskNode = node->getChild (firstOperand + numChildren); // each intrinsic has a mask argument
1640
- bool withMask = !maskNode->isConstZeroValue ();
1647
+ bool withMask = false ;
1648
+
1649
+ if (opCodeType != MaskReduction)
1650
+ {
1651
+ TR::Node *maskNode = node->getChild (firstOperand + numChildren); // each intrinsic has a mask argument
1652
+ withMask = !maskNode->isConstZeroValue ();
1653
+ }
1641
1654
1642
1655
if (withMask) numChildren++;
1643
1656
@@ -1758,12 +1771,27 @@ TR::Node *TR_VectorAPIExpansion::fromBitsCoercedIntrinsicHandler(TR_VectorAPIExp
1758
1771
{
1759
1772
TR::Compilation *comp = opt->comp ();
1760
1773
1774
+ TR::Node *broadcastTypeNode = node->getChild (4 );
1775
+
1776
+ if (!broadcastTypeNode->getOpCode ().isLoadConst ())
1777
+ {
1778
+ if (opt->_trace ) traceMsg (comp, " Unknown broadcast type in node %p\n " , node);
1779
+ return NULL ;
1780
+ }
1781
+
1782
+ int32_t broadcastType = broadcastTypeNode->get32bitIntegralValue ();
1783
+
1784
+ TR_ASSERT_FATAL (broadcastType == MODE_BROADCAST || broadcastType == MODE_BITS_COERCED_LONG_TO_MASK,
1785
+ " Unexpected broadcast type in node %p\n " , node);
1786
+
1787
+ bool mask = (broadcastType == MODE_BITS_COERCED_LONG_TO_MASK);
1788
+
1761
1789
if (mode == checkScalarization)
1762
- return node;
1790
+ return mask ? NULL : node;
1763
1791
1764
1792
if (mode == checkVectorization)
1765
1793
{
1766
- TR::ILOpCodes splatsOpCode = TR::ILOpCode::createVectorOpCode (TR::vsplats,
1794
+ TR::ILOpCodes splatsOpCode = TR::ILOpCode::createVectorOpCode (mask ? TR:: mLongBitsToMask : TR::vsplats,
1767
1795
TR::DataType::createVectorType (elementType, vectorLength));
1768
1796
1769
1797
if (!comp->cg ()->getSupportsOpCodeForAutoSIMD (splatsOpCode))
@@ -1829,7 +1857,7 @@ TR::Node *TR_VectorAPIExpansion::fromBitsCoercedIntrinsicHandler(TR_VectorAPIExp
1829
1857
{
1830
1858
node->setAndIncChild (0 , newNode);
1831
1859
node->setNumChildren (1 );
1832
- TR::ILOpCodes splatsOpCode = TR::ILOpCode::createVectorOpCode (TR::vsplats,
1860
+ TR::ILOpCodes splatsOpCode = TR::ILOpCode::createVectorOpCode (mask ? TR:: mLongBitsToMask : TR::vsplats,
1833
1861
TR::DataType::createVectorType (elementType, vectorLength));
1834
1862
1835
1863
TR::Node::recreate (node, splatsOpCode);
@@ -1926,7 +1954,7 @@ TR::ILOpCodes TR_VectorAPIExpansion::ILOpcodeFromVectorAPIOpcode(int32_t vectorA
1926
1954
case VECTOR_OP_MIN: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::vreductionMin, vectorType);
1927
1955
case VECTOR_OP_MAX: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::vreductionMax, vectorType);
1928
1956
case VECTOR_OP_AND: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::vreductionAnd, vectorType);
1929
- case VECTOR_OP_OR: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::vreductionOr, vectorType);
1957
+ case VECTOR_OP_OR: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::vreductionOr, vectorType);
1930
1958
case VECTOR_OP_XOR: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::vreductionXor, vectorType);
1931
1959
// These don't seem to be generated by the library:
1932
1960
// vreductionOrUnchecked
@@ -1935,6 +1963,18 @@ TR::ILOpCodes TR_VectorAPIExpansion::ILOpcodeFromVectorAPIOpcode(int32_t vectorA
1935
1963
return TR::BadILOp;
1936
1964
}
1937
1965
}
1966
+ else if (opCodeType == MaskReduction)
1967
+ {
1968
+ switch (vectorAPIOpCode)
1969
+ {
1970
+ case VECTOR_OP_MASK_TRUECOUNT: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::mTrueCount , vectorType);
1971
+ case VECTOR_OP_MASK_FIRSTTRUE: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::mFirstTrue , vectorType);
1972
+ case VECTOR_OP_MASK_LASTTRUE: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::mLastTrue , vectorType);
1973
+ case VECTOR_OP_MASK_TOLONG: return scalar ? TR::BadILOp : TR::ILOpCode::createVectorOpCode (TR::mToLongBits , vectorType);
1974
+ default :
1975
+ return TR::BadILOp;
1976
+ }
1977
+ }
1938
1978
else if (withMask)
1939
1979
{
1940
1980
switch (vectorAPIOpCode)
@@ -2113,16 +2153,17 @@ TR::Node *TR_VectorAPIExpansion::transformNary(TR_VectorAPIExpansion *opt, TR::T
2113
2153
TR_VectorAPIExpansion::methodTableEntry
2114
2154
TR_VectorAPIExpansion::methodTable[] =
2115
2155
{
2116
- {loadIntrinsicHandler, Unknown, {Unknown, ElementType, NumLanes}}, // jdk_internal_vm_vector_VectorSupport_load
2117
- {storeIntrinsicHandler, Unknown, {Unknown, ElementType, NumLanes, Unknown, Unknown, Vector}}, // jdk_internal_vm_vector_VectorSupport_store
2118
- {binaryIntrinsicHandler, Vector, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_binaryOp
2119
- {blendIntrinsicHandler, Vector, {Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Vector, Unknown}}, // jdk_internal_vm_vector_VectorSupport_blend
2120
- {compareIntrinsicHandler, Mask, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_compare
2121
- {fromBitsCoercedIntrinsicHandler, Vector, {Unknown, ElementType, NumLanes, Unknown, Unknown, Unknown}}, // jdk_internal_vm_vector_VectorSupport_fromBitsCoerced
2122
- {reductionCoercedIntrinsicHandler, Scalar, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_reductionCoerced
2123
- {ternaryIntrinsicHandler, Vector, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_ternaryOp
2124
- {testIntrinsicHandler, Scalar, {Unknown, Unknown, ElementType, NumLanes, Mask, Mask, Unknown}}, // jdk_internal_vm_vector_VectorSupport_test
2125
- {unaryIntrinsicHandler, Vector, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_unaryOp
2156
+ {loadIntrinsicHandler, Unknown, {Unknown, ElementType, NumLanes}}, // jdk_internal_vm_vector_VectorSupport_load
2157
+ {storeIntrinsicHandler, Unknown, {Unknown, ElementType, NumLanes, Unknown, Unknown, Vector}}, // jdk_internal_vm_vector_VectorSupport_store
2158
+ {binaryIntrinsicHandler, Vector, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_binaryOp
2159
+ {blendIntrinsicHandler, Vector, {Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Vector, Unknown}}, // jdk_internal_vm_vector_VectorSupport_blend
2160
+ {compareIntrinsicHandler, Mask, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_compare
2161
+ {fromBitsCoercedIntrinsicHandler, Vector, {Unknown, ElementType, NumLanes, Unknown, Unknown, Unknown}}, // jdk_internal_vm_vector_VectorSupport_fromBitsCoerced
2162
+ {maskReductionCoercedIntrinsicHandler, Scalar, {Unknown, Unknown, ElementType, NumLanes, Mask}}, // jdk_internal_vm_vector_VectorSupport_maskReductionCoerced
2163
+ {reductionCoercedIntrinsicHandler, Scalar, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_reductionCoerced
2164
+ {ternaryIntrinsicHandler, Vector, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Vector, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_ternaryOp
2165
+ {testIntrinsicHandler, Scalar, {Unknown, Unknown, ElementType, NumLanes, Mask, Mask, Unknown}}, // jdk_internal_vm_vector_VectorSupport_test
2166
+ {unaryIntrinsicHandler, Vector, {Unknown, Unknown, Unknown, ElementType, NumLanes, Vector, Mask}}, // jdk_internal_vm_vector_VectorSupport_unaryOp
2126
2167
};
2127
2168
2128
2169
0 commit comments