From: Craig Topper Date: Mon, 16 Apr 2012 00:41:45 +0000 (+0000) Subject: Merge vpermps/vpermd and vpermpd/vpermq SD nodes. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=8325c11d473a340217fa0de648ba8f733f2d626e;p=oota-llvm.git Merge vpermps/vpermd and vpermpd/vpermq SD nodes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154782 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 0382f2bb930..d10f8fb0dce 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -2935,8 +2935,7 @@ static SDValue getTargetShuffleNode(unsigned Opc, DebugLoc dl, EVT VT, case X86ISD::PSHUFHW: case X86ISD::PSHUFLW: case X86ISD::VPERMILP: - case X86ISD::VPERMQ: - case X86ISD::VPERMPD: + case X86ISD::VPERMI: return DAG.getNode(Opc, dl, VT, V1, DAG.getConstant(TargetMask, MVT::i8)); } } @@ -6656,16 +6655,14 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const { for (unsigned i = 0; i != 8; ++i) { permclMask.push_back(DAG.getConstant((M[i]>=0) ? M[i] : 0, MVT::i32)); } - return DAG.getNode(VT.isInteger()? X86ISD::VPERMD:X86ISD::VPERMPS, dl, VT, + return DAG.getNode(X86ISD::VPERMV, dl, VT, DAG.getNode(ISD::BUILD_VECTOR, dl, MVT::v8i32, &permclMask[0], 8), V1); } - if (V2IsUndef && HasAVX2 && (VT == MVT::v4i64 || VT == MVT::v4f64)) { - unsigned Opcode = VT.isInteger() ? X86ISD::VPERMQ : X86ISD::VPERMPD; - return getTargetShuffleNode(Opcode, dl, VT, V1, + if (V2IsUndef && HasAVX2 && (VT == MVT::v4i64 || VT == MVT::v4f64)) + return getTargetShuffleNode(X86ISD::VPERMI, dl, VT, V1, getShuffleCLImmediate(SVOp), DAG); - } //===--------------------------------------------------------------------===// @@ -11181,10 +11178,8 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const { case X86ISD::VBROADCAST: return "X86ISD::VBROADCAST"; case X86ISD::VPERMILP: return "X86ISD::VPERMILP"; case X86ISD::VPERM2X128: return "X86ISD::VPERM2X128"; - case X86ISD::VPERMD: return "X86ISD::VPERMD"; - case X86ISD::VPERMQ: return "X86ISD::VPERMQ"; - case X86ISD::VPERMPS: return "X86ISD::VPERMPS"; - case X86ISD::VPERMPD: return "X86ISD::VPERMPD"; + case X86ISD::VPERMV: return "X86ISD::VPERMV"; + case X86ISD::VPERMI: return "X86ISD::VPERMI"; case X86ISD::PMULUDQ: return "X86ISD::PMULUDQ"; case X86ISD::VASTART_SAVE_XMM_REGS: return "X86ISD::VASTART_SAVE_XMM_REGS"; case X86ISD::VAARG_64: return "X86ISD::VAARG_64"; diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index aac7468a318..09116e88af5 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -285,10 +285,8 @@ namespace llvm { UNPCKL, UNPCKH, VPERMILP, - VPERMD, - VPERMQ, - VPERMPS, - VPERMPD, + VPERMV, + VPERMI, VPERM2X128, VBROADCAST, diff --git a/lib/Target/X86/X86InstrFragmentsSIMD.td b/lib/Target/X86/X86InstrFragmentsSIMD.td index 0215480b8f6..bf36a91f0f9 100644 --- a/lib/Target/X86/X86InstrFragmentsSIMD.td +++ b/lib/Target/X86/X86InstrFragmentsSIMD.td @@ -157,10 +157,8 @@ def X86Unpckl : SDNode<"X86ISD::UNPCKL", SDTShuff2Op>; def X86Unpckh : SDNode<"X86ISD::UNPCKH", SDTShuff2Op>; def X86VPermilp : SDNode<"X86ISD::VPERMILP", SDTShuff2OpI>; -def X86VPermd : SDNode<"X86ISD::VPERMD", SDTVPermv>; -def X86VPermps : SDNode<"X86ISD::VPERMPS", SDTVPermv>; -def X86VPermq : SDNode<"X86ISD::VPERMQ", SDTShuff2OpI>; -def X86VPermpd : SDNode<"X86ISD::VPERMPD", SDTShuff2OpI>; +def X86VPermv : SDNode<"X86ISD::VPERMV", SDTVPermv>; +def X86VPermi : SDNode<"X86ISD::VPERMI", SDTShuff2OpI>; def X86VPerm2x128 : SDNode<"X86ISD::VPERM2X128", SDTShuff3OpI>; diff --git a/lib/Target/X86/X86InstrSSE.td b/lib/Target/X86/X86InstrSSE.td index 8ce974d6fa7..eb608d35240 100644 --- a/lib/Target/X86/X86InstrSSE.td +++ b/lib/Target/X86/X86InstrSSE.td @@ -7755,37 +7755,35 @@ let ExeDomain = SSEPackedSingle in defm VPERMPS : avx2_perm<0x16, "vpermps", memopv8f32, int_x86_avx2_permps>; multiclass avx2_perm_imm opc, string OpcodeStr, PatFrag mem_frag, - SDNode OpNode, ValueType OpVT> { + ValueType OpVT> { def Yri : AVX2AIi8, VEX; + (OpVT (X86VPermi VR256:$src1, (i8 imm:$src2))))]>, VEX; def Ymi : AVX2AIi8, - VEX; + (OpVT (X86VPermi (mem_frag addr:$src1), + (i8 imm:$src2))))]>, VEX; } -defm VPERMQ : avx2_perm_imm<0x00, "vpermq", memopv4i64, X86VPermq, v4i64>, - VEX_W; +defm VPERMQ : avx2_perm_imm<0x00, "vpermq", memopv4i64, v4i64>, VEX_W; let ExeDomain = SSEPackedDouble in -defm VPERMPD : avx2_perm_imm<0x01, "vpermpd", memopv4f64, X86VPermpd, v4f64>, - VEX_W; +defm VPERMPD : avx2_perm_imm<0x01, "vpermpd", memopv4f64, v4f64>, VEX_W; let Predicates = [HasAVX2] in { -def : Pat<(v8i32 (X86VPermd VR256:$src1, VR256:$src2)), +def : Pat<(v8i32 (X86VPermv VR256:$src1, VR256:$src2)), (VPERMDYrr VR256:$src1, VR256:$src2)>; -def : Pat<(v8f32 (X86VPermps VR256:$src1, VR256:$src2)), +def : Pat<(v8f32 (X86VPermv VR256:$src1, VR256:$src2)), (VPERMPSYrr VR256:$src1, VR256:$src2)>; -def : Pat<(v8i32 (X86VPermd VR256:$src1, (bc_v8i32 (memopv4i64 addr:$src2)))), +def : Pat<(v8i32 (X86VPermv VR256:$src1, (bc_v8i32 (memopv4i64 addr:$src2)))), (VPERMDYrm VR256:$src1, addr:$src2)>; -def : Pat<(v8f32 (X86VPermps VR256:$src1, (memopv8f32 addr:$src2))), +def : Pat<(v8f32 (X86VPermv VR256:$src1, (memopv8f32 addr:$src2))), (VPERMPSYrm VR256:$src1, addr:$src2)>; }