@@ -437,6 +437,13 @@ std::pair<Register, Register> RegBankLegalizeHelper::unpackAExt(Register Reg) {
437437 return {Lo.getReg (0 ), Hi.getReg (0 )};
438438}
439439
440+ std::pair<Register, Register>
441+ RegBankLegalizeHelper::unpackAExtTruncS16 (Register Reg) {
442+ auto [Lo32, Hi32] = unpackAExt (Reg);
443+ return {B.buildTrunc (SgprRB_S16, Lo32).getReg (0 ),
444+ B.buildTrunc (SgprRB_S16, Hi32).getReg (0 )};
445+ }
446+
440447void RegBankLegalizeHelper::lowerUnpackBitShift (MachineInstr &MI) {
441448 Register Lo, Hi;
442449 switch (MI.getOpcode ()) {
@@ -629,14 +636,21 @@ void RegBankLegalizeHelper::lowerSplitTo32(MachineInstr &MI) {
629636void RegBankLegalizeHelper::lowerSplitTo16 (MachineInstr &MI) {
630637 Register Dst = MI.getOperand (0 ).getReg ();
631638 assert (MRI.getType (Dst) == V2S16);
632- auto [Op1Lo32, Op1Hi32] = unpackAExt (MI.getOperand (1 ).getReg ());
633- auto [Op2Lo32, Op2Hi32] = unpackAExt (MI.getOperand (2 ).getReg ());
634639 unsigned Opc = MI.getOpcode ();
635640 auto Flags = MI.getFlags ();
636- auto Op1Lo = B.buildTrunc (SgprRB_S16, Op1Lo32);
637- auto Op1Hi = B.buildTrunc (SgprRB_S16, Op1Hi32);
638- auto Op2Lo = B.buildTrunc (SgprRB_S16, Op2Lo32);
639- auto Op2Hi = B.buildTrunc (SgprRB_S16, Op2Hi32);
641+
642+ if (MI.getNumOperands () == 2 ) {
643+ auto [Op1Lo, Op1Hi] = unpackAExtTruncS16 (MI.getOperand (1 ).getReg ());
644+ auto Lo = B.buildInstr (Opc, {SgprRB_S16}, {Op1Lo}, Flags);
645+ auto Hi = B.buildInstr (Opc, {SgprRB_S16}, {Op1Hi}, Flags);
646+ B.buildMergeLikeInstr (Dst, {Lo, Hi});
647+ MI.eraseFromParent ();
648+ return ;
649+ }
650+
651+ assert (MI.getNumOperands () == 3 );
652+ auto [Op1Lo, Op1Hi] = unpackAExtTruncS16 (MI.getOperand (1 ).getReg ());
653+ auto [Op2Lo, Op2Hi] = unpackAExtTruncS16 (MI.getOperand (2 ).getReg ());
640654 auto Lo = B.buildInstr (Opc, {SgprRB_S16}, {Op1Lo, Op2Lo}, Flags);
641655 auto Hi = B.buildInstr (Opc, {SgprRB_S16}, {Op1Hi, Op2Hi}, Flags);
642656 B.buildMergeLikeInstr (Dst, {Lo, Hi});
0 commit comments