@@ -7443,98 +7443,49 @@ SDValue SITargetLowering::lowerBUILD_VECTOR(SDValue Op,
7443
7443
SDLoc SL(Op);
7444
7444
EVT VT = Op.getValueType();
7445
7445
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");
7451
7448
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);
7469
7451
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);
7484
7457
}
7485
7458
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);
7490
7461
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 );
7495
7466
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);
7506
7469
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);
7510
7472
}
7511
7473
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());
7514
7478
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));
7523
7484
}
7524
7485
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);
7538
7489
}
7539
7490
7540
7491
bool
0 commit comments