Skip to content

Commit

Permalink
Restore PPC special-purpose registers in opposite order of saving them (
Browse files Browse the repository at this point in the history
#1392)

* Restore PPC special-purpose registers in opposite order of saving them

This is the same fix as #1000,
but for PowerPC.

* Reverse order of FPSCR restore
  • Loading branch information
hainest committed Mar 2, 2023
1 parent ae43ebc commit 067be96
Showing 1 changed file with 10 additions and 9 deletions.
19 changes: 10 additions & 9 deletions dyninstAPI/src/inst-power.C
Original file line number Diff line number Diff line change
Expand Up @@ -1003,25 +1003,26 @@ unsigned restoreSPRegisters(codeGen &gen,
fpscr_off = STK_FP_CR_64;
}

registerSlot *regCR = (*(gen.rs()))[registerSpace::cr];
assert (regCR != NULL);
if (force_save || regCR->liveState == registerSlot::spilled)
restoreFPSCR(gen, 10, save_off + fpscr_off); num_restored++;

registerSlot *regXER = (*(gen.rs()))[registerSpace::xer];
assert (regXER != NULL);
if (force_save || regXER->liveState == registerSlot::spilled)
{
restoreCR(gen, 10, save_off + cr_off); num_restored++;
restoreSPR(gen, 10, SPR_XER, save_off + xer_off); num_restored++;
}
registerSlot *regCTR = (*(gen.rs()))[registerSpace::ctr];
assert (regCTR != NULL);
if (force_save || regCTR->liveState == registerSlot::spilled)
{
restoreSPR(gen, 10, SPR_CTR, save_off + ctr_off); num_restored++;
}
registerSlot *regXER = (*(gen.rs()))[registerSpace::xer];
assert (regXER != NULL);
if (force_save || regXER->liveState == registerSlot::spilled)
registerSlot *regCR = (*(gen.rs()))[registerSpace::cr];
assert (regCR != NULL);
if (force_save || regCR->liveState == registerSlot::spilled)
{
restoreSPR(gen, 10, SPR_XER, save_off + xer_off); num_restored++;
restoreCR(gen, 10, save_off + cr_off); num_restored++;
}
restoreFPSCR(gen, 10, save_off + fpscr_off); num_restored++;

return num_restored;
}
Expand Down

0 comments on commit 067be96

Please sign in to comment.