@@ -652,6 +652,7 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
652652 MachineInstr::MIFlag Flags) const {
653653 MachineFunction *MF = MBB.getParent ();
654654 MachineFrameInfo &MFI = MF->getFrameInfo ();
655+ Align Alignment = MFI.getObjectAlign (FI);
655656
656657 unsigned Opcode;
657658 if (RISCV::GPRRegClass.hasSubClassEq (RC)) {
@@ -662,7 +663,12 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
662663 } else if (RISCV::GPRF32RegClass.hasSubClassEq (RC)) {
663664 Opcode = RISCV::SW_INX;
664665 } else if (RISCV::GPRPairRegClass.hasSubClassEq (RC)) {
665- Opcode = RISCV::PseudoRV32ZdinxSD;
666+ if (!STI.is64Bit () && STI.hasStdExtZilsd () &&
667+ Alignment >= STI.getZilsdAlign ()) {
668+ Opcode = RISCV::SD_RV32;
669+ } else {
670+ Opcode = RISCV::PseudoRV32ZdinxSD;
671+ }
666672 } else if (RISCV::FPR16RegClass.hasSubClassEq (RC)) {
667673 Opcode = RISCV::FSH;
668674 } else if (RISCV::FPR32RegClass.hasSubClassEq (RC)) {
@@ -705,7 +711,7 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
705711 if (RISCVRegisterInfo::isRVVRegClass (RC)) {
706712 MachineMemOperand *MMO = MF->getMachineMemOperand (
707713 MachinePointerInfo::getFixedStack (*MF, FI), MachineMemOperand::MOStore,
708- TypeSize::getScalable (MFI.getObjectSize (FI)), MFI. getObjectAlign (FI) );
714+ TypeSize::getScalable (MFI.getObjectSize (FI)), Alignment );
709715
710716 MFI.setStackID (FI, TargetStackID::ScalableVector);
711717 BuildMI (MBB, I, DebugLoc (), get (Opcode))
@@ -717,7 +723,7 @@ void RISCVInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
717723 } else {
718724 MachineMemOperand *MMO = MF->getMachineMemOperand (
719725 MachinePointerInfo::getFixedStack (*MF, FI), MachineMemOperand::MOStore,
720- MFI.getObjectSize (FI), MFI. getObjectAlign (FI) );
726+ MFI.getObjectSize (FI), Alignment );
721727
722728 BuildMI (MBB, I, DebugLoc (), get (Opcode))
723729 .addReg (SrcReg, getKillRegState (IsKill))
@@ -736,6 +742,7 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
736742 MachineInstr::MIFlag Flags) const {
737743 MachineFunction *MF = MBB.getParent ();
738744 MachineFrameInfo &MFI = MF->getFrameInfo ();
745+ Align Alignment = MFI.getObjectAlign (FI);
739746 DebugLoc DL =
740747 Flags & MachineInstr::FrameDestroy ? MBB.findDebugLoc (I) : DebugLoc ();
741748
@@ -748,7 +755,12 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
748755 } else if (RISCV::GPRF32RegClass.hasSubClassEq (RC)) {
749756 Opcode = RISCV::LW_INX;
750757 } else if (RISCV::GPRPairRegClass.hasSubClassEq (RC)) {
751- Opcode = RISCV::PseudoRV32ZdinxLD;
758+ if (!STI.is64Bit () && STI.hasStdExtZilsd () &&
759+ Alignment >= STI.getZilsdAlign ()) {
760+ Opcode = RISCV::LD_RV32;
761+ } else {
762+ Opcode = RISCV::PseudoRV32ZdinxLD;
763+ }
752764 } else if (RISCV::FPR16RegClass.hasSubClassEq (RC)) {
753765 Opcode = RISCV::FLH;
754766 } else if (RISCV::FPR32RegClass.hasSubClassEq (RC)) {
@@ -791,7 +803,7 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
791803 if (RISCVRegisterInfo::isRVVRegClass (RC)) {
792804 MachineMemOperand *MMO = MF->getMachineMemOperand (
793805 MachinePointerInfo::getFixedStack (*MF, FI), MachineMemOperand::MOLoad,
794- TypeSize::getScalable (MFI.getObjectSize (FI)), MFI. getObjectAlign (FI) );
806+ TypeSize::getScalable (MFI.getObjectSize (FI)), Alignment );
795807
796808 MFI.setStackID (FI, TargetStackID::ScalableVector);
797809 BuildMI (MBB, I, DL, get (Opcode), DstReg)
@@ -802,7 +814,7 @@ void RISCVInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
802814 } else {
803815 MachineMemOperand *MMO = MF->getMachineMemOperand (
804816 MachinePointerInfo::getFixedStack (*MF, FI), MachineMemOperand::MOLoad,
805- MFI.getObjectSize (FI), MFI. getObjectAlign (FI) );
817+ MFI.getObjectSize (FI), Alignment );
806818
807819 BuildMI (MBB, I, DL, get (Opcode), DstReg)
808820 .addFrameIndex (FI)
0 commit comments