| Index: src/mips/macro-assembler-mips.cc
|
| diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc
|
| index dedea2a044a21eb4f5f0e181b038d26b43b844eb..1a37d659270686d88bfb16ab8a8e9fba03620a20 100644
|
| --- a/src/mips/macro-assembler-mips.cc
|
| +++ b/src/mips/macro-assembler-mips.cc
|
| @@ -703,52 +703,114 @@ void MacroAssembler::li(Register rd, Operand j, bool gen2instr) {
|
|
|
|
|
| void MacroAssembler::MultiPush(RegList regs) {
|
| - int16_t NumSaved = 0;
|
| - int16_t NumToPush = NumberOfBitsSet(regs);
|
| + int16_t num_to_push = NumberOfBitsSet(regs);
|
| + int16_t stack_offset = num_to_push * kPointerSize;
|
|
|
| - addiu(sp, sp, -4 * NumToPush);
|
| + Subu(sp, sp, Operand(stack_offset));
|
| for (int16_t i = kNumRegisters; i > 0; i--) {
|
| if ((regs & (1 << i)) != 0) {
|
| - sw(ToRegister(i), MemOperand(sp, 4 * (NumToPush - ++NumSaved)));
|
| + stack_offset -= kPointerSize;
|
| + sw(ToRegister(i), MemOperand(sp, stack_offset));
|
| }
|
| }
|
| }
|
|
|
|
|
| void MacroAssembler::MultiPushReversed(RegList regs) {
|
| - int16_t NumSaved = 0;
|
| - int16_t NumToPush = NumberOfBitsSet(regs);
|
| + int16_t num_to_push = NumberOfBitsSet(regs);
|
| + int16_t stack_offset = num_to_push * kPointerSize;
|
|
|
| - addiu(sp, sp, -4 * NumToPush);
|
| + Subu(sp, sp, Operand(stack_offset));
|
| for (int16_t i = 0; i < kNumRegisters; i++) {
|
| if ((regs & (1 << i)) != 0) {
|
| - sw(ToRegister(i), MemOperand(sp, 4 * (NumToPush - ++NumSaved)));
|
| + stack_offset -= kPointerSize;
|
| + sw(ToRegister(i), MemOperand(sp, stack_offset));
|
| }
|
| }
|
| }
|
|
|
|
|
| void MacroAssembler::MultiPop(RegList regs) {
|
| - int16_t NumSaved = 0;
|
| + int16_t stack_offset = 0;
|
|
|
| for (int16_t i = 0; i < kNumRegisters; i++) {
|
| if ((regs & (1 << i)) != 0) {
|
| - lw(ToRegister(i), MemOperand(sp, 4 * (NumSaved++)));
|
| + lw(ToRegister(i), MemOperand(sp, stack_offset));
|
| + stack_offset += kPointerSize;
|
| }
|
| }
|
| - addiu(sp, sp, 4 * NumSaved);
|
| + addiu(sp, sp, stack_offset);
|
| }
|
|
|
|
|
| void MacroAssembler::MultiPopReversed(RegList regs) {
|
| - int16_t NumSaved = 0;
|
| + int16_t stack_offset = 0;
|
|
|
| for (int16_t i = kNumRegisters; i > 0; i--) {
|
| if ((regs & (1 << i)) != 0) {
|
| - lw(ToRegister(i), MemOperand(sp, 4 * (NumSaved++)));
|
| + lw(ToRegister(i), MemOperand(sp, stack_offset));
|
| + stack_offset += kPointerSize;
|
| }
|
| }
|
| - addiu(sp, sp, 4 * NumSaved);
|
| + addiu(sp, sp, stack_offset);
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::MultiPushFPU(RegList regs) {
|
| + CpuFeatures::Scope scope(FPU);
|
| + int16_t num_to_push = NumberOfBitsSet(regs);
|
| + int16_t stack_offset = num_to_push * kDoubleSize;
|
| +
|
| + Subu(sp, sp, Operand(stack_offset));
|
| + for (int16_t i = kNumRegisters; i > 0; i--) {
|
| + if ((regs & (1 << i)) != 0) {
|
| + stack_offset -= kDoubleSize;
|
| + sdc1(FPURegister::from_code(i), MemOperand(sp, stack_offset));
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::MultiPushReversedFPU(RegList regs) {
|
| + CpuFeatures::Scope scope(FPU);
|
| + int16_t num_to_push = NumberOfBitsSet(regs);
|
| + int16_t stack_offset = num_to_push * kDoubleSize;
|
| +
|
| + Subu(sp, sp, Operand(stack_offset));
|
| + for (int16_t i = 0; i < kNumRegisters; i++) {
|
| + if ((regs & (1 << i)) != 0) {
|
| + stack_offset -= kDoubleSize;
|
| + sdc1(FPURegister::from_code(i), MemOperand(sp, stack_offset));
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::MultiPopFPU(RegList regs) {
|
| + CpuFeatures::Scope scope(FPU);
|
| + int16_t stack_offset = 0;
|
| +
|
| + for (int16_t i = 0; i < kNumRegisters; i++) {
|
| + if ((regs & (1 << i)) != 0) {
|
| + ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset));
|
| + stack_offset += kDoubleSize;
|
| + }
|
| + }
|
| + addiu(sp, sp, stack_offset);
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::MultiPopReversedFPU(RegList regs) {
|
| + CpuFeatures::Scope scope(FPU);
|
| + int16_t stack_offset = 0;
|
| +
|
| + for (int16_t i = kNumRegisters; i > 0; i--) {
|
| + if ((regs & (1 << i)) != 0) {
|
| + ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset));
|
| + stack_offset += kDoubleSize;
|
| + }
|
| + }
|
| + addiu(sp, sp, stack_offset);
|
| }
|
|
|
|
|
| @@ -765,9 +827,7 @@ void MacroAssembler::Ext(Register rt,
|
| // Move rs to rt and shift it left then right to get the
|
| // desired bitfield on the right side and zeroes on the left.
|
| int shift_left = 32 - (pos + size);
|
| - if (shift_left > 0) {
|
| - sll(rt, rs, shift_left);
|
| - }
|
| + sll(rt, rs, shift_left); // Acts as a move if shift_left == 0.
|
|
|
| int shift_right = 32 - size;
|
| if (shift_right > 0) {
|
| @@ -1559,12 +1619,14 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| b(offset);
|
| break;
|
| case eq:
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| offset = shifted_branch_offset(L, false);
|
| beq(rs, r2, offset);
|
| break;
|
| case ne:
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| offset = shifted_branch_offset(L, false);
|
| @@ -1576,6 +1638,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| bgtz(rs, offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| slt(scratch, r2, rs);
|
| @@ -1592,6 +1655,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| beq(scratch, zero_reg, offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| slt(scratch, rs, r2);
|
| @@ -1608,6 +1672,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| bne(scratch, zero_reg, offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| slt(scratch, rs, r2);
|
| @@ -1620,6 +1685,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| blez(rs, offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| slt(scratch, r2, rs);
|
| @@ -1633,6 +1699,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| bgtz(rs, offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| sltu(scratch, r2, rs);
|
| @@ -1649,6 +1716,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| beq(scratch, zero_reg, offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| sltu(scratch, rs, r2);
|
| @@ -1665,6 +1733,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| bne(scratch, zero_reg, offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| sltu(scratch, rs, r2);
|
| @@ -1677,6 +1746,7 @@ void MacroAssembler::BranchShort(Label* L, Condition cond, Register rs,
|
| offset = shifted_branch_offset(L, false);
|
| b(offset);
|
| } else {
|
| + ASSERT(!scratch.is(rs));
|
| r2 = scratch;
|
| li(r2, rt);
|
| sltu(scratch, r2, rs);
|
| @@ -2745,6 +2815,46 @@ void MacroAssembler::AllocateAsciiConsString(Register result,
|
| }
|
|
|
|
|
| +void MacroAssembler::AllocateTwoByteSlicedString(Register result,
|
| + Register length,
|
| + Register scratch1,
|
| + Register scratch2,
|
| + Label* gc_required) {
|
| + AllocateInNewSpace(SlicedString::kSize,
|
| + result,
|
| + scratch1,
|
| + scratch2,
|
| + gc_required,
|
| + TAG_OBJECT);
|
| +
|
| + InitializeNewString(result,
|
| + length,
|
| + Heap::kSlicedStringMapRootIndex,
|
| + scratch1,
|
| + scratch2);
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::AllocateAsciiSlicedString(Register result,
|
| + Register length,
|
| + Register scratch1,
|
| + Register scratch2,
|
| + Label* gc_required) {
|
| + AllocateInNewSpace(SlicedString::kSize,
|
| + result,
|
| + scratch1,
|
| + scratch2,
|
| + gc_required,
|
| + TAG_OBJECT);
|
| +
|
| + InitializeNewString(result,
|
| + length,
|
| + Heap::kSlicedAsciiStringMapRootIndex,
|
| + scratch1,
|
| + scratch2);
|
| +}
|
| +
|
| +
|
| // Allocates a heap number or jumps to the label if the young space is full and
|
| // a scavenge is needed.
|
| void MacroAssembler::AllocateHeapNumber(Register result,
|
| @@ -4143,11 +4253,9 @@ void MacroAssembler::PrepareCallCFunction(int num_arguments, Register scratch) {
|
| // mips, even though those argument slots are not normally used.
|
| // Remaining arguments are pushed on the stack, above (higher address than)
|
| // the argument slots.
|
| - ASSERT(StandardFrameConstants::kCArgsSlotsSize % kPointerSize == 0);
|
| int stack_passed_arguments = ((num_arguments <= kRegisterPassedArguments) ?
|
| 0 : num_arguments - kRegisterPassedArguments) +
|
| - (StandardFrameConstants::kCArgsSlotsSize /
|
| - kPointerSize);
|
| + kCArgSlotCount;
|
| if (frame_alignment > kPointerSize) {
|
| // Make stack end at alignment and make room for num_arguments - 4 words
|
| // and the original value of sp.
|
| @@ -4219,11 +4327,9 @@ void MacroAssembler::CallCFunctionHelper(Register function,
|
|
|
| Call(function);
|
|
|
| - ASSERT(StandardFrameConstants::kCArgsSlotsSize % kPointerSize == 0);
|
| int stack_passed_arguments = ((num_arguments <= kRegisterPassedArguments) ?
|
| 0 : num_arguments - kRegisterPassedArguments) +
|
| - (StandardFrameConstants::kCArgsSlotsSize /
|
| - kPointerSize);
|
| + kCArgSlotCount;
|
|
|
| if (OS::ActivationFrameAlignment() > kPointerSize) {
|
| lw(sp, MemOperand(sp, stack_passed_arguments * kPointerSize));
|
|
|