@@ -1256,21 +1256,24 @@ void MacroAssembler::li(Register rd, Operand j, LiFlags mode) { |
1256 | 1256 | } |
1257 | 1257 |
|
1258 | 1258 | void MacroAssembler::MultiPush(RegList regs) { |
1259 | | - int16_t stack_offset = 0; |
| 1259 | + int16_t num_to_push = regs.Count(); |
| 1260 | + int16_t stack_offset = num_to_push * kSystemPointerSize; |
1260 | 1261 |
|
| 1262 | + Sub_d(sp, sp, Operand(stack_offset)); |
1261 | 1263 | for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
1262 | 1264 | if ((regs.bits() & (1 << i)) != 0) { |
1263 | 1265 | stack_offset -= kSystemPointerSize; |
1264 | 1266 | St_d(ToRegister(i), MemOperand(sp, stack_offset)); |
1265 | 1267 | } |
1266 | 1268 | } |
1267 | | - addi_d(sp, sp, stack_offset); |
1268 | 1269 | } |
1269 | 1270 |
|
1270 | 1271 | void MacroAssembler::MultiPush(RegList regs1, RegList regs2) { |
1271 | 1272 | DCHECK((regs1 & regs2).is_empty()); |
1272 | | - int16_t stack_offset = 0; |
| 1273 | + int16_t num_to_push = regs1.Count() + regs2.Count(); |
| 1274 | + int16_t stack_offset = num_to_push * kSystemPointerSize; |
1273 | 1275 |
|
| 1276 | + Sub_d(sp, sp, Operand(stack_offset)); |
1274 | 1277 | for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
1275 | 1278 | if ((regs1.bits() & (1 << i)) != 0) { |
1276 | 1279 | stack_offset -= kSystemPointerSize; |
@@ -1283,15 +1286,16 @@ void MacroAssembler::MultiPush(RegList regs1, RegList regs2) { |
1283 | 1286 | St_d(ToRegister(i), MemOperand(sp, stack_offset)); |
1284 | 1287 | } |
1285 | 1288 | } |
1286 | | - addi_d(sp, sp, stack_offset); |
1287 | 1289 | } |
1288 | 1290 |
|
1289 | 1291 | void MacroAssembler::MultiPush(RegList regs1, RegList regs2, RegList regs3) { |
1290 | 1292 | DCHECK((regs1 & regs2).is_empty()); |
1291 | 1293 | DCHECK((regs1 & regs3).is_empty()); |
1292 | 1294 | DCHECK((regs2 & regs3).is_empty()); |
1293 | | - int16_t stack_offset = 0; |
| 1295 | + int16_t num_to_push = regs1.Count() + regs2.Count() + regs3.Count(); |
| 1296 | + int16_t stack_offset = num_to_push * kSystemPointerSize; |
1294 | 1297 |
|
| 1298 | + Sub_d(sp, sp, Operand(stack_offset)); |
1295 | 1299 | for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
1296 | 1300 | if ((regs1.bits() & (1 << i)) != 0) { |
1297 | 1301 | stack_offset -= kSystemPointerSize; |
@@ -1310,7 +1314,6 @@ void MacroAssembler::MultiPush(RegList regs1, RegList regs2, RegList regs3) { |
1310 | 1314 | St_d(ToRegister(i), MemOperand(sp, stack_offset)); |
1311 | 1315 | } |
1312 | 1316 | } |
1313 | | - addi_d(sp, sp, stack_offset); |
1314 | 1317 | } |
1315 | 1318 |
|
1316 | 1319 | void MacroAssembler::MultiPop(RegList regs) { |
@@ -3563,9 +3566,8 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) { |
3563 | 3566 |
|
3564 | 3567 | void MacroAssembler::LeaveFrame(StackFrame::Type type) { |
3565 | 3568 | ASM_CODE_COMMENT(this); |
3566 | | - addi_d(sp, fp, 2 * kSystemPointerSize); |
3567 | | - Ld_d(ra, MemOperand(fp, 1 * kSystemPointerSize)); |
3568 | | - Ld_d(fp, MemOperand(fp, 0 * kSystemPointerSize)); |
| 3569 | + Move(sp, fp); |
| 3570 | + Pop(ra, fp); |
3569 | 3571 | } |
3570 | 3572 |
|
3571 | 3573 | void MacroAssembler::EnterExitFrame(int stack_space, |
|