ARM: Make the exception return form of ldm restore CPSR.

This commit is contained in:
Gabe Black 2009-11-15 00:23:14 -08:00
parent 903fb8c73d
commit 9127ee5ac8

View file

@ -210,6 +210,7 @@ inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
microOps[0] = new MicroAddiUop(machInst, INTREG_UREG0, RN, 0); microOps[0] = new MicroAddiUop(machInst, INTREG_UREG0, RN, 0);
unsigned reg = 0; unsigned reg = 0;
bool forceUser = machInst.puswl.psruser;
for (int i = 1; i < ones + 1; i++) { for (int i = 1; i < ones + 1; i++) {
// Find the next register. // Find the next register.
while (!bits(regs, reg)) while (!bits(regs, reg))
@ -217,13 +218,19 @@ inline %(class_name)s::%(class_name)s(ExtMachInst machInst)
replaceBits(regs, reg, 0); replaceBits(regs, reg, 0);
unsigned regIdx = reg; unsigned regIdx = reg;
if (machInst.puswl.psruser) { if (forceUser) {
regIdx = intRegForceUser(regIdx); regIdx = intRegForceUser(regIdx);
} }
if (machInst.puswl.loadOp) { if (machInst.puswl.loadOp) {
microOps[i] = if (reg == INTREG_PC && forceUser) {
new MicroLdrUop(machInst, regIdx, INTREG_UREG0, addr); // This must be the exception return form of ldm.
microOps[i] =
new MicroLdrRetUop(machInst, regIdx, INTREG_UREG0, addr);
} else {
microOps[i] =
new MicroLdrUop(machInst, regIdx, INTREG_UREG0, addr);
}
} else { } else {
microOps[i] = microOps[i] =
new MicroStrUop(machInst, regIdx, INTREG_UREG0, addr); new MicroStrUop(machInst, regIdx, INTREG_UREG0, addr);