OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if V8_TARGET_ARCH_MIPS64 | 5 #if V8_TARGET_ARCH_MIPS64 |
6 | 6 |
7 #include "src/codegen.h" | 7 #include "src/codegen.h" |
8 #include "src/debug/debug.h" | 8 #include "src/debug/debug.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 __ CallRuntime(Runtime::kNewObject, 2); | 297 __ CallRuntime(Runtime::kNewObject, 2); |
298 __ Pop(a0); | 298 __ Pop(a0); |
299 } | 299 } |
300 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset)); | 300 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset)); |
301 __ Ret(); | 301 __ Ret(); |
302 } | 302 } |
303 | 303 |
304 | 304 |
305 static void CallRuntimePassFunction( | 305 static void CallRuntimePassFunction( |
306 MacroAssembler* masm, Runtime::FunctionId function_id) { | 306 MacroAssembler* masm, Runtime::FunctionId function_id) { |
| 307 // ----------- S t a t e ------------- |
| 308 // -- a1 : target function (preserved for callee) |
| 309 // -- a3 : new target (preserved for callee) |
| 310 // ----------------------------------- |
| 311 |
307 FrameScope scope(masm, StackFrame::INTERNAL); | 312 FrameScope scope(masm, StackFrame::INTERNAL); |
308 // Push a copy of the function onto the stack. | 313 // Push a copy of the function onto the stack. |
309 // Push call kind information and function as parameter to the runtime call. | 314 // Push a copy of the target function and the new target. |
310 __ Push(a1, a1); | 315 __ Push(a1, a3, a1); |
311 | 316 |
312 __ CallRuntime(function_id, 1); | 317 __ CallRuntime(function_id, 1); |
313 // Restore call kind information and receiver. | 318 // Restore target function and new target. |
314 __ Pop(a1); | 319 __ Pop(a1, a3); |
315 } | 320 } |
316 | 321 |
317 | 322 |
318 static void GenerateTailCallToSharedCode(MacroAssembler* masm) { | 323 static void GenerateTailCallToSharedCode(MacroAssembler* masm) { |
319 __ ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); | 324 __ ld(a2, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); |
320 __ ld(a2, FieldMemOperand(a2, SharedFunctionInfo::kCodeOffset)); | 325 __ ld(a2, FieldMemOperand(a2, SharedFunctionInfo::kCodeOffset)); |
321 __ Daddu(at, a2, Operand(Code::kHeaderSize - kHeapObjectTag)); | 326 __ Daddu(at, a2, Operand(Code::kHeaderSize - kHeapObjectTag)); |
322 __ Jump(at); | 327 __ Jump(at); |
323 } | 328 } |
324 | 329 |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 __ PushRoot(Heap::kTheHoleValueRootIndex); | 544 __ PushRoot(Heap::kTheHoleValueRootIndex); |
540 } | 545 } |
541 | 546 |
542 // Set up pointer to last argument. | 547 // Set up pointer to last argument. |
543 __ Daddu(a2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); | 548 __ Daddu(a2, fp, Operand(StandardFrameConstants::kCallerSPOffset)); |
544 | 549 |
545 // Copy arguments and receiver to the expression stack. | 550 // Copy arguments and receiver to the expression stack. |
546 // a0: number of arguments | 551 // a0: number of arguments |
547 // a1: constructor function | 552 // a1: constructor function |
548 // a2: address of last argument (caller sp) | 553 // a2: address of last argument (caller sp) |
549 // a3: number of arguments (smi-tagged) | 554 // a3: new target |
| 555 // t0: number of arguments (smi-tagged) |
550 // sp[0]: receiver | 556 // sp[0]: receiver |
551 // sp[1]: receiver | 557 // sp[1]: receiver |
552 // sp[2]: new.target | 558 // sp[2]: new.target |
553 // sp[3]: number of arguments (smi-tagged) | 559 // sp[3]: number of arguments (smi-tagged) |
554 Label loop, entry; | 560 Label loop, entry; |
555 __ mov(a3, a0); | 561 __ mov(t0, a0); |
556 __ jmp(&entry); | 562 __ jmp(&entry); |
557 __ bind(&loop); | 563 __ bind(&loop); |
558 __ dsll(a4, a3, kPointerSizeLog2); | 564 __ dsll(a4, t0, kPointerSizeLog2); |
559 __ Daddu(a4, a2, Operand(a4)); | 565 __ Daddu(a4, a2, Operand(a4)); |
560 __ ld(a5, MemOperand(a4)); | 566 __ ld(a5, MemOperand(a4)); |
561 __ push(a5); | 567 __ push(a5); |
562 __ bind(&entry); | 568 __ bind(&entry); |
563 __ Daddu(a3, a3, Operand(-1)); | 569 __ Daddu(t0, t0, Operand(-1)); |
564 __ Branch(&loop, greater_equal, a3, Operand(zero_reg)); | 570 __ Branch(&loop, greater_equal, t0, Operand(zero_reg)); |
565 | 571 |
566 // Call the function. | 572 // Call the function. |
567 // a0: number of arguments | 573 // a0: number of arguments |
568 // a1: constructor function | 574 // a1: constructor function |
| 575 // a3: new target |
569 if (is_api_function) { | 576 if (is_api_function) { |
570 __ ld(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); | 577 __ ld(cp, FieldMemOperand(a1, JSFunction::kContextOffset)); |
571 Handle<Code> code = | 578 Handle<Code> code = |
572 masm->isolate()->builtins()->HandleApiCallConstruct(); | 579 masm->isolate()->builtins()->HandleApiCallConstruct(); |
573 __ Call(code, RelocInfo::CODE_TARGET); | 580 __ Call(code, RelocInfo::CODE_TARGET); |
574 } else { | 581 } else { |
575 ParameterCount actual(a0); | 582 ParameterCount actual(a0); |
576 __ InvokeFunction(a1, actual, CALL_FUNCTION, NullCallWrapper()); | 583 __ InvokeFunction(a1, a3, actual, CALL_FUNCTION, NullCallWrapper()); |
577 } | 584 } |
578 | 585 |
579 // Store offset of return address for deoptimizer. | 586 // Store offset of return address for deoptimizer. |
580 if (create_implicit_receiver && !is_api_function) { | 587 if (create_implicit_receiver && !is_api_function) { |
581 masm->isolate()->heap()->SetConstructStubDeoptPCOffset(masm->pc_offset()); | 588 masm->isolate()->heap()->SetConstructStubDeoptPCOffset(masm->pc_offset()); |
582 } | 589 } |
583 | 590 |
584 // Restore context from the frame. | 591 // Restore context from the frame. |
585 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 592 __ ld(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); |
586 | 593 |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 // crawls in MakeCodeYoung. This seems a bit fragile. | 993 // crawls in MakeCodeYoung. This seems a bit fragile. |
987 | 994 |
988 // Set a0 to point to the head of the PlatformCodeAge sequence. | 995 // Set a0 to point to the head of the PlatformCodeAge sequence. |
989 __ Dsubu(a0, a0, | 996 __ Dsubu(a0, a0, |
990 Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize)); | 997 Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize)); |
991 | 998 |
992 // The following registers must be saved and restored when calling through to | 999 // The following registers must be saved and restored when calling through to |
993 // the runtime: | 1000 // the runtime: |
994 // a0 - contains return address (beginning of patch sequence) | 1001 // a0 - contains return address (beginning of patch sequence) |
995 // a1 - isolate | 1002 // a1 - isolate |
| 1003 // a3 - new target |
996 RegList saved_regs = | 1004 RegList saved_regs = |
997 (a0.bit() | a1.bit() | ra.bit() | fp.bit()) & ~sp.bit(); | 1005 (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit(); |
998 FrameScope scope(masm, StackFrame::MANUAL); | 1006 FrameScope scope(masm, StackFrame::MANUAL); |
999 __ MultiPush(saved_regs); | 1007 __ MultiPush(saved_regs); |
1000 __ PrepareCallCFunction(2, 0, a2); | 1008 __ PrepareCallCFunction(2, 0, a2); |
1001 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate()))); | 1009 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate()))); |
1002 __ CallCFunction( | 1010 __ CallCFunction( |
1003 ExternalReference::get_make_code_young_function(masm->isolate()), 2); | 1011 ExternalReference::get_make_code_young_function(masm->isolate()), 2); |
1004 __ MultiPop(saved_regs); | 1012 __ MultiPop(saved_regs); |
1005 __ Jump(a0); | 1013 __ Jump(a0); |
1006 } | 1014 } |
1007 | 1015 |
(...skipping 17 matching lines...) Expand all Loading... |
1025 // pointers. | 1033 // pointers. |
1026 | 1034 |
1027 // Set a0 to point to the head of the PlatformCodeAge sequence. | 1035 // Set a0 to point to the head of the PlatformCodeAge sequence. |
1028 __ Dsubu(a0, a0, | 1036 __ Dsubu(a0, a0, |
1029 Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize)); | 1037 Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize)); |
1030 | 1038 |
1031 // The following registers must be saved and restored when calling through to | 1039 // The following registers must be saved and restored when calling through to |
1032 // the runtime: | 1040 // the runtime: |
1033 // a0 - contains return address (beginning of patch sequence) | 1041 // a0 - contains return address (beginning of patch sequence) |
1034 // a1 - isolate | 1042 // a1 - isolate |
| 1043 // a3 - new target |
1035 RegList saved_regs = | 1044 RegList saved_regs = |
1036 (a0.bit() | a1.bit() | ra.bit() | fp.bit()) & ~sp.bit(); | 1045 (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit(); |
1037 FrameScope scope(masm, StackFrame::MANUAL); | 1046 FrameScope scope(masm, StackFrame::MANUAL); |
1038 __ MultiPush(saved_regs); | 1047 __ MultiPush(saved_regs); |
1039 __ PrepareCallCFunction(2, 0, a2); | 1048 __ PrepareCallCFunction(2, 0, a2); |
1040 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate()))); | 1049 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate()))); |
1041 __ CallCFunction( | 1050 __ CallCFunction( |
1042 ExternalReference::get_mark_code_as_executed_function(masm->isolate()), | 1051 ExternalReference::get_mark_code_as_executed_function(masm->isolate()), |
1043 2); | 1052 2); |
1044 __ MultiPop(saved_regs); | 1053 __ MultiPop(saved_regs); |
1045 | 1054 |
1046 // Perform prologue operations usually performed by the young code stub. | 1055 // Perform prologue operations usually performed by the young code stub. |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1559 | 1568 |
1560 // ----------- S t a t e ------------- | 1569 // ----------- S t a t e ------------- |
1561 // -- a0 : the number of arguments (not including the receiver) | 1570 // -- a0 : the number of arguments (not including the receiver) |
1562 // -- a1 : the function to call (checked to be a JSFunction) | 1571 // -- a1 : the function to call (checked to be a JSFunction) |
1563 // -- a2 : the shared function info. | 1572 // -- a2 : the shared function info. |
1564 // -- cp : the function context. | 1573 // -- cp : the function context. |
1565 // ----------------------------------- | 1574 // ----------------------------------- |
1566 | 1575 |
1567 __ lw(a2, | 1576 __ lw(a2, |
1568 FieldMemOperand(a2, SharedFunctionInfo::kFormalParameterCountOffset)); | 1577 FieldMemOperand(a2, SharedFunctionInfo::kFormalParameterCountOffset)); |
1569 __ ld(a3, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); | 1578 __ ld(t0, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); |
1570 ParameterCount actual(a0); | 1579 ParameterCount actual(a0); |
1571 ParameterCount expected(a2); | 1580 ParameterCount expected(a2); |
1572 __ InvokeCode(a3, expected, actual, JUMP_FUNCTION, NullCallWrapper()); | 1581 __ InvokeCode(t0, no_reg, expected, actual, JUMP_FUNCTION, NullCallWrapper()); |
1573 | 1582 |
1574 // The function is a "classConstructor", need to raise an exception. | 1583 // The function is a "classConstructor", need to raise an exception. |
1575 __ bind(&class_constructor); | 1584 __ bind(&class_constructor); |
1576 { | 1585 { |
1577 FrameScope frame(masm, StackFrame::INTERNAL); | 1586 FrameScope frame(masm, StackFrame::INTERNAL); |
1578 __ CallRuntime(Runtime::kThrowConstructorNonCallableError, 0); | 1587 __ CallRuntime(Runtime::kThrowConstructorNonCallableError, 0); |
1579 } | 1588 } |
1580 } | 1589 } |
1581 | 1590 |
1582 | 1591 |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 } | 1877 } |
1869 } | 1878 } |
1870 | 1879 |
1871 | 1880 |
1872 #undef __ | 1881 #undef __ |
1873 | 1882 |
1874 } // namespace internal | 1883 } // namespace internal |
1875 } // namespace v8 | 1884 } // namespace v8 |
1876 | 1885 |
1877 #endif // V8_TARGET_ARCH_MIPS64 | 1886 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |