forked from OSchip/llvm-project
[AArch64 NEON] Get instruction BSL matched to VSELECT.
llvm-svn: 196998
This commit is contained in:
parent
1b5184321d
commit
310b6c08ba
|
@ -941,8 +941,6 @@ const char *AArch64TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
|||
case AArch64ISD::WrapperLarge: return "AArch64ISD::WrapperLarge";
|
||||
case AArch64ISD::WrapperSmall: return "AArch64ISD::WrapperSmall";
|
||||
|
||||
case AArch64ISD::NEON_BSL:
|
||||
return "AArch64ISD::NEON_BSL";
|
||||
case AArch64ISD::NEON_MOVIMM:
|
||||
return "AArch64ISD::NEON_MOVIMM";
|
||||
case AArch64ISD::NEON_MVNIMM:
|
||||
|
@ -3434,12 +3432,9 @@ static SDValue PerformORCombine(SDNode *N,
|
|||
if (BVN1 && BVN1->isConstantSplat(SplatBits1, SplatUndef, SplatBitSize,
|
||||
HasAnyUndefs) &&
|
||||
!HasAnyUndefs && SplatBits0 == ~SplatBits1) {
|
||||
// Canonicalize the vector type to make instruction selection simpler.
|
||||
EVT CanonicalVT = VT.is128BitVector() ? MVT::v16i8 : MVT::v8i8;
|
||||
SDValue Result = DAG.getNode(AArch64ISD::NEON_BSL, DL, CanonicalVT,
|
||||
N0->getOperand(1), N0->getOperand(0),
|
||||
N1->getOperand(0));
|
||||
return DAG.getNode(ISD::BITCAST, DL, VT, Result);
|
||||
|
||||
return DAG.getNode(ISD::VSELECT, DL, VT, N0->getOperand(1),
|
||||
N0->getOperand(0), N1->getOperand(0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -113,9 +113,6 @@ namespace AArch64ISD {
|
|||
// get selected.
|
||||
WrapperSmall,
|
||||
|
||||
// Vector bitwise select
|
||||
NEON_BSL,
|
||||
|
||||
// Vector move immediate
|
||||
NEON_MOVIMM,
|
||||
|
||||
|
|
|
@ -14,9 +14,6 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
// NEON-specific DAG Nodes.
|
||||
//===----------------------------------------------------------------------===//
|
||||
def Neon_bsl : SDNode<"AArch64ISD::NEON_BSL", SDTypeProfile<1, 3,
|
||||
[SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
|
||||
SDTCisSameAs<0, 3>]>>;
|
||||
|
||||
// (outs Result), (ins Imm, OpCmode)
|
||||
def SDT_Neon_movi : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVT<1, i32>]>;
|
||||
|
@ -407,26 +404,30 @@ defm : Neon_bitwise2V_patterns<Neon_orn8B, Neon_orn16B, ORNvvv_8B, ORNvvv_16B>;
|
|||
|
||||
// Vector Bitwise Select
|
||||
def BSLvvv_8B : NeonI_3VSame_Constraint_impl<"bsl", ".8b", VPR64, v8i8,
|
||||
0b0, 0b1, 0b01, 0b00011, Neon_bsl>;
|
||||
0b0, 0b1, 0b01, 0b00011, vselect>;
|
||||
|
||||
def BSLvvv_16B : NeonI_3VSame_Constraint_impl<"bsl", ".16b", VPR128, v16i8,
|
||||
0b1, 0b1, 0b01, 0b00011, Neon_bsl>;
|
||||
0b1, 0b1, 0b01, 0b00011, vselect>;
|
||||
|
||||
multiclass Neon_bitwise3V_patterns<SDPatternOperator opnode,
|
||||
Instruction INST8B,
|
||||
Instruction INST16B> {
|
||||
// Disassociate type from instruction definition
|
||||
def : Pat<(v2i32 (opnode VPR64:$src,VPR64:$Rn, VPR64:$Rm)),
|
||||
def : Pat<(v8i8 (opnode (v8i8 VPR64:$src), VPR64:$Rn, VPR64:$Rm)),
|
||||
(INST8B VPR64:$src, VPR64:$Rn, VPR64:$Rm)>;
|
||||
def : Pat<(v4i16 (opnode VPR64:$src, VPR64:$Rn, VPR64:$Rm)),
|
||||
def : Pat<(v2i32 (opnode (v2i32 VPR64:$src), VPR64:$Rn, VPR64:$Rm)),
|
||||
(INST8B VPR64:$src, VPR64:$Rn, VPR64:$Rm)>;
|
||||
def : Pat<(v1i64 (opnode VPR64:$src, VPR64:$Rn, VPR64:$Rm)),
|
||||
def : Pat<(v4i16 (opnode (v4i16 VPR64:$src), VPR64:$Rn, VPR64:$Rm)),
|
||||
(INST8B VPR64:$src, VPR64:$Rn, VPR64:$Rm)>;
|
||||
def : Pat<(v4i32 (opnode VPR128:$src, VPR128:$Rn, VPR128:$Rm)),
|
||||
def : Pat<(v1i64 (opnode (v1i64 VPR64:$src), VPR64:$Rn, VPR64:$Rm)),
|
||||
(INST8B VPR64:$src, VPR64:$Rn, VPR64:$Rm)>;
|
||||
def : Pat<(v16i8 (opnode (v16i8 VPR128:$src), VPR128:$Rn, VPR128:$Rm)),
|
||||
(INST16B VPR128:$src, VPR128:$Rn, VPR128:$Rm)>;
|
||||
def : Pat<(v8i16 (opnode VPR128:$src, VPR128:$Rn, VPR128:$Rm)),
|
||||
def : Pat<(v4i32 (opnode (v4i32 VPR128:$src), VPR128:$Rn, VPR128:$Rm)),
|
||||
(INST16B VPR128:$src, VPR128:$Rn, VPR128:$Rm)>;
|
||||
def : Pat<(v2i64 (opnode VPR128:$src, VPR128:$Rn, VPR128:$Rm)),
|
||||
def : Pat<(v8i16 (opnode (v8i16 VPR128:$src), VPR128:$Rn, VPR128:$Rm)),
|
||||
(INST16B VPR128:$src, VPR128:$Rn, VPR128:$Rm)>;
|
||||
def : Pat<(v2i64 (opnode (v2i64 VPR128:$src), VPR128:$Rn, VPR128:$Rm)),
|
||||
(INST16B VPR128:$src, VPR128:$Rn, VPR128:$Rm)>;
|
||||
|
||||
// Allow to match BSL instruction pattern with non-constant operand
|
||||
|
@ -495,10 +496,10 @@ multiclass Neon_bitwise3V_patterns<SDPatternOperator opnode,
|
|||
}
|
||||
|
||||
// Additional patterns for bitwise instruction BSL
|
||||
defm: Neon_bitwise3V_patterns<Neon_bsl, BSLvvv_8B, BSLvvv_16B>;
|
||||
defm: Neon_bitwise3V_patterns<vselect, BSLvvv_8B, BSLvvv_16B>;
|
||||
|
||||
def Neon_NoBSLop : PatFrag<(ops node:$src, node:$Rn, node:$Rm),
|
||||
(Neon_bsl node:$src, node:$Rn, node:$Rm),
|
||||
(vselect node:$src, node:$Rn, node:$Rm),
|
||||
[{ (void)N; return false; }]>;
|
||||
|
||||
// Vector Bitwise Insert if True
|
||||
|
|
Loading…
Reference in New Issue