[X86][AVX] LowerTRUNCATE - avoid bitcasts around extract_subvectors.
We allow extract_subvector lowering of all legal types, so pre-bitcast the source type to try and reduce bitcast pollution.
This commit is contained in:
parent
14947cd047
commit
1b780cf32e
@ -21075,30 +21075,29 @@ SDValue X86TargetLowering::LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const {
|
||||
assert(VT.is128BitVector() && InVT.is256BitVector() && "Unexpected types!");
|
||||
|
||||
if ((VT == MVT::v4i32) && (InVT == MVT::v4i64)) {
|
||||
In = DAG.getBitcast(MVT::v8i32, In);
|
||||
|
||||
// On AVX2, v4i64 -> v4i32 becomes VPERMD.
|
||||
if (Subtarget.hasInt256()) {
|
||||
static const int ShufMask[] = {0, 2, 4, 6, -1, -1, -1, -1};
|
||||
In = DAG.getBitcast(MVT::v8i32, In);
|
||||
In = DAG.getVectorShuffle(MVT::v8i32, DL, In, In, ShufMask);
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, In,
|
||||
DAG.getIntPtrConstant(0, DL));
|
||||
}
|
||||
|
||||
SDValue OpLo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v2i64, In,
|
||||
SDValue OpLo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v4i32, In,
|
||||
DAG.getIntPtrConstant(0, DL));
|
||||
SDValue OpHi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v2i64, In,
|
||||
DAG.getIntPtrConstant(2, DL));
|
||||
OpLo = DAG.getBitcast(MVT::v4i32, OpLo);
|
||||
OpHi = DAG.getBitcast(MVT::v4i32, OpHi);
|
||||
SDValue OpHi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v4i32, In,
|
||||
DAG.getIntPtrConstant(4, DL));
|
||||
static const int ShufMask[] = {0, 2, 4, 6};
|
||||
return DAG.getVectorShuffle(VT, DL, OpLo, OpHi, ShufMask);
|
||||
}
|
||||
|
||||
if ((VT == MVT::v8i16) && (InVT == MVT::v8i32)) {
|
||||
In = DAG.getBitcast(MVT::v32i8, In);
|
||||
|
||||
// On AVX2, v8i32 -> v8i16 becomes PSHUFB.
|
||||
if (Subtarget.hasInt256()) {
|
||||
In = DAG.getBitcast(MVT::v32i8, In);
|
||||
|
||||
// The PSHUFB mask:
|
||||
static const int ShufMask1[] = { 0, 1, 4, 5, 8, 9, 12, 13,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1,
|
||||
@ -21107,21 +21106,17 @@ SDValue X86TargetLowering::LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const {
|
||||
In = DAG.getVectorShuffle(MVT::v32i8, DL, In, In, ShufMask1);
|
||||
In = DAG.getBitcast(MVT::v4i64, In);
|
||||
|
||||
static const int ShufMask2[] = {0, 2, -1, -1};
|
||||
In = DAG.getVectorShuffle(MVT::v4i64, DL, In, In, ShufMask2);
|
||||
In = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v2i64, In,
|
||||
DAG.getIntPtrConstant(0, DL));
|
||||
return DAG.getBitcast(VT, In);
|
||||
static const int ShufMask2[] = {0, 2, -1, -1};
|
||||
In = DAG.getVectorShuffle(MVT::v4i64, DL, In, In, ShufMask2);
|
||||
return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v8i16,
|
||||
DAG.getBitcast(MVT::v16i16, In),
|
||||
DAG.getIntPtrConstant(0, DL));
|
||||
}
|
||||
|
||||
SDValue OpLo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v4i32, In,
|
||||
SDValue OpLo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v16i8, In,
|
||||
DAG.getIntPtrConstant(0, DL));
|
||||
|
||||
SDValue OpHi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v4i32, In,
|
||||
DAG.getIntPtrConstant(4, DL));
|
||||
|
||||
OpLo = DAG.getBitcast(MVT::v16i8, OpLo);
|
||||
OpHi = DAG.getBitcast(MVT::v16i8, OpHi);
|
||||
SDValue OpHi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, MVT::v16i8, In,
|
||||
DAG.getIntPtrConstant(16, DL));
|
||||
|
||||
// The PSHUFB mask:
|
||||
static const int ShufMask1[] = {0, 1, 4, 5, 8, 9, 12, 13,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user