@@ -332,51 +332,19 @@ getRestoreLibCallName(const MachineFunction &MF,
332
332
return RestoreLibCalls[LibCallID];
333
333
}
334
334
335
- // Return encoded value and register count for PUSH/POP instruction,
336
- // representing registers to store/load.
337
- static std::pair<unsigned , unsigned >
338
- getPushPopEncodingAndNum (const Register MaxReg) {
339
- switch (MaxReg.id ()) {
340
- default :
341
- llvm_unreachable (" Unexpected Reg for Push/Pop Inst" );
342
- case RISCV::X27: /* s11*/
343
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S11, 13 );
344
- case RISCV::X25: /* s9*/
345
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S9, 11 );
346
- case RISCV::X24: /* s8*/
347
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S8, 10 );
348
- case RISCV::X23: /* s7*/
349
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S7, 9 );
350
- case RISCV::X22: /* s6*/
351
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S6, 8 );
352
- case RISCV::X21: /* s5*/
353
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S5, 7 );
354
- case RISCV::X20: /* s4*/
355
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S4, 6 );
356
- case RISCV::X19: /* s3*/
357
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S3, 5 );
358
- case RISCV::X18: /* s2*/
359
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S2, 4 );
360
- case RISCV::X9: /* s1*/
361
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0_S1, 3 );
362
- case FPReg: /* s0*/
363
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA_S0, 2 );
364
- case RAReg: /* ra*/
365
- return std::make_pair (llvm::RISCVZC::RLISTENCODE::RA, 1 );
366
- }
367
- }
368
-
369
335
// Get the max reg of Push/Pop for restoring callee saved registers.
370
- static Register getMaxPushPopReg (const std::vector<CalleeSavedInfo> &CSI) {
371
- MCRegister MaxPushPopReg ;
336
+ static unsigned getNumPushPopRegs (const std::vector<CalleeSavedInfo> &CSI) {
337
+ unsigned NumPushPopRegs = 0 ;
372
338
for (auto &CS : CSI) {
373
- if (llvm::find_if (FixedCSRFIMap, [&](MCPhysReg P) {
374
- return P == CS.getReg ();
375
- }) != std::end (FixedCSRFIMap))
376
- MaxPushPopReg = std::max (MaxPushPopReg.id (), CS.getReg ().id ());
339
+ auto *FII = llvm::find_if (FixedCSRFIMap,
340
+ [&](MCPhysReg P) { return P == CS.getReg (); });
341
+ if (FII != std::end (FixedCSRFIMap)) {
342
+ unsigned RegNum = std::distance (std::begin (FixedCSRFIMap), FII);
343
+ NumPushPopRegs = std::max (NumPushPopRegs, RegNum + 1 );
344
+ }
377
345
}
378
- assert (MaxPushPopReg != RISCV::X26 && " x26 requires x27 to also be pushed" );
379
- return MaxPushPopReg ;
346
+ assert (NumPushPopRegs != 12 && " x26 requires x27 to also be pushed" );
347
+ return NumPushPopRegs ;
380
348
}
381
349
382
350
// Return true if the specified function should have a dedicated frame
@@ -1790,14 +1758,10 @@ bool RISCVFrameLowering::assignCalleeSavedSpillSlots(
1790
1758
1791
1759
if (RVFI->isPushable (MF)) {
1792
1760
// Determine how many GPRs we need to push and save it to RVFI.
1793
- Register MaxReg = getMaxPushPopReg (CSI);
1794
- if (MaxReg != RISCV::NoRegister) {
1795
- auto [RegEnc, PushedRegNum] = getPushPopEncodingAndNum (MaxReg);
1761
+ unsigned PushedRegNum = getNumPushPopRegs (CSI);
1762
+ if (PushedRegNum) {
1796
1763
RVFI->setRVPushRegs (PushedRegNum);
1797
1764
RVFI->setRVPushStackSize (alignTo ((STI.getXLen () / 8 ) * PushedRegNum, 16 ));
1798
-
1799
- // Use encoded number to represent registers to spill.
1800
- RVFI->setRVPushRlist (RegEnc);
1801
1765
}
1802
1766
}
1803
1767
@@ -1881,11 +1845,11 @@ bool RISCVFrameLowering::spillCalleeSavedRegisters(
1881
1845
unsigned PushedRegNum = RVFI->getRVPushRegs ();
1882
1846
if (PushedRegNum > 0 ) {
1883
1847
// Use encoded number to represent registers to spill.
1884
- int RegEnc = RVFI-> getRVPushRlist ( );
1848
+ unsigned RegEnc = RISCVZC::encodeRlistNumRegs (PushedRegNum );
1885
1849
MachineInstrBuilder PushBuilder =
1886
1850
BuildMI (MBB, MI, DL, TII.get (RISCV::CM_PUSH))
1887
1851
.setMIFlag (MachineInstr::FrameSetup);
1888
- PushBuilder.addImm (( int64_t ) RegEnc);
1852
+ PushBuilder.addImm (RegEnc);
1889
1853
PushBuilder.addImm (0 );
1890
1854
1891
1855
for (unsigned i = 0 ; i < PushedRegNum; i++)
@@ -2034,8 +1998,9 @@ bool RISCVFrameLowering::restoreCalleeSavedRegisters(
2034
1998
2035
1999
RISCVMachineFunctionInfo *RVFI = MF->getInfo <RISCVMachineFunctionInfo>();
2036
2000
if (RVFI->isPushable (*MF)) {
2037
- int RegEnc = RVFI->getRVPushRlist ();
2038
- if (RegEnc != llvm::RISCVZC::RLISTENCODE::INVALID_RLIST) {
2001
+ unsigned PushedRegNum = RVFI->getRVPushRegs ();
2002
+ if (PushedRegNum > 0 ) {
2003
+ unsigned RegEnc = RISCVZC::encodeRlistNumRegs (PushedRegNum);
2039
2004
MachineInstrBuilder PopBuilder =
2040
2005
BuildMI (MBB, MI, DL, TII.get (RISCV::CM_POP))
2041
2006
.setMIFlag (MachineInstr::FrameDestroy);
0 commit comments