@@ -7443,98 +7443,49 @@ SDValue SITargetLowering::lowerBUILD_VECTOR(SDValue Op,
74437443 SDLoc SL(Op);
74447444 EVT VT = Op.getValueType();
74457445
7446- if (VT == MVT::v4i16 || VT == MVT::v4f16 || VT == MVT::v8i16 ||
7447- VT == MVT::v8f16 || VT == MVT::v4bf16 || VT == MVT::v8bf16) {
7448- EVT HalfVT = MVT::getVectorVT(VT.getVectorElementType().getSimpleVT(),
7449- VT.getVectorNumElements() / 2);
7450- MVT HalfIntVT = MVT::getIntegerVT(HalfVT.getSizeInBits());
7446+ if (VT == MVT::v2f16 || VT == MVT::v2i16 || VT == MVT::v2bf16) {
7447+ assert(!Subtarget->hasVOP3PInsts() && "this should be legal");
74517448
7452- // Turn into pair of packed build_vectors.
7453- // TODO: Special case for constants that can be materialized with s_mov_b64.
7454- SmallVector<SDValue, 4> LoOps, HiOps;
7455- for (unsigned I = 0, E = VT.getVectorNumElements() / 2; I != E; ++I) {
7456- LoOps.push_back(Op.getOperand(I));
7457- HiOps.push_back(Op.getOperand(I + E));
7458- }
7459- SDValue Lo = DAG.getBuildVector(HalfVT, SL, LoOps);
7460- SDValue Hi = DAG.getBuildVector(HalfVT, SL, HiOps);
7461-
7462- SDValue CastLo = DAG.getNode(ISD::BITCAST, SL, HalfIntVT, Lo);
7463- SDValue CastHi = DAG.getNode(ISD::BITCAST, SL, HalfIntVT, Hi);
7464-
7465- SDValue Blend = DAG.getBuildVector(MVT::getVectorVT(HalfIntVT, 2), SL,
7466- { CastLo, CastHi });
7467- return DAG.getNode(ISD::BITCAST, SL, VT, Blend);
7468- }
7449+ SDValue Lo = Op.getOperand(0);
7450+ SDValue Hi = Op.getOperand(1);
74697451
7470- if (VT == MVT::v16i16 || VT == MVT::v16f16 || VT == MVT::v16bf16) {
7471- EVT QuarterVT = MVT::getVectorVT(VT.getVectorElementType().getSimpleVT(),
7472- VT.getVectorNumElements() / 4);
7473- MVT QuarterIntVT = MVT::getIntegerVT(QuarterVT.getSizeInBits());
7474-
7475- SmallVector<SDValue, 4> Parts[4];
7476- for (unsigned I = 0, E = VT.getVectorNumElements() / 4; I != E; ++I) {
7477- for (unsigned P = 0; P < 4; ++P)
7478- Parts[P].push_back(Op.getOperand(I + P * E));
7479- }
7480- SDValue Casts[4];
7481- for (unsigned P = 0; P < 4; ++P) {
7482- SDValue Vec = DAG.getBuildVector(QuarterVT, SL, Parts[P]);
7483- Casts[P] = DAG.getNode(ISD::BITCAST, SL, QuarterIntVT, Vec);
7452+ // Avoid adding defined bits with the zero_extend.
7453+ if (Hi.isUndef()) {
7454+ Lo = DAG.getNode(ISD::BITCAST, SL, MVT::i16, Lo);
7455+ SDValue ExtLo = DAG.getNode(ISD::ANY_EXTEND, SL, MVT::i32, Lo);
7456+ return DAG.getNode(ISD::BITCAST, SL, VT, ExtLo);
74847457 }
74857458
7486- SDValue Blend =
7487- DAG.getBuildVector(MVT::getVectorVT(QuarterIntVT, 4), SL, Casts);
7488- return DAG.getNode(ISD::BITCAST, SL, VT, Blend);
7489- }
7459+ Hi = DAG.getNode(ISD::BITCAST, SL, MVT::i16, Hi);
7460+ Hi = DAG.getNode(ISD::ZERO_EXTEND, SL, MVT::i32, Hi);
74907461
7491- if (VT == MVT::v32i16 || VT == MVT::v32f16 || VT == MVT::v32bf16) {
7492- EVT QuarterVT = MVT::getVectorVT(VT.getVectorElementType().getSimpleVT(),
7493- VT.getVectorNumElements() / 8);
7494- MVT QuarterIntVT = MVT::getIntegerVT(QuarterVT.getSizeInBits() );
7462+ SDValue ShlHi = DAG.getNode(ISD::SHL, SL, MVT::i32, Hi,
7463+ DAG.getConstant(16, SL, MVT::i32));
7464+ if (Lo.isUndef())
7465+ return DAG.getNode(ISD::BITCAST, SL, VT, ShlHi );
74957466
7496- SmallVector<SDValue, 8> Parts[8];
7497- for (unsigned I = 0, E = VT.getVectorNumElements() / 8; I != E; ++I) {
7498- for (unsigned P = 0; P < 8; ++P)
7499- Parts[P].push_back(Op.getOperand(I + P * E));
7500- }
7501- SDValue Casts[8];
7502- for (unsigned P = 0; P < 8; ++P) {
7503- SDValue Vec = DAG.getBuildVector(QuarterVT, SL, Parts[P]);
7504- Casts[P] = DAG.getNode(ISD::BITCAST, SL, QuarterIntVT, Vec);
7505- }
7467+ Lo = DAG.getNode(ISD::BITCAST, SL, MVT::i16, Lo);
7468+ Lo = DAG.getNode(ISD::ZERO_EXTEND, SL, MVT::i32, Lo);
75067469
7507- SDValue Blend =
7508- DAG.getBuildVector(MVT::getVectorVT(QuarterIntVT, 8), SL, Casts);
7509- return DAG.getNode(ISD::BITCAST, SL, VT, Blend);
7470+ SDValue Or = DAG.getNode(ISD::OR, SL, MVT::i32, Lo, ShlHi);
7471+ return DAG.getNode(ISD::BITCAST, SL, VT, Or);
75107472 }
75117473
7512- assert(VT == MVT::v2f16 || VT == MVT::v2i16 || VT == MVT::v2bf16);
7513- assert(!Subtarget->hasVOP3PInsts() && "this should be legal");
7474+ // Split into 2-element chunks.
7475+ const unsigned NumParts = VT.getVectorNumElements() / 2;
7476+ EVT PartVT = MVT::getVectorVT(VT.getVectorElementType().getSimpleVT(), 2);
7477+ MVT PartIntVT = MVT::getIntegerVT(PartVT.getSizeInBits());
75147478
7515- SDValue Lo = Op.getOperand(0);
7516- SDValue Hi = Op.getOperand(1);
7517-
7518- // Avoid adding defined bits with the zero_extend.
7519- if (Hi.isUndef()) {
7520- Lo = DAG.getNode(ISD::BITCAST, SL, MVT::i16, Lo);
7521- SDValue ExtLo = DAG.getNode(ISD::ANY_EXTEND, SL, MVT::i32, Lo);
7522- return DAG.getNode(ISD::BITCAST, SL, VT, ExtLo);
7479+ SmallVector<SDValue> Casts;
7480+ for (unsigned P = 0; P < NumParts; ++P) {
7481+ SDValue Vec = DAG.getBuildVector(
7482+ PartVT, SL, {Op.getOperand(P * 2), Op.getOperand(P * 2 + 1)});
7483+ Casts.push_back(DAG.getNode(ISD::BITCAST, SL, PartIntVT, Vec));
75237484 }
75247485
7525- Hi = DAG.getNode(ISD::BITCAST, SL, MVT::i16, Hi);
7526- Hi = DAG.getNode(ISD::ZERO_EXTEND, SL, MVT::i32, Hi);
7527-
7528- SDValue ShlHi = DAG.getNode(ISD::SHL, SL, MVT::i32, Hi,
7529- DAG.getConstant(16, SL, MVT::i32));
7530- if (Lo.isUndef())
7531- return DAG.getNode(ISD::BITCAST, SL, VT, ShlHi);
7532-
7533- Lo = DAG.getNode(ISD::BITCAST, SL, MVT::i16, Lo);
7534- Lo = DAG.getNode(ISD::ZERO_EXTEND, SL, MVT::i32, Lo);
7535-
7536- SDValue Or = DAG.getNode(ISD::OR, SL, MVT::i32, Lo, ShlHi);
7537- return DAG.getNode(ISD::BITCAST, SL, VT, Or);
7486+ SDValue Blend =
7487+ DAG.getBuildVector(MVT::getVectorVT(PartIntVT, NumParts), SL, Casts);
7488+ return DAG.getNode(ISD::BITCAST, SL, VT, Blend);
75387489}
75397490
75407491bool
0 commit comments