| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2431 nop(); | 2431 nop(); |
| 2432 } | 2432 } |
| 2433 | 2433 |
| 2434 | 2434 |
| 2435 void MacroAssembler::Jump(intptr_t target, | 2435 void MacroAssembler::Jump(intptr_t target, |
| 2436 RelocInfo::Mode rmode, | 2436 RelocInfo::Mode rmode, |
| 2437 Condition cond, | 2437 Condition cond, |
| 2438 Register rs, | 2438 Register rs, |
| 2439 const Operand& rt, | 2439 const Operand& rt, |
| 2440 BranchDelaySlot bd) { | 2440 BranchDelaySlot bd) { |
| 2441 Label skip; |
| 2442 if (cond != cc_always) { |
| 2443 Branch(USE_DELAY_SLOT, &skip, NegateCondition(cond), rs, rt); |
| 2444 } |
| 2445 // The first instruction of 'li' may be placed in the delay slot. |
| 2446 // This is not an issue, t9 is expected to be clobbered anyway. |
| 2441 li(t9, Operand(target, rmode)); | 2447 li(t9, Operand(target, rmode)); |
| 2442 Jump(t9, cond, rs, rt, bd); | 2448 Jump(t9, al, zero_reg, Operand(zero_reg), bd); |
| 2449 bind(&skip); |
| 2443 } | 2450 } |
| 2444 | 2451 |
| 2445 | 2452 |
| 2446 void MacroAssembler::Jump(Address target, | 2453 void MacroAssembler::Jump(Address target, |
| 2447 RelocInfo::Mode rmode, | 2454 RelocInfo::Mode rmode, |
| 2448 Condition cond, | 2455 Condition cond, |
| 2449 Register rs, | 2456 Register rs, |
| 2450 const Operand& rt, | 2457 const Operand& rt, |
| 2451 BranchDelaySlot bd) { | 2458 BranchDelaySlot bd) { |
| 2452 ASSERT(!RelocInfo::IsCodeTarget(rmode)); | 2459 ASSERT(!RelocInfo::IsCodeTarget(rmode)); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2562 BranchDelaySlot bd) { | 2569 BranchDelaySlot bd) { |
| 2563 BlockTrampolinePoolScope block_trampoline_pool(this); | 2570 BlockTrampolinePoolScope block_trampoline_pool(this); |
| 2564 Label start; | 2571 Label start; |
| 2565 bind(&start); | 2572 bind(&start); |
| 2566 ASSERT(RelocInfo::IsCodeTarget(rmode)); | 2573 ASSERT(RelocInfo::IsCodeTarget(rmode)); |
| 2567 if (rmode == RelocInfo::CODE_TARGET && ast_id != kNoASTId) { | 2574 if (rmode == RelocInfo::CODE_TARGET && ast_id != kNoASTId) { |
| 2568 SetRecordedAstId(ast_id); | 2575 SetRecordedAstId(ast_id); |
| 2569 rmode = RelocInfo::CODE_TARGET_WITH_ID; | 2576 rmode = RelocInfo::CODE_TARGET_WITH_ID; |
| 2570 } | 2577 } |
| 2571 Call(reinterpret_cast<Address>(code.location()), rmode, cond, rs, rt, bd); | 2578 Call(reinterpret_cast<Address>(code.location()), rmode, cond, rs, rt, bd); |
| 2572 ASSERT_EQ(CallSize(code, rmode, ast_id, cond, rs, rt), | 2579 ASSERT_EQ(CallSize(code, rmode, ast_id, cond, rs, rt, bd), |
| 2573 SizeOfCodeGeneratedSince(&start)); | 2580 SizeOfCodeGeneratedSince(&start)); |
| 2574 } | 2581 } |
| 2575 | 2582 |
| 2576 | 2583 |
| 2577 void MacroAssembler::Ret(Condition cond, | 2584 void MacroAssembler::Ret(Condition cond, |
| 2578 Register rs, | 2585 Register rs, |
| 2579 const Operand& rt, | 2586 const Operand& rt, |
| 2580 BranchDelaySlot bd) { | 2587 BranchDelaySlot bd) { |
| 2581 Jump(ra, cond, rs, rt, bd); | 2588 Jump(ra, cond, rs, rt, bd); |
| 2582 } | 2589 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2632 lui(at, (imm32 & kHiMask) >> kLuiShift); | 2639 lui(at, (imm32 & kHiMask) >> kLuiShift); |
| 2633 ori(at, at, (imm32 & kImm16Mask)); | 2640 ori(at, at, (imm32 & kImm16Mask)); |
| 2634 } | 2641 } |
| 2635 jalr(at); | 2642 jalr(at); |
| 2636 | 2643 |
| 2637 // Emit a nop in the branch delay slot if required. | 2644 // Emit a nop in the branch delay slot if required. |
| 2638 if (bdslot == PROTECT) | 2645 if (bdslot == PROTECT) |
| 2639 nop(); | 2646 nop(); |
| 2640 } | 2647 } |
| 2641 | 2648 |
| 2649 void MacroAssembler::DropAndRet(int drop) { |
| 2650 Ret(USE_DELAY_SLOT); |
| 2651 addiu(sp, sp, drop * kPointerSize); |
| 2652 } |
| 2642 | 2653 |
| 2643 void MacroAssembler::DropAndRet(int drop, | 2654 void MacroAssembler::DropAndRet(int drop, |
| 2644 Condition cond, | 2655 Condition cond, |
| 2645 Register r1, | 2656 Register r1, |
| 2646 const Operand& r2) { | 2657 const Operand& r2) { |
| 2647 // This is a workaround to make sure only one branch instruction is | 2658 // Both Drop and Ret need to be conditional. |
| 2648 // generated. It relies on Drop and Ret not creating branches if | |
| 2649 // cond == cc_always. | |
| 2650 Label skip; | 2659 Label skip; |
| 2651 if (cond != cc_always) { | 2660 if (cond != cc_always) { |
| 2652 Branch(&skip, NegateCondition(cond), r1, r2); | 2661 Branch(&skip, NegateCondition(cond), r1, r2); |
| 2653 } | 2662 } |
| 2654 | 2663 |
| 2655 Drop(drop); | 2664 Drop(drop); |
| 2656 Ret(); | 2665 Ret(); |
| 2657 | 2666 |
| 2658 if (cond != cc_always) { | 2667 if (cond != cc_always) { |
| 2659 bind(&skip); | 2668 bind(&skip); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2706 | 2715 |
| 2707 void MacroAssembler::Push(Handle<Object> handle) { | 2716 void MacroAssembler::Push(Handle<Object> handle) { |
| 2708 li(at, Operand(handle)); | 2717 li(at, Operand(handle)); |
| 2709 push(at); | 2718 push(at); |
| 2710 } | 2719 } |
| 2711 | 2720 |
| 2712 | 2721 |
| 2713 #ifdef ENABLE_DEBUGGER_SUPPORT | 2722 #ifdef ENABLE_DEBUGGER_SUPPORT |
| 2714 | 2723 |
| 2715 void MacroAssembler::DebugBreak() { | 2724 void MacroAssembler::DebugBreak() { |
| 2716 mov(a0, zero_reg); | 2725 PrepareCEntryArgs(0); |
| 2717 li(a1, Operand(ExternalReference(Runtime::kDebugBreak, isolate()))); | 2726 PrepareCEntryFunction(ExternalReference(Runtime::kDebugBreak, isolate())); |
| 2718 CEntryStub ces(1); | 2727 CEntryStub ces(1); |
| 2719 ASSERT(AllowThisStubCall(&ces)); | 2728 ASSERT(AllowThisStubCall(&ces)); |
| 2720 Call(ces.GetCode(), RelocInfo::DEBUG_BREAK); | 2729 Call(ces.GetCode(), RelocInfo::DEBUG_BREAK); |
| 2721 } | 2730 } |
| 2722 | 2731 |
| 2723 #endif // ENABLE_DEBUGGER_SUPPORT | 2732 #endif // ENABLE_DEBUGGER_SUPPORT |
| 2724 | 2733 |
| 2725 | 2734 |
| 2726 // --------------------------------------------------------------------------- | 2735 // --------------------------------------------------------------------------- |
| 2727 // Exception handling. | 2736 // Exception handling. |
| (...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3869 Register map, | 3878 Register map, |
| 3870 Register type_reg) { | 3879 Register type_reg) { |
| 3871 lw(map, FieldMemOperand(object, HeapObject::kMapOffset)); | 3880 lw(map, FieldMemOperand(object, HeapObject::kMapOffset)); |
| 3872 lbu(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset)); | 3881 lbu(type_reg, FieldMemOperand(map, Map::kInstanceTypeOffset)); |
| 3873 } | 3882 } |
| 3874 | 3883 |
| 3875 | 3884 |
| 3876 // ----------------------------------------------------------------------------- | 3885 // ----------------------------------------------------------------------------- |
| 3877 // Runtime calls. | 3886 // Runtime calls. |
| 3878 | 3887 |
| 3879 void MacroAssembler::CallStub(CodeStub* stub, Condition cond, | 3888 void MacroAssembler::CallStub(CodeStub* stub, |
| 3880 Register r1, const Operand& r2) { | 3889 Condition cond, |
| 3890 Register r1, |
| 3891 const Operand& r2, |
| 3892 BranchDelaySlot bd) { |
| 3881 ASSERT(AllowThisStubCall(stub)); // Stub calls are not allowed in some stubs. | 3893 ASSERT(AllowThisStubCall(stub)); // Stub calls are not allowed in some stubs. |
| 3882 Call(stub->GetCode(), RelocInfo::CODE_TARGET, kNoASTId, cond, r1, r2); | 3894 Call(stub->GetCode(), RelocInfo::CODE_TARGET, kNoASTId, cond, r1, r2, bd); |
| 3883 } | 3895 } |
| 3884 | 3896 |
| 3885 | 3897 |
| 3886 void MacroAssembler::TailCallStub(CodeStub* stub) { | 3898 void MacroAssembler::TailCallStub(CodeStub* stub) { |
| 3887 ASSERT(allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe()); | 3899 ASSERT(allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe()); |
| 3888 Jump(stub->GetCode(), RelocInfo::CODE_TARGET); | 3900 Jump(stub->GetCode(), RelocInfo::CODE_TARGET); |
| 3889 } | 3901 } |
| 3890 | 3902 |
| 3891 | 3903 |
| 3892 static int AddressOffset(ExternalReference ref0, ExternalReference ref1) { | 3904 static int AddressOffset(ExternalReference ref0, ExternalReference ref1) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3955 lw(at, MemOperand(s3, kLimitOffset)); | 3967 lw(at, MemOperand(s3, kLimitOffset)); |
| 3956 Branch(&delete_allocated_handles, ne, s1, Operand(at)); | 3968 Branch(&delete_allocated_handles, ne, s1, Operand(at)); |
| 3957 | 3969 |
| 3958 // Check if the function scheduled an exception. | 3970 // Check if the function scheduled an exception. |
| 3959 bind(&leave_exit_frame); | 3971 bind(&leave_exit_frame); |
| 3960 LoadRoot(t0, Heap::kTheHoleValueRootIndex); | 3972 LoadRoot(t0, Heap::kTheHoleValueRootIndex); |
| 3961 li(at, Operand(ExternalReference::scheduled_exception_address(isolate()))); | 3973 li(at, Operand(ExternalReference::scheduled_exception_address(isolate()))); |
| 3962 lw(t1, MemOperand(at)); | 3974 lw(t1, MemOperand(at)); |
| 3963 Branch(&promote_scheduled_exception, ne, t0, Operand(t1)); | 3975 Branch(&promote_scheduled_exception, ne, t0, Operand(t1)); |
| 3964 li(s0, Operand(stack_space)); | 3976 li(s0, Operand(stack_space)); |
| 3965 LeaveExitFrame(false, s0); | 3977 LeaveExitFrame(false, s0, true); |
| 3966 Ret(); | |
| 3967 | 3978 |
| 3968 bind(&promote_scheduled_exception); | 3979 bind(&promote_scheduled_exception); |
| 3969 TailCallExternalReference( | 3980 TailCallExternalReference( |
| 3970 ExternalReference(Runtime::kPromoteScheduledException, isolate()), | 3981 ExternalReference(Runtime::kPromoteScheduledException, isolate()), |
| 3971 0, | 3982 0, |
| 3972 1); | 3983 1); |
| 3973 | 3984 |
| 3974 // HandleScope limit has changed. Delete allocated extensions. | 3985 // HandleScope limit has changed. Delete allocated extensions. |
| 3975 bind(&delete_allocated_handles); | 3986 bind(&delete_allocated_handles); |
| 3976 sw(s1, MemOperand(s3, kLimitOffset)); | 3987 sw(s1, MemOperand(s3, kLimitOffset)); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4154 // expectation. | 4165 // expectation. |
| 4155 if (f->nargs >= 0 && f->nargs != num_arguments) { | 4166 if (f->nargs >= 0 && f->nargs != num_arguments) { |
| 4156 IllegalOperation(num_arguments); | 4167 IllegalOperation(num_arguments); |
| 4157 return; | 4168 return; |
| 4158 } | 4169 } |
| 4159 | 4170 |
| 4160 // TODO(1236192): Most runtime routines don't need the number of | 4171 // TODO(1236192): Most runtime routines don't need the number of |
| 4161 // arguments passed in because it is constant. At some point we | 4172 // arguments passed in because it is constant. At some point we |
| 4162 // should remove this need and make the runtime routine entry code | 4173 // should remove this need and make the runtime routine entry code |
| 4163 // smarter. | 4174 // smarter. |
| 4164 li(a0, num_arguments); | 4175 PrepareCEntryArgs(num_arguments); |
| 4165 li(a1, Operand(ExternalReference(f, isolate()))); | 4176 PrepareCEntryFunction(ExternalReference(f, isolate())); |
| 4166 CEntryStub stub(1); | 4177 CEntryStub stub(1); |
| 4167 CallStub(&stub); | 4178 CallStub(&stub); |
| 4168 } | 4179 } |
| 4169 | 4180 |
| 4170 | 4181 |
| 4171 void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) { | 4182 void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) { |
| 4172 const Runtime::Function* function = Runtime::FunctionForId(id); | 4183 const Runtime::Function* function = Runtime::FunctionForId(id); |
| 4173 li(a0, Operand(function->nargs)); | 4184 PrepareCEntryArgs(function->nargs); |
| 4174 li(a1, Operand(ExternalReference(function, isolate()))); | 4185 PrepareCEntryFunction(ExternalReference(function, isolate())); |
| 4175 CEntryStub stub(1, kSaveFPRegs); | 4186 CEntryStub stub(1, kSaveFPRegs); |
| 4176 CallStub(&stub); | 4187 CallStub(&stub); |
| 4177 } | 4188 } |
| 4178 | 4189 |
| 4179 | 4190 |
| 4180 void MacroAssembler::CallRuntime(Runtime::FunctionId fid, int num_arguments) { | 4191 void MacroAssembler::CallRuntime(Runtime::FunctionId fid, int num_arguments) { |
| 4181 CallRuntime(Runtime::FunctionForId(fid), num_arguments); | 4192 CallRuntime(Runtime::FunctionForId(fid), num_arguments); |
| 4182 } | 4193 } |
| 4183 | 4194 |
| 4184 | 4195 |
| 4185 void MacroAssembler::CallExternalReference(const ExternalReference& ext, | 4196 void MacroAssembler::CallExternalReference(const ExternalReference& ext, |
| 4186 int num_arguments) { | 4197 int num_arguments, |
| 4187 li(a0, Operand(num_arguments)); | 4198 BranchDelaySlot bd) { |
| 4188 li(a1, Operand(ext)); | 4199 PrepareCEntryArgs(num_arguments); |
| 4200 PrepareCEntryFunction(ext); |
| 4189 | 4201 |
| 4190 CEntryStub stub(1); | 4202 CEntryStub stub(1); |
| 4191 CallStub(&stub); | 4203 CallStub(&stub, al, zero_reg, Operand(zero_reg), bd); |
| 4192 } | 4204 } |
| 4193 | 4205 |
| 4194 | 4206 |
| 4195 void MacroAssembler::TailCallExternalReference(const ExternalReference& ext, | 4207 void MacroAssembler::TailCallExternalReference(const ExternalReference& ext, |
| 4196 int num_arguments, | 4208 int num_arguments, |
| 4197 int result_size) { | 4209 int result_size) { |
| 4198 // TODO(1236192): Most runtime routines don't need the number of | 4210 // TODO(1236192): Most runtime routines don't need the number of |
| 4199 // arguments passed in because it is constant. At some point we | 4211 // arguments passed in because it is constant. At some point we |
| 4200 // should remove this need and make the runtime routine entry code | 4212 // should remove this need and make the runtime routine entry code |
| 4201 // smarter. | 4213 // smarter. |
| 4202 li(a0, Operand(num_arguments)); | 4214 PrepareCEntryArgs(num_arguments); |
| 4203 JumpToExternalReference(ext); | 4215 JumpToExternalReference(ext); |
| 4204 } | 4216 } |
| 4205 | 4217 |
| 4206 | 4218 |
| 4207 void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid, | 4219 void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid, |
| 4208 int num_arguments, | 4220 int num_arguments, |
| 4209 int result_size) { | 4221 int result_size) { |
| 4210 TailCallExternalReference(ExternalReference(fid, isolate()), | 4222 TailCallExternalReference(ExternalReference(fid, isolate()), |
| 4211 num_arguments, | 4223 num_arguments, |
| 4212 result_size); | 4224 result_size); |
| 4213 } | 4225 } |
| 4214 | 4226 |
| 4215 | 4227 |
| 4216 void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin) { | 4228 void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin, |
| 4217 li(a1, Operand(builtin)); | 4229 BranchDelaySlot bd) { |
| 4230 PrepareCEntryFunction(builtin); |
| 4218 CEntryStub stub(1); | 4231 CEntryStub stub(1); |
| 4219 Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 4232 Jump(stub.GetCode(), |
| 4233 RelocInfo::CODE_TARGET, |
| 4234 al, |
| 4235 zero_reg, |
| 4236 Operand(zero_reg), |
| 4237 bd); |
| 4220 } | 4238 } |
| 4221 | 4239 |
| 4222 | 4240 |
| 4223 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, | 4241 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, |
| 4224 InvokeFlag flag, | 4242 InvokeFlag flag, |
| 4225 const CallWrapper& call_wrapper) { | 4243 const CallWrapper& call_wrapper) { |
| 4226 // You can't call a builtin without a valid frame. | 4244 // You can't call a builtin without a valid frame. |
| 4227 ASSERT(flag == JUMP_FUNCTION || has_frame()); | 4245 ASSERT(flag == JUMP_FUNCTION || has_frame()); |
| 4228 | 4246 |
| 4229 GetBuiltinEntry(t9, id); | 4247 GetBuiltinEntry(t9, id); |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4556 } | 4574 } |
| 4557 | 4575 |
| 4558 // Set the exit frame sp value to point just before the return address | 4576 // Set the exit frame sp value to point just before the return address |
| 4559 // location. | 4577 // location. |
| 4560 addiu(at, sp, kPointerSize); | 4578 addiu(at, sp, kPointerSize); |
| 4561 sw(at, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 4579 sw(at, MemOperand(fp, ExitFrameConstants::kSPOffset)); |
| 4562 } | 4580 } |
| 4563 | 4581 |
| 4564 | 4582 |
| 4565 void MacroAssembler::LeaveExitFrame(bool save_doubles, | 4583 void MacroAssembler::LeaveExitFrame(bool save_doubles, |
| 4566 Register argument_count) { | 4584 Register argument_count, |
| 4585 bool do_return) { |
| 4567 // Optionally restore all double registers. | 4586 // Optionally restore all double registers. |
| 4568 if (save_doubles) { | 4587 if (save_doubles) { |
| 4569 // Remember: we only need to restore every 2nd double FPU value. | 4588 // Remember: we only need to restore every 2nd double FPU value. |
| 4570 lw(t8, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 4589 lw(t8, MemOperand(fp, ExitFrameConstants::kSPOffset)); |
| 4571 for (int i = 0; i < FPURegister::kNumRegisters; i+=2) { | 4590 for (int i = 0; i < FPURegister::kNumRegisters; i+=2) { |
| 4572 FPURegister reg = FPURegister::from_code(i); | 4591 FPURegister reg = FPURegister::from_code(i); |
| 4573 ldc1(reg, MemOperand(t8, i * kDoubleSize + kPointerSize)); | 4592 ldc1(reg, MemOperand(t8, i * kDoubleSize + kPointerSize)); |
| 4574 } | 4593 } |
| 4575 } | 4594 } |
| 4576 | 4595 |
| 4577 // Clear top frame. | 4596 // Clear top frame. |
| 4578 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); | 4597 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); |
| 4579 sw(zero_reg, MemOperand(t8)); | 4598 sw(zero_reg, MemOperand(t8)); |
| 4580 | 4599 |
| 4581 // Restore current context from top and clear it in debug mode. | 4600 // Restore current context from top and clear it in debug mode. |
| 4582 li(t8, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); | 4601 li(t8, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); |
| 4583 lw(cp, MemOperand(t8)); | 4602 lw(cp, MemOperand(t8)); |
| 4584 #ifdef DEBUG | 4603 #ifdef DEBUG |
| 4585 sw(a3, MemOperand(t8)); | 4604 sw(a3, MemOperand(t8)); |
| 4586 #endif | 4605 #endif |
| 4587 | 4606 |
| 4588 // Pop the arguments, restore registers, and return. | 4607 // Pop the arguments, restore registers, and return. |
| 4589 mov(sp, fp); // Respect ABI stack constraint. | 4608 mov(sp, fp); // Respect ABI stack constraint. |
| 4590 lw(fp, MemOperand(sp, ExitFrameConstants::kCallerFPOffset)); | 4609 lw(fp, MemOperand(sp, ExitFrameConstants::kCallerFPOffset)); |
| 4591 lw(ra, MemOperand(sp, ExitFrameConstants::kCallerPCOffset)); | 4610 lw(ra, MemOperand(sp, ExitFrameConstants::kCallerPCOffset)); |
| 4592 addiu(sp, sp, 8); | 4611 |
| 4593 if (argument_count.is_valid()) { | 4612 if (argument_count.is_valid()) { |
| 4594 sll(t8, argument_count, kPointerSizeLog2); | 4613 sll(t8, argument_count, kPointerSizeLog2); |
| 4595 addu(sp, sp, t8); | 4614 addu(sp, sp, t8); |
| 4596 } | 4615 } |
| 4616 |
| 4617 if (do_return) { |
| 4618 Ret(USE_DELAY_SLOT); |
| 4619 // If returning, the instruction in the delay slot will be the addiu below. |
| 4620 } |
| 4621 addiu(sp, sp, 8); |
| 4597 } | 4622 } |
| 4598 | 4623 |
| 4599 | 4624 |
| 4600 void MacroAssembler::InitializeNewString(Register string, | 4625 void MacroAssembler::InitializeNewString(Register string, |
| 4601 Register length, | 4626 Register length, |
| 4602 Heap::RootListIndex map_index, | 4627 Heap::RootListIndex map_index, |
| 4603 Register scratch1, | 4628 Register scratch1, |
| 4604 Register scratch2) { | 4629 Register scratch2) { |
| 4605 sll(scratch1, length, kSmiTagSize); | 4630 sll(scratch1, length, kSmiTagSize); |
| 4606 LoadRoot(scratch2, map_index); | 4631 LoadRoot(scratch2, map_index); |
| (...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5389 opcode == BGTZL); | 5414 opcode == BGTZL); |
| 5390 opcode = (cond == eq) ? BEQ : BNE; | 5415 opcode = (cond == eq) ? BEQ : BNE; |
| 5391 instr = (instr & ~kOpcodeMask) | opcode; | 5416 instr = (instr & ~kOpcodeMask) | opcode; |
| 5392 masm_.emit(instr); | 5417 masm_.emit(instr); |
| 5393 } | 5418 } |
| 5394 | 5419 |
| 5395 | 5420 |
| 5396 } } // namespace v8::internal | 5421 } } // namespace v8::internal |
| 5397 | 5422 |
| 5398 #endif // V8_TARGET_ARCH_MIPS | 5423 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |