@@ -1626,21 +1626,24 @@ void MacroAssembler::LoadIsolateField(Register dst, IsolateFieldId id) { |
1626 | 1626 | } |
1627 | 1627 |
|
1628 | 1628 | void MacroAssembler::MultiPush(RegList regs) { |
1629 | | - int16_t stack_offset = 0; |
| 1629 | + int16_t num_to_push = regs.Count(); |
| 1630 | + int16_t stack_offset = num_to_push * kSystemPointerSize; |
1630 | 1631 |
|
| 1632 | + Sub_d(sp, sp, Operand(stack_offset)); |
1631 | 1633 | for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
1632 | 1634 | if ((regs.bits() & (1 << i)) != 0) { |
1633 | 1635 | stack_offset -= kSystemPointerSize; |
1634 | 1636 | St_d(ToRegister(i), MemOperand(sp, stack_offset)); |
1635 | 1637 | } |
1636 | 1638 | } |
1637 | | - addi_d(sp, sp, stack_offset); |
1638 | 1639 | } |
1639 | 1640 |
|
1640 | 1641 | void MacroAssembler::MultiPush(RegList regs1, RegList regs2) { |
1641 | 1642 | DCHECK((regs1 & regs2).is_empty()); |
1642 | | - int16_t stack_offset = 0; |
| 1643 | + int16_t num_to_push = regs1.Count() + regs2.Count(); |
| 1644 | + int16_t stack_offset = num_to_push * kSystemPointerSize; |
1643 | 1645 |
|
| 1646 | + Sub_d(sp, sp, Operand(stack_offset)); |
1644 | 1647 | for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
1645 | 1648 | if ((regs1.bits() & (1 << i)) != 0) { |
1646 | 1649 | stack_offset -= kSystemPointerSize; |
@@ -1653,15 +1656,16 @@ void MacroAssembler::MultiPush(RegList regs1, RegList regs2) { |
1653 | 1656 | St_d(ToRegister(i), MemOperand(sp, stack_offset)); |
1654 | 1657 | } |
1655 | 1658 | } |
1656 | | - addi_d(sp, sp, stack_offset); |
1657 | 1659 | } |
1658 | 1660 |
|
1659 | 1661 | void MacroAssembler::MultiPush(RegList regs1, RegList regs2, RegList regs3) { |
1660 | 1662 | DCHECK((regs1 & regs2).is_empty()); |
1661 | 1663 | DCHECK((regs1 & regs3).is_empty()); |
1662 | 1664 | DCHECK((regs2 & regs3).is_empty()); |
1663 | | - int16_t stack_offset = 0; |
| 1665 | + int16_t num_to_push = regs1.Count() + regs2.Count() + regs3.Count(); |
| 1666 | + int16_t stack_offset = num_to_push * kSystemPointerSize; |
1664 | 1667 |
|
| 1668 | + Sub_d(sp, sp, Operand(stack_offset)); |
1665 | 1669 | for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
1666 | 1670 | if ((regs1.bits() & (1 << i)) != 0) { |
1667 | 1671 | stack_offset -= kSystemPointerSize; |
@@ -1680,7 +1684,6 @@ void MacroAssembler::MultiPush(RegList regs1, RegList regs2, RegList regs3) { |
1680 | 1684 | St_d(ToRegister(i), MemOperand(sp, stack_offset)); |
1681 | 1685 | } |
1682 | 1686 | } |
1683 | | - addi_d(sp, sp, stack_offset); |
1684 | 1687 | } |
1685 | 1688 |
|
1686 | 1689 | void MacroAssembler::MultiPop(RegList regs) { |
@@ -4125,9 +4128,8 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) { |
4125 | 4128 |
|
4126 | 4129 | void MacroAssembler::LeaveFrame(StackFrame::Type type) { |
4127 | 4130 | ASM_CODE_COMMENT(this); |
4128 | | - addi_d(sp, fp, 2 * kSystemPointerSize); |
4129 | | - Ld_d(ra, MemOperand(fp, 1 * kSystemPointerSize)); |
4130 | | - Ld_d(fp, MemOperand(fp, 0 * kSystemPointerSize)); |
| 4131 | + Move(sp, fp); |
| 4132 | + Pop(ra, fp); |
4131 | 4133 | } |
4132 | 4134 |
|
4133 | 4135 | void MacroAssembler::EnterExitFrame(Register scratch, int stack_space, |
|