mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 12:43:36 +01:00
Merge VPERM2F128/VPERM2I128 ISD node types.
llvm-svn: 145485
This commit is contained in:
parent
8da55f9048
commit
0ac9bb8aa1
@ -2848,8 +2848,7 @@ static bool isTargetShuffle(unsigned Opcode) {
|
||||
case X86ISD::UNPCKHP:
|
||||
case X86ISD::PUNPCKH:
|
||||
case X86ISD::VPERMILP:
|
||||
case X86ISD::VPERM2F128:
|
||||
case X86ISD::VPERM2I128:
|
||||
case X86ISD::VPERM2X128:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -2889,8 +2888,7 @@ static SDValue getTargetShuffleNode(unsigned Opc, DebugLoc dl, EVT VT,
|
||||
case X86ISD::PALIGN:
|
||||
case X86ISD::SHUFPD:
|
||||
case X86ISD::SHUFPS:
|
||||
case X86ISD::VPERM2F128:
|
||||
case X86ISD::VPERM2I128:
|
||||
case X86ISD::VPERM2X128:
|
||||
return DAG.getNode(Opc, dl, VT, V1, V2,
|
||||
DAG.getConstant(TargetMask, MVT::i8));
|
||||
}
|
||||
@ -4616,8 +4614,7 @@ static SDValue getShuffleScalarElt(SDNode *N, int Index, SelectionDAG &DAG,
|
||||
DecodeVPERMILPMask(VT, cast<ConstantSDNode>(ImmN)->getZExtValue(),
|
||||
ShuffleMask);
|
||||
break;
|
||||
case X86ISD::VPERM2F128:
|
||||
case X86ISD::VPERM2I128:
|
||||
case X86ISD::VPERM2X128:
|
||||
ImmN = N->getOperand(N->getNumOperands()-1);
|
||||
DecodeVPERM2F128Mask(VT, cast<ConstantSDNode>(ImmN)->getZExtValue(),
|
||||
ShuffleMask);
|
||||
@ -6521,22 +6518,6 @@ static inline unsigned getUNPCKHOpcode(EVT VT, bool HasAVX2) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned getVPERM2X128Opcode(EVT VT, bool HasAVX2) {
|
||||
switch(VT.getSimpleVT().SimpleTy) {
|
||||
case MVT::v32i8:
|
||||
case MVT::v16i16:
|
||||
case MVT::v8i32:
|
||||
case MVT::v4i64:
|
||||
if (HasAVX2) return X86ISD::VPERM2I128;
|
||||
// else use fp unit for int vperm
|
||||
case MVT::v8f32:
|
||||
case MVT::v4f64: return X86ISD::VPERM2F128;
|
||||
default:
|
||||
llvm_unreachable("Unknown type for vpermil");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
SDValue NormalizeVectorShuffle(SDValue Op, SelectionDAG &DAG,
|
||||
const TargetLowering &TLI,
|
||||
@ -6858,7 +6839,7 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const {
|
||||
|
||||
// Handle VPERM2F128/VPERM2I128 permutations
|
||||
if (isVPERM2X128Mask(M, VT, Subtarget->hasAVX()))
|
||||
return getTargetShuffleNode(getVPERM2X128Opcode(VT, HasAVX2), dl, VT, V1,
|
||||
return getTargetShuffleNode(X86ISD::VPERM2X128, dl, VT, V1,
|
||||
V2, getShuffleVPERM2X128Immediate(SVOp), DAG);
|
||||
|
||||
// Handle VSHUFPS/DY permutations
|
||||
@ -11157,8 +11138,7 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
||||
case X86ISD::PUNPCKH: return "X86ISD::PUNPCKH";
|
||||
case X86ISD::VBROADCAST: return "X86ISD::VBROADCAST";
|
||||
case X86ISD::VPERMILP: return "X86ISD::VPERMILP";
|
||||
case X86ISD::VPERM2F128: return "X86ISD::VPERM2F128";
|
||||
case X86ISD::VPERM2I128: return "X86ISD::VPERM2I128";
|
||||
case X86ISD::VPERM2X128: return "X86ISD::VPERM2X128";
|
||||
case X86ISD::VASTART_SAVE_XMM_REGS: return "X86ISD::VASTART_SAVE_XMM_REGS";
|
||||
case X86ISD::VAARG_64: return "X86ISD::VAARG_64";
|
||||
case X86ISD::WIN_ALLOCA: return "X86ISD::WIN_ALLOCA";
|
||||
@ -14744,8 +14724,7 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N,
|
||||
case X86ISD::MOVSS:
|
||||
case X86ISD::MOVSD:
|
||||
case X86ISD::VPERMILP:
|
||||
case X86ISD::VPERM2F128:
|
||||
case X86ISD::VPERM2I128:
|
||||
case X86ISD::VPERM2X128:
|
||||
case ISD::VECTOR_SHUFFLE: return PerformShuffleCombine(N, DAG, DCI,Subtarget);
|
||||
}
|
||||
|
||||
|
@ -278,8 +278,7 @@ namespace llvm {
|
||||
PUNPCKL,
|
||||
PUNPCKH,
|
||||
VPERMILP,
|
||||
VPERM2F128,
|
||||
VPERM2I128,
|
||||
VPERM2X128,
|
||||
VBROADCAST,
|
||||
|
||||
// VASTART_SAVE_XMM_REGS - Save xmm argument registers to the stack,
|
||||
|
@ -138,8 +138,7 @@ def X86Punpckh : SDNode<"X86ISD::PUNPCKH", SDTShuff2Op>;
|
||||
|
||||
def X86VPermilp : SDNode<"X86ISD::VPERMILP", SDTShuff2OpI>;
|
||||
|
||||
def X86VPerm2f128 : SDNode<"X86ISD::VPERM2F128", SDTShuff3OpI>;
|
||||
def X86VPerm2i128 : SDNode<"X86ISD::VPERM2I128", SDTShuff3OpI>;
|
||||
def X86VPerm2x128 : SDNode<"X86ISD::VPERM2X128", SDTShuff3OpI>;
|
||||
|
||||
def X86VBroadcast : SDNode<"X86ISD::VBROADCAST", SDTVBroadcast>;
|
||||
|
||||
|
@ -7322,38 +7322,6 @@ def : Pat<(int_x86_avx_vperm2f128_si_256
|
||||
VR256:$src1, (bc_v8i32 (memopv4i64 addr:$src2)), imm:$src3),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$src3)>;
|
||||
|
||||
def : Pat<(v8f32 (X86VPerm2f128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v8i32 (X86VPerm2f128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v4i64 (X86VPerm2f128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v4f64 (X86VPerm2f128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v32i8 (X86VPerm2f128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v16i16 (X86VPerm2f128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
|
||||
def : Pat<(v8f32 (X86VPerm2f128 VR256:$src1,
|
||||
(memopv8f32 addr:$src2), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v8i32 (X86VPerm2f128 VR256:$src1,
|
||||
(bc_v8i32 (memopv4i64 addr:$src2)), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v4i64 (X86VPerm2f128 VR256:$src1,
|
||||
(memopv4i64 addr:$src2), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v4f64 (X86VPerm2f128 VR256:$src1,
|
||||
(memopv4f64 addr:$src2), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v32i8 (X86VPerm2f128 VR256:$src1,
|
||||
(bc_v32i8 (memopv4i64 addr:$src2)), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v16i16 (X86VPerm2f128 VR256:$src1,
|
||||
(bc_v16i16 (memopv4i64 addr:$src2)), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// VZERO - Zero YMM registers
|
||||
//
|
||||
@ -7567,29 +7535,63 @@ def VPERM2I128rm : AVX2AIi8<0x46, MRMSrcMem, (outs VR256:$dst),
|
||||
VEX_4V;
|
||||
|
||||
let Predicates = [HasAVX2] in {
|
||||
def : Pat<(v8i32 (X86VPerm2i128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
def : Pat<(v8i32 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2I128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v4i64 (X86VPerm2i128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
def : Pat<(v4i64 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2I128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v32i8 (X86VPerm2i128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
def : Pat<(v32i8 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2I128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v16i16 (X86VPerm2i128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
def : Pat<(v16i16 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2I128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
|
||||
def : Pat<(v32i8 (X86VPerm2i128 VR256:$src1, (bc_v32i8 (memopv4i64 addr:$src2)),
|
||||
def : Pat<(v32i8 (X86VPerm2x128 VR256:$src1, (bc_v32i8 (memopv4i64 addr:$src2)),
|
||||
(i8 imm:$imm))),
|
||||
(VPERM2I128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v16i16 (X86VPerm2i128 VR256:$src1,
|
||||
def : Pat<(v16i16 (X86VPerm2x128 VR256:$src1,
|
||||
(bc_v16i16 (memopv4i64 addr:$src2)), (i8 imm:$imm))),
|
||||
(VPERM2I128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v8i32 (X86VPerm2i128 VR256:$src1, (bc_v8i32 (memopv4i64 addr:$src2)),
|
||||
def : Pat<(v8i32 (X86VPerm2x128 VR256:$src1, (bc_v8i32 (memopv4i64 addr:$src2)),
|
||||
(i8 imm:$imm))),
|
||||
(VPERM2I128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v4i64 (X86VPerm2i128 VR256:$src1, (memopv4i64 addr:$src2),
|
||||
def : Pat<(v4i64 (X86VPerm2x128 VR256:$src1, (memopv4i64 addr:$src2),
|
||||
(i8 imm:$imm))),
|
||||
(VPERM2I128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
}
|
||||
|
||||
// AVX1 patterns
|
||||
def : Pat<(v8f32 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v8i32 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v4i64 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v4f64 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v32i8 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
def : Pat<(v16i16 (X86VPerm2x128 VR256:$src1, VR256:$src2, (i8 imm:$imm))),
|
||||
(VPERM2F128rr VR256:$src1, VR256:$src2, imm:$imm)>;
|
||||
|
||||
def : Pat<(v8f32 (X86VPerm2x128 VR256:$src1,
|
||||
(memopv8f32 addr:$src2), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v8i32 (X86VPerm2x128 VR256:$src1,
|
||||
(bc_v8i32 (memopv4i64 addr:$src2)), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v4i64 (X86VPerm2x128 VR256:$src1,
|
||||
(memopv4i64 addr:$src2), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v4f64 (X86VPerm2x128 VR256:$src1,
|
||||
(memopv4f64 addr:$src2), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v32i8 (X86VPerm2x128 VR256:$src1,
|
||||
(bc_v32i8 (memopv4i64 addr:$src2)), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
def : Pat<(v16i16 (X86VPerm2x128 VR256:$src1,
|
||||
(bc_v16i16 (memopv4i64 addr:$src2)), (i8 imm:$imm))),
|
||||
(VPERM2F128rm VR256:$src1, addr:$src2, imm:$imm)>;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// VINSERTI128 - Insert packed integer values
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user