mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +00:00
Implement feedback from Bruno on making pblendvb an x86-specific ISD node in addition to being an intrinsic, and convert
lowering to use it. Hopefully the pattern fragment is doing the right thing with XMM0, looks correct in testing. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122277 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d5fe3efde3
commit
672fb6225b
@ -8398,9 +8398,7 @@ SDValue X86TargetLowering::LowerSHL(SDValue Op, SelectionDAG &DAG) const {
|
||||
M = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
|
||||
DAG.getConstant(Intrinsic::x86_sse2_pslli_w, MVT::i32), M,
|
||||
DAG.getConstant(4, MVT::i32));
|
||||
R = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
|
||||
DAG.getConstant(Intrinsic::x86_sse41_pblendvb, MVT::i32),
|
||||
R, M, Op);
|
||||
R = DAG.getNode(X86ISD::PBLENDVB, dl, VT, R, M, Op);
|
||||
// a += a
|
||||
Op = DAG.getNode(ISD::ADD, dl, VT, Op, Op);
|
||||
|
||||
@ -8415,15 +8413,12 @@ SDValue X86TargetLowering::LowerSHL(SDValue Op, SelectionDAG &DAG) const {
|
||||
M = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
|
||||
DAG.getConstant(Intrinsic::x86_sse2_pslli_w, MVT::i32), M,
|
||||
DAG.getConstant(2, MVT::i32));
|
||||
R = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
|
||||
DAG.getConstant(Intrinsic::x86_sse41_pblendvb, MVT::i32),
|
||||
R, M, Op);
|
||||
R = DAG.getNode(X86ISD::PBLENDVB, dl, VT, R, M, Op);
|
||||
// a += a
|
||||
Op = DAG.getNode(ISD::ADD, dl, VT, Op, Op);
|
||||
|
||||
// return pblendv(r, r+r, a);
|
||||
R = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, dl, VT,
|
||||
DAG.getConstant(Intrinsic::x86_sse41_pblendvb, MVT::i32),
|
||||
R = DAG.getNode(X86ISD::PBLENDVB, dl, VT,
|
||||
R, DAG.getNode(ISD::ADD, dl, VT, R, R), Op);
|
||||
return R;
|
||||
}
|
||||
@ -8897,6 +8892,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
case X86ISD::PSIGNB: return "X86ISD::PSIGNB";
|
||||
case X86ISD::PSIGNW: return "X86ISD::PSIGNW";
|
||||
case X86ISD::PSIGND: return "X86ISD::PSIGND";
|
||||
case X86ISD::PBLENDVB: return "X86ISD::PBLENDVB";
|
||||
case X86ISD::FMAX: return "X86ISD::FMAX";
|
||||
case X86ISD::FMIN: return "X86ISD::FMIN";
|
||||
case X86ISD::FRSQRT: return "X86ISD::FRSQRT";
|
||||
@ -11209,12 +11205,10 @@ static SDValue PerformOrCombine(SDNode *N, SelectionDAG &DAG,
|
||||
if (!Subtarget->hasSSE41())
|
||||
return SDValue();
|
||||
|
||||
unsigned IID = Intrinsic::x86_sse41_pblendvb;
|
||||
X = DAG.getNode(ISD::BITCAST, DL, MVT::v16i8, X);
|
||||
Y = DAG.getNode(ISD::BITCAST, DL, MVT::v16i8, Y);
|
||||
Mask = DAG.getNode(ISD::BITCAST, DL, MVT::v16i8, Mask);
|
||||
Mask = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, MVT::v16i8,
|
||||
DAG.getConstant(IID, MVT::i32), X, Y, Mask);
|
||||
Mask = DAG.getNode(X86ISD::PBLENDVB, DL, MVT::v16i8, X, Y, Mask);
|
||||
return DAG.getNode(ISD::BITCAST, DL, MVT::v2i64, Mask);
|
||||
}
|
||||
}
|
||||
|
@ -166,6 +166,9 @@ namespace llvm {
|
||||
/// PSIGNB/W/D - Copy integer sign.
|
||||
PSIGNB, PSIGNW, PSIGND,
|
||||
|
||||
/// PBLENDVB - Variable blend
|
||||
PBLENDVB,
|
||||
|
||||
/// FMAX, FMIN - Floating point max and min.
|
||||
///
|
||||
FMAX, FMIN,
|
||||
|
@ -55,6 +55,9 @@ def X86psignw : SDNode<"X86ISD::PSIGNW",
|
||||
def X86psignd : SDNode<"X86ISD::PSIGND",
|
||||
SDTypeProfile<1, 2, [SDTCisVT<0, v4i32>, SDTCisSameAs<0,1>,
|
||||
SDTCisSameAs<0,2>]>>;
|
||||
def X86pblendv : SDNode<"X86ISD::PBLENDVB",
|
||||
SDTypeProfile<1, 3, [SDTCisVT<0, v16i8>, SDTCisSameAs<0,1>,
|
||||
SDTCisSameAs<0,2>, SDTCisSameAs<0,3>]>>;
|
||||
def X86pextrb : SDNode<"X86ISD::PEXTRB",
|
||||
SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisPtrTy<2>]>>;
|
||||
def X86pextrw : SDNode<"X86ISD::PEXTRW",
|
||||
|
@ -4855,6 +4855,9 @@ defm BLENDVPD : SS41I_ternary_int<0x15, "blendvpd", int_x86_sse41_blendvpd>;
|
||||
defm BLENDVPS : SS41I_ternary_int<0x14, "blendvps", int_x86_sse41_blendvps>;
|
||||
defm PBLENDVB : SS41I_ternary_int<0x10, "pblendvb", int_x86_sse41_pblendvb>;
|
||||
|
||||
def : Pat<(X86pblendv VR128:$src1, VR128:$src2, XMM0),
|
||||
(PBLENDVBrr0 VR128:$src1, VR128:$src2)>;
|
||||
|
||||
let isAsmParserOnly = 1, Predicates = [HasAVX] in
|
||||
def VMOVNTDQArm : SS48I<0x2A, MRMSrcMem, (outs VR128:$dst), (ins i128mem:$src),
|
||||
"vmovntdqa\t{$src, $dst|$dst, $src}",
|
||||
|
Loading…
x
Reference in New Issue
Block a user