mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 11:49:50 +00:00
[Hexagon] Use VSPLAT instead of COMBINE for vectors of type v2i32, NFC
This cleans up the vector shift patterns. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307935 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
35b282e0ac
commit
47999fef49
@ -1286,16 +1286,6 @@ HexagonTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const {
|
||||
MachinePointerInfo(SV));
|
||||
}
|
||||
|
||||
// Creates a SPLAT instruction for a constant value VAL.
|
||||
static SDValue createSplat(SelectionDAG &DAG, const SDLoc &dl, EVT VT,
|
||||
SDValue Val) {
|
||||
EVT T = VT.getVectorElementType();
|
||||
if (T == MVT::i8 || T == MVT::i16)
|
||||
return DAG.getNode(HexagonISD::VSPLAT, dl, VT, Val);
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
static bool isSExtFree(SDValue N) {
|
||||
// A sign-extend of a truncate of a sign-extend is free.
|
||||
if (N.getOpcode() == ISD::TRUNCATE &&
|
||||
@ -2394,7 +2384,7 @@ HexagonTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG)
|
||||
|
||||
// Test if V1 is a SCALAR_TO_VECTOR.
|
||||
if (Lane == 0 && V1.getOpcode() == ISD::SCALAR_TO_VECTOR)
|
||||
return createSplat(DAG, dl, VT, V1.getOperand(0));
|
||||
return DAG.getNode(HexagonISD::VSPLAT, dl, VT, V1.getOperand(0));
|
||||
|
||||
// Test if V1 is a BUILD_VECTOR which is equivalent to a SCALAR_TO_VECTOR
|
||||
// (and probably will turn into a SCALAR_TO_VECTOR once legalization
|
||||
@ -2409,9 +2399,10 @@ HexagonTargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG)
|
||||
}
|
||||
}
|
||||
if (IsScalarToVector)
|
||||
return createSplat(DAG, dl, VT, V1.getOperand(0));
|
||||
return DAG.getNode(HexagonISD::VSPLAT, dl, VT, V1.getOperand(0));
|
||||
}
|
||||
return createSplat(DAG, dl, VT, DAG.getConstant(Lane, dl, MVT::i32));
|
||||
return DAG.getNode(HexagonISD::VSPLAT, dl, VT,
|
||||
DAG.getConstant(Lane, dl, MVT::i32));
|
||||
}
|
||||
|
||||
if (UseHVX) {
|
||||
@ -2531,19 +2522,26 @@ HexagonTargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const {
|
||||
if (Size > 64)
|
||||
return SDValue();
|
||||
|
||||
APInt APSplatBits, APSplatUndef;
|
||||
unsigned SplatBitSize;
|
||||
bool HasAnyUndefs;
|
||||
unsigned NElts = BVN->getNumOperands();
|
||||
|
||||
// Try to generate a SPLAT instruction.
|
||||
if ((VT.getSimpleVT() == MVT::v4i8 || VT.getSimpleVT() == MVT::v4i16) &&
|
||||
(BVN->isConstantSplat(APSplatBits, APSplatUndef, SplatBitSize,
|
||||
HasAnyUndefs, 0, true) && SplatBitSize <= 16)) {
|
||||
unsigned SplatBits = APSplatBits.getZExtValue();
|
||||
int32_t SextVal = ((int32_t) (SplatBits << (32 - SplatBitSize)) >>
|
||||
(32 - SplatBitSize));
|
||||
return createSplat(DAG, dl, VT, DAG.getConstant(SextVal, dl, MVT::i32));
|
||||
if (VT == MVT::v4i8 || VT == MVT::v4i16 || VT == MVT::v2i32) {
|
||||
APInt APSplatBits, APSplatUndef;
|
||||
unsigned SplatBitSize;
|
||||
bool HasAnyUndefs;
|
||||
if (BVN->isConstantSplat(APSplatBits, APSplatUndef, SplatBitSize,
|
||||
HasAnyUndefs, 0, false)) {
|
||||
if (SplatBitSize == VT.getVectorElementType().getSizeInBits()) {
|
||||
unsigned ZV = APSplatBits.getZExtValue();
|
||||
assert(SplatBitSize <= 32 && "Can only handle up to i32");
|
||||
// Sign-extend the splat value from SplatBitSize to 32.
|
||||
int32_t SV = SplatBitSize < 32
|
||||
? int32_t(ZV << (32-SplatBitSize)) >> (32-SplatBitSize)
|
||||
: int32_t(ZV);
|
||||
return DAG.getNode(HexagonISD::VSPLAT, dl, VT,
|
||||
DAG.getConstant(SV, dl, MVT::i32));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Try to generate COMBINE to build v2i32 vectors.
|
||||
|
@ -3073,6 +3073,10 @@ def: Pat<(v4i8 (HexagonVSPLAT I32:$Rs)), (S2_vsplatrb I32:$Rs)>;
|
||||
// four halfwords of 64-bits destination register.
|
||||
def: Pat<(v4i16 (HexagonVSPLAT I32:$Rs)), (S2_vsplatrh I32:$Rs)>;
|
||||
|
||||
def: Pat<(v2i32 (HexagonVSPLAT s8_0ImmPred:$s8)),
|
||||
(A2_combineii imm:$s8, imm:$s8)>;
|
||||
def: Pat<(v2i32 (HexagonVSPLAT I32:$Rs)), (A2_combinew I32:$Rs, I32:$Rs)>;
|
||||
|
||||
|
||||
class VArith_pat <InstHexagon MI, SDNode Op, PatFrag Type>
|
||||
: Pat <(Op Type:$Rss, Type:$Rtt),
|
||||
@ -3099,14 +3103,11 @@ def: VArith_pat <A2_xorp, xor, V8I8>;
|
||||
def: VArith_pat <A2_xorp, xor, V4I16>;
|
||||
def: VArith_pat <A2_xorp, xor, V2I32>;
|
||||
|
||||
def: Pat<(v2i32 (sra V2I32:$b, (i64 (HexagonCOMBINE (i32 u5_0ImmPred:$c),
|
||||
(i32 u5_0ImmPred:$c))))),
|
||||
def: Pat<(v2i32 (sra V2I32:$b, (v2i32 (HexagonVSPLAT u5_0ImmPred:$c)))),
|
||||
(S2_asr_i_vw V2I32:$b, imm:$c)>;
|
||||
def: Pat<(v2i32 (srl V2I32:$b, (i64 (HexagonCOMBINE (i32 u5_0ImmPred:$c),
|
||||
(i32 u5_0ImmPred:$c))))),
|
||||
def: Pat<(v2i32 (srl V2I32:$b, (v2i32 (HexagonVSPLAT u5_0ImmPred:$c)))),
|
||||
(S2_lsr_i_vw V2I32:$b, imm:$c)>;
|
||||
def: Pat<(v2i32 (shl V2I32:$b, (i64 (HexagonCOMBINE (i32 u5_0ImmPred:$c),
|
||||
(i32 u5_0ImmPred:$c))))),
|
||||
def: Pat<(v2i32 (shl V2I32:$b, (v2i32 (HexagonVSPLAT u5_0ImmPred:$c)))),
|
||||
(S2_asl_i_vw V2I32:$b, imm:$c)>;
|
||||
|
||||
def: Pat<(v4i16 (sra V4I16:$b, (v4i16 (HexagonVSPLAT u4_0ImmPred:$c)))),
|
||||
|
Loading…
Reference in New Issue
Block a user