| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1651 jr(t9); // Will generate only one instruction. | 1651 jr(t9); // Will generate only one instruction. |
| 1652 } | 1652 } |
| 1653 } | 1653 } |
| 1654 } | 1654 } |
| 1655 // Emit a nop in the branch delay slot if required. | 1655 // Emit a nop in the branch delay slot if required. |
| 1656 if (bdslot == PROTECT) | 1656 if (bdslot == PROTECT) |
| 1657 nop(); | 1657 nop(); |
| 1658 } | 1658 } |
| 1659 | 1659 |
| 1660 | 1660 |
| 1661 int MacroAssembler::CallSize(Handle<Code> code, RelocInfo::Mode rmode) { |
| 1662 UNIMPLEMENTED_MIPS(); |
| 1663 return 0; |
| 1664 } |
| 1665 |
| 1666 |
| 1667 int MacroAssembler::CallSize(Register reg) { |
| 1668 UNIMPLEMENTED_MIPS(); |
| 1669 return 0; |
| 1670 } |
| 1671 |
| 1672 |
| 1661 // Note: To call gcc-compiled C code on mips, you must call thru t9. | 1673 // Note: To call gcc-compiled C code on mips, you must call thru t9. |
| 1662 void MacroAssembler::Call(const Operand& target, BranchDelaySlot bdslot) { | 1674 void MacroAssembler::Call(const Operand& target, BranchDelaySlot bdslot) { |
| 1663 BlockTrampolinePoolScope block_trampoline_pool(this); | 1675 BlockTrampolinePoolScope block_trampoline_pool(this); |
| 1664 if (target.is_reg()) { | 1676 if (target.is_reg()) { |
| 1665 jalr(target.rm()); | 1677 jalr(target.rm()); |
| 1666 } else { // !target.is_reg() | 1678 } else { // !target.is_reg() |
| 1667 if (!MustUseReg(target.rmode_)) { | 1679 if (!MustUseReg(target.rmode_)) { |
| 1668 jal(target.imm32_); | 1680 jal(target.imm32_); |
| 1669 } else { // MustUseReg(target) | 1681 } else { // MustUseReg(target) |
| 1670 li(t9, target); | 1682 li(t9, target); |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2236 | 2248 |
| 2237 // ----------------------------------------------------------------------------- | 2249 // ----------------------------------------------------------------------------- |
| 2238 // JavaScript invokes | 2250 // JavaScript invokes |
| 2239 | 2251 |
| 2240 void MacroAssembler::InvokePrologue(const ParameterCount& expected, | 2252 void MacroAssembler::InvokePrologue(const ParameterCount& expected, |
| 2241 const ParameterCount& actual, | 2253 const ParameterCount& actual, |
| 2242 Handle<Code> code_constant, | 2254 Handle<Code> code_constant, |
| 2243 Register code_reg, | 2255 Register code_reg, |
| 2244 Label* done, | 2256 Label* done, |
| 2245 InvokeFlag flag, | 2257 InvokeFlag flag, |
| 2246 PostCallGenerator* post_call_generator) { | 2258 CallWrapper* call_wrapper) { |
| 2247 bool definitely_matches = false; | 2259 bool definitely_matches = false; |
| 2248 Label regular_invoke; | 2260 Label regular_invoke; |
| 2249 | 2261 |
| 2250 // Check whether the expected and actual arguments count match. If not, | 2262 // Check whether the expected and actual arguments count match. If not, |
| 2251 // setup registers according to contract with ArgumentsAdaptorTrampoline: | 2263 // setup registers according to contract with ArgumentsAdaptorTrampoline: |
| 2252 // a0: actual arguments count | 2264 // a0: actual arguments count |
| 2253 // a1: function (passed through to callee) | 2265 // a1: function (passed through to callee) |
| 2254 // a2: expected arguments count | 2266 // a2: expected arguments count |
| 2255 // a3: callee code entry | 2267 // a3: callee code entry |
| 2256 | 2268 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2289 | 2301 |
| 2290 if (!definitely_matches) { | 2302 if (!definitely_matches) { |
| 2291 if (!code_constant.is_null()) { | 2303 if (!code_constant.is_null()) { |
| 2292 li(a3, Operand(code_constant)); | 2304 li(a3, Operand(code_constant)); |
| 2293 addiu(a3, a3, Code::kHeaderSize - kHeapObjectTag); | 2305 addiu(a3, a3, Code::kHeaderSize - kHeapObjectTag); |
| 2294 } | 2306 } |
| 2295 | 2307 |
| 2296 Handle<Code> adaptor = | 2308 Handle<Code> adaptor = |
| 2297 isolate()->builtins()->ArgumentsAdaptorTrampoline(); | 2309 isolate()->builtins()->ArgumentsAdaptorTrampoline(); |
| 2298 if (flag == CALL_FUNCTION) { | 2310 if (flag == CALL_FUNCTION) { |
| 2311 if (call_wrapper != NULL) { |
| 2312 call_wrapper->BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET)); |
| 2313 } |
| 2299 Call(adaptor, RelocInfo::CODE_TARGET); | 2314 Call(adaptor, RelocInfo::CODE_TARGET); |
| 2300 if (post_call_generator != NULL) post_call_generator->Generate(); | 2315 if (call_wrapper != NULL) call_wrapper->AfterCall(); |
| 2301 jmp(done); | 2316 jmp(done); |
| 2302 } else { | 2317 } else { |
| 2303 Jump(adaptor, RelocInfo::CODE_TARGET); | 2318 Jump(adaptor, RelocInfo::CODE_TARGET); |
| 2304 } | 2319 } |
| 2305 bind(®ular_invoke); | 2320 bind(®ular_invoke); |
| 2306 } | 2321 } |
| 2307 } | 2322 } |
| 2308 | 2323 |
| 2309 | 2324 |
| 2310 void MacroAssembler::InvokeCode(Register code, | 2325 void MacroAssembler::InvokeCode(Register code, |
| 2311 const ParameterCount& expected, | 2326 const ParameterCount& expected, |
| 2312 const ParameterCount& actual, | 2327 const ParameterCount& actual, |
| 2313 InvokeFlag flag, | 2328 InvokeFlag flag, |
| 2314 PostCallGenerator* post_call_generator) { | 2329 CallWrapper* call_wrapper) { |
| 2315 Label done; | 2330 Label done; |
| 2316 | 2331 |
| 2317 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag, | 2332 InvokePrologue(expected, actual, Handle<Code>::null(), code, &done, flag, |
| 2318 post_call_generator); | 2333 call_wrapper); |
| 2319 if (flag == CALL_FUNCTION) { | 2334 if (flag == CALL_FUNCTION) { |
| 2320 Call(code); | 2335 Call(code); |
| 2321 } else { | 2336 } else { |
| 2322 ASSERT(flag == JUMP_FUNCTION); | 2337 ASSERT(flag == JUMP_FUNCTION); |
| 2323 Jump(code); | 2338 Jump(code); |
| 2324 } | 2339 } |
| 2325 // Continue here if InvokePrologue does handle the invocation due to | 2340 // Continue here if InvokePrologue does handle the invocation due to |
| 2326 // mismatched parameter counts. | 2341 // mismatched parameter counts. |
| 2327 bind(&done); | 2342 bind(&done); |
| 2328 } | 2343 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2343 } | 2358 } |
| 2344 // Continue here if InvokePrologue does handle the invocation due to | 2359 // Continue here if InvokePrologue does handle the invocation due to |
| 2345 // mismatched parameter counts. | 2360 // mismatched parameter counts. |
| 2346 bind(&done); | 2361 bind(&done); |
| 2347 } | 2362 } |
| 2348 | 2363 |
| 2349 | 2364 |
| 2350 void MacroAssembler::InvokeFunction(Register function, | 2365 void MacroAssembler::InvokeFunction(Register function, |
| 2351 const ParameterCount& actual, | 2366 const ParameterCount& actual, |
| 2352 InvokeFlag flag, | 2367 InvokeFlag flag, |
| 2353 PostCallGenerator* post_call_generator) { | 2368 CallWrapper* call_wrapper) { |
| 2354 // Contract with called JS functions requires that function is passed in a1. | 2369 // Contract with called JS functions requires that function is passed in a1. |
| 2355 ASSERT(function.is(a1)); | 2370 ASSERT(function.is(a1)); |
| 2356 Register expected_reg = a2; | 2371 Register expected_reg = a2; |
| 2357 Register code_reg = a3; | 2372 Register code_reg = a3; |
| 2358 | 2373 |
| 2359 lw(code_reg, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 2374 lw(code_reg, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
| 2360 lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 2375 lw(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
| 2361 lw(expected_reg, | 2376 lw(expected_reg, |
| 2362 FieldMemOperand(code_reg, | 2377 FieldMemOperand(code_reg, |
| 2363 SharedFunctionInfo::kFormalParameterCountOffset)); | 2378 SharedFunctionInfo::kFormalParameterCountOffset)); |
| 2364 sra(expected_reg, expected_reg, kSmiTagSize); | 2379 sra(expected_reg, expected_reg, kSmiTagSize); |
| 2365 lw(code_reg, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); | 2380 lw(code_reg, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
| 2366 | 2381 |
| 2367 ParameterCount expected(expected_reg); | 2382 ParameterCount expected(expected_reg); |
| 2368 InvokeCode(code_reg, expected, actual, flag, post_call_generator); | 2383 InvokeCode(code_reg, expected, actual, flag, call_wrapper); |
| 2369 } | 2384 } |
| 2370 | 2385 |
| 2371 | 2386 |
| 2372 void MacroAssembler::InvokeFunction(JSFunction* function, | 2387 void MacroAssembler::InvokeFunction(JSFunction* function, |
| 2373 const ParameterCount& actual, | 2388 const ParameterCount& actual, |
| 2374 InvokeFlag flag) { | 2389 InvokeFlag flag) { |
| 2375 ASSERT(function->is_compiled()); | 2390 ASSERT(function->is_compiled()); |
| 2376 | 2391 |
| 2377 // Get the function and setup the context. | 2392 // Get the function and setup the context. |
| 2378 li(a1, Operand(Handle<JSFunction>(function))); | 2393 li(a1, Operand(Handle<JSFunction>(function))); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2635 | 2650 |
| 2636 void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin) { | 2651 void MacroAssembler::JumpToExternalReference(const ExternalReference& builtin) { |
| 2637 li(a1, Operand(builtin)); | 2652 li(a1, Operand(builtin)); |
| 2638 CEntryStub stub(1); | 2653 CEntryStub stub(1); |
| 2639 Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 2654 Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
| 2640 } | 2655 } |
| 2641 | 2656 |
| 2642 | 2657 |
| 2643 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, | 2658 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, |
| 2644 InvokeFlag flag, | 2659 InvokeFlag flag, |
| 2645 PostCallGenerator* post_call_generator) { | 2660 CallWrapper* call_wrapper) { |
| 2646 GetBuiltinEntry(t9, id); | 2661 GetBuiltinEntry(t9, id); |
| 2647 if (flag == CALL_FUNCTION) { | 2662 if (flag == CALL_FUNCTION) { |
| 2663 if (call_wrapper != NULL) call_wrapper->BeforeCall(CallSize(t9)); |
| 2648 Call(t9); | 2664 Call(t9); |
| 2649 if (post_call_generator != NULL) post_call_generator->Generate(); | 2665 if (call_wrapper != NULL) call_wrapper->AfterCall(); |
| 2650 } else { | 2666 } else { |
| 2651 ASSERT(flag == JUMP_FUNCTION); | 2667 ASSERT(flag == JUMP_FUNCTION); |
| 2652 Jump(t9); | 2668 Jump(t9); |
| 2653 } | 2669 } |
| 2654 } | 2670 } |
| 2655 | 2671 |
| 2656 | 2672 |
| 2657 void MacroAssembler::GetBuiltinFunction(Register target, | 2673 void MacroAssembler::GetBuiltinFunction(Register target, |
| 2658 Builtins::JavaScript id) { | 2674 Builtins::JavaScript id) { |
| 2659 // Load the builtins object into target register. | 2675 // Load the builtins object into target register. |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3318 masm()->emit(reinterpret_cast<Instr>(addr)); | 3334 masm()->emit(reinterpret_cast<Instr>(addr)); |
| 3319 } | 3335 } |
| 3320 | 3336 |
| 3321 | 3337 |
| 3322 #endif // ENABLE_DEBUGGER_SUPPORT | 3338 #endif // ENABLE_DEBUGGER_SUPPORT |
| 3323 | 3339 |
| 3324 | 3340 |
| 3325 } } // namespace v8::internal | 3341 } } // namespace v8::internal |
| 3326 | 3342 |
| 3327 #endif // V8_TARGET_ARCH_MIPS | 3343 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |