forked from OSchip/llvm-project
[ARM] Factor out two-result shuffle matching. NFCI.
In preparation for a future patch: makes it easier to do the same matching to generate different nodes, without duplication. llvm-svn: 240116
This commit is contained in:
parent
04dca77460
commit
2ffa91f908
|
@ -5063,6 +5063,30 @@ static bool isVZIP_v_undef_Mask(ArrayRef<int> M, EVT VT, unsigned &WhichResult){
|
|||
return true;
|
||||
}
|
||||
|
||||
/// Check if \p ShuffleMask is a NEON two-result shuffle (VZIP, VUZP, VTRN),
|
||||
/// and return the corresponding ARMISD opcode if it is, or 0 if it isn't.
|
||||
static unsigned isNEONTwoResultShuffleMask(ArrayRef<int> ShuffleMask, EVT VT,
|
||||
unsigned &WhichResult,
|
||||
bool &isV_UNDEF) {
|
||||
isV_UNDEF = false;
|
||||
if (isVTRNMask(ShuffleMask, VT, WhichResult))
|
||||
return ARMISD::VTRN;
|
||||
if (isVUZPMask(ShuffleMask, VT, WhichResult))
|
||||
return ARMISD::VUZP;
|
||||
if (isVZIPMask(ShuffleMask, VT, WhichResult))
|
||||
return ARMISD::VZIP;
|
||||
|
||||
isV_UNDEF = true;
|
||||
if (isVTRN_v_undef_Mask(ShuffleMask, VT, WhichResult))
|
||||
return ARMISD::VTRN;
|
||||
if (isVUZP_v_undef_Mask(ShuffleMask, VT, WhichResult))
|
||||
return ARMISD::VUZP;
|
||||
if (isVZIP_v_undef_Mask(ShuffleMask, VT, WhichResult))
|
||||
return ARMISD::VZIP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// \return true if this is a reverse operation on an vector.
|
||||
static bool isReverseMask(ArrayRef<int> M, EVT VT) {
|
||||
unsigned NumElts = VT.getVectorNumElements();
|
||||
|
@ -5479,7 +5503,7 @@ ARMTargetLowering::isShuffleMaskLegal(const SmallVectorImpl<int> &M,
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ReverseVEXT;
|
||||
bool ReverseVEXT, isV_UNDEF;
|
||||
unsigned Imm, WhichResult;
|
||||
|
||||
unsigned EltSize = VT.getVectorElementType().getSizeInBits();
|
||||
|
@ -5490,12 +5514,7 @@ ARMTargetLowering::isShuffleMaskLegal(const SmallVectorImpl<int> &M,
|
|||
isVREVMask(M, VT, 16) ||
|
||||
isVEXTMask(M, VT, ReverseVEXT, Imm) ||
|
||||
isVTBLMask(M, VT) ||
|
||||
isVTRNMask(M, VT, WhichResult) ||
|
||||
isVUZPMask(M, VT, WhichResult) ||
|
||||
isVZIPMask(M, VT, WhichResult) ||
|
||||
isVTRN_v_undef_Mask(M, VT, WhichResult) ||
|
||||
isVUZP_v_undef_Mask(M, VT, WhichResult) ||
|
||||
isVZIP_v_undef_Mask(M, VT, WhichResult) ||
|
||||
isNEONTwoResultShuffleMask(M, VT, WhichResult, isV_UNDEF) ||
|
||||
((VT == MVT::v8i16 || VT == MVT::v16i8) && isReverseMask(M, VT)));
|
||||
}
|
||||
|
||||
|
@ -5687,25 +5706,15 @@ static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) {
|
|||
// these operations, DAG memoization will ensure that a single node is
|
||||
// used for both shuffles.
|
||||
unsigned WhichResult;
|
||||
if (isVTRNMask(ShuffleMask, VT, WhichResult))
|
||||
return DAG.getNode(ARMISD::VTRN, dl, DAG.getVTList(VT, VT),
|
||||
V1, V2).getValue(WhichResult);
|
||||
if (isVUZPMask(ShuffleMask, VT, WhichResult))
|
||||
return DAG.getNode(ARMISD::VUZP, dl, DAG.getVTList(VT, VT),
|
||||
V1, V2).getValue(WhichResult);
|
||||
if (isVZIPMask(ShuffleMask, VT, WhichResult))
|
||||
return DAG.getNode(ARMISD::VZIP, dl, DAG.getVTList(VT, VT),
|
||||
V1, V2).getValue(WhichResult);
|
||||
bool isV_UNDEF;
|
||||
if (unsigned ShuffleOpc = isNEONTwoResultShuffleMask(
|
||||
ShuffleMask, VT, WhichResult, isV_UNDEF)) {
|
||||
if (isV_UNDEF)
|
||||
V2 = V1;
|
||||
return DAG.getNode(ShuffleOpc, dl, DAG.getVTList(VT, VT), V1, V2)
|
||||
.getValue(WhichResult);
|
||||
}
|
||||
|
||||
if (isVTRN_v_undef_Mask(ShuffleMask, VT, WhichResult))
|
||||
return DAG.getNode(ARMISD::VTRN, dl, DAG.getVTList(VT, VT),
|
||||
V1, V1).getValue(WhichResult);
|
||||
if (isVUZP_v_undef_Mask(ShuffleMask, VT, WhichResult))
|
||||
return DAG.getNode(ARMISD::VUZP, dl, DAG.getVTList(VT, VT),
|
||||
V1, V1).getValue(WhichResult);
|
||||
if (isVZIP_v_undef_Mask(ShuffleMask, VT, WhichResult))
|
||||
return DAG.getNode(ARMISD::VZIP, dl, DAG.getVTList(VT, VT),
|
||||
V1, V1).getValue(WhichResult);
|
||||
}
|
||||
|
||||
// If the shuffle is not directly supported and it has 4 elements, use
|
||||
|
|
Loading…
Reference in New Issue