@@ -99,6 +99,37 @@ Register RISCVInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
9999 return isLoadFromStackSlot (MI, FrameIndex, Dummy);
100100}
101101
102+ static std::optional<unsigned > getLMULForRVVWholeLoadStore (unsigned Opcode) {
103+ switch (Opcode) {
104+ default :
105+ return std::nullopt ;
106+ case RISCV::VS1R_V:
107+ case RISCV::VL1RE8_V:
108+ case RISCV::VL1RE16_V:
109+ case RISCV::VL1RE32_V:
110+ case RISCV::VL1RE64_V:
111+ return 1 ;
112+ case RISCV::VS2R_V:
113+ case RISCV::VL2RE8_V:
114+ case RISCV::VL2RE16_V:
115+ case RISCV::VL2RE32_V:
116+ case RISCV::VL2RE64_V:
117+ return 2 ;
118+ case RISCV::VS4R_V:
119+ case RISCV::VL4RE8_V:
120+ case RISCV::VL4RE16_V:
121+ case RISCV::VL4RE32_V:
122+ case RISCV::VL4RE64_V:
123+ return 4 ;
124+ case RISCV::VS8R_V:
125+ case RISCV::VL8RE8_V:
126+ case RISCV::VL8RE16_V:
127+ case RISCV::VL8RE32_V:
128+ case RISCV::VL8RE64_V:
129+ return 8 ;
130+ }
131+ }
132+
102133Register RISCVInstrInfo::isLoadFromStackSlot (const MachineInstr &MI,
103134 int &FrameIndex,
104135 TypeSize &MemBytes) const {
@@ -125,6 +156,17 @@ Register RISCVInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
125156 case RISCV::FLD:
126157 MemBytes = TypeSize::getFixed (8 );
127158 break ;
159+ case RISCV::VL1RE8_V:
160+ case RISCV::VL2RE8_V:
161+ case RISCV::VL4RE8_V:
162+ case RISCV::VL8RE8_V:
163+ if (!MI.getOperand (1 ).isFI ())
164+ return Register ();
165+ FrameIndex = MI.getOperand (1 ).getIndex ();
166+ unsigned BytesPerBlock = RISCV::RVVBitsPerBlock / 8 ;
167+ unsigned LMUL = *getLMULForRVVWholeLoadStore (MI.getOpcode ());
168+ MemBytes = TypeSize::getScalable (BytesPerBlock * LMUL);
169+ return MI.getOperand (0 ).getReg ();
128170 }
129171
130172 if (MI.getOperand (1 ).isFI () && MI.getOperand (2 ).isImm () &&
@@ -165,6 +207,17 @@ Register RISCVInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
165207 case RISCV::FSD:
166208 MemBytes = TypeSize::getFixed (8 );
167209 break ;
210+ case RISCV::VS1R_V:
211+ case RISCV::VS2R_V:
212+ case RISCV::VS4R_V:
213+ case RISCV::VS8R_V:
214+ if (!MI.getOperand (1 ).isFI ())
215+ return Register ();
216+ FrameIndex = MI.getOperand (1 ).getIndex ();
217+ unsigned BytesPerBlock = RISCV::RVVBitsPerBlock / 8 ;
218+ unsigned LMUL = *getLMULForRVVWholeLoadStore (MI.getOpcode ());
219+ MemBytes = TypeSize::getScalable (BytesPerBlock * LMUL);
220+ return MI.getOperand (0 ).getReg ();
168221 }
169222
170223 if (MI.getOperand (1 ).isFI () && MI.getOperand (2 ).isImm () &&
@@ -4071,40 +4124,12 @@ bool RISCV::isZEXT_B(const MachineInstr &MI) {
40714124 MI.getOperand (2 ).isImm () && MI.getOperand (2 ).getImm () == 255 ;
40724125}
40734126
4074- static bool isRVVWholeLoadStore (unsigned Opcode) {
4075- switch (Opcode) {
4076- default :
4077- return false ;
4078- case RISCV::VS1R_V:
4079- case RISCV::VS2R_V:
4080- case RISCV::VS4R_V:
4081- case RISCV::VS8R_V:
4082- case RISCV::VL1RE8_V:
4083- case RISCV::VL2RE8_V:
4084- case RISCV::VL4RE8_V:
4085- case RISCV::VL8RE8_V:
4086- case RISCV::VL1RE16_V:
4087- case RISCV::VL2RE16_V:
4088- case RISCV::VL4RE16_V:
4089- case RISCV::VL8RE16_V:
4090- case RISCV::VL1RE32_V:
4091- case RISCV::VL2RE32_V:
4092- case RISCV::VL4RE32_V:
4093- case RISCV::VL8RE32_V:
4094- case RISCV::VL1RE64_V:
4095- case RISCV::VL2RE64_V:
4096- case RISCV::VL4RE64_V:
4097- case RISCV::VL8RE64_V:
4098- return true ;
4099- }
4100- }
4101-
41024127bool RISCV::isRVVSpill (const MachineInstr &MI) {
41034128 // RVV lacks any support for immediate addressing for stack addresses, so be
41044129 // conservative.
41054130 unsigned Opcode = MI.getOpcode ();
41064131 if (!RISCVVPseudosTable::getPseudoInfo (Opcode) &&
4107- !isRVVWholeLoadStore (Opcode) && !isRVVSpillForZvlsseg (Opcode))
4132+ !getLMULForRVVWholeLoadStore (Opcode) && !isRVVSpillForZvlsseg (Opcode))
41084133 return false ;
41094134 return true ;
41104135}
0 commit comments