OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 | 292 |
293 // Input parameters: | 293 // Input parameters: |
294 // S4: arguments descriptor array. | 294 // S4: arguments descriptor array. |
295 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) { | 295 void StubCode::GenerateCallStaticFunctionStub(Assembler* assembler) { |
296 __ Comment("CallStaticFunctionStub"); | 296 __ Comment("CallStaticFunctionStub"); |
297 __ EnterStubFrame(); | 297 __ EnterStubFrame(); |
298 // Setup space on stack for return value and preserve arguments descriptor. | 298 // Setup space on stack for return value and preserve arguments descriptor. |
299 | 299 |
300 __ addiu(SP, SP, Immediate(-2 * kWordSize)); | 300 __ addiu(SP, SP, Immediate(-2 * kWordSize)); |
301 __ sw(S4, Address(SP, 1 * kWordSize)); | 301 __ sw(S4, Address(SP, 1 * kWordSize)); |
302 __ LoadObject(TMP, Object::null_object()); | 302 __ sw(ZR, Address(SP, 0 * kWordSize)); |
303 __ sw(TMP, Address(SP, 0 * kWordSize)); | |
304 | 303 |
305 __ CallRuntime(kPatchStaticCallRuntimeEntry, 0); | 304 __ CallRuntime(kPatchStaticCallRuntimeEntry, 0); |
306 __ Comment("CallStaticFunctionStub return"); | 305 __ Comment("CallStaticFunctionStub return"); |
307 | 306 |
308 // Get Code object result and restore arguments descriptor array. | 307 // Get Code object result and restore arguments descriptor array. |
309 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); | 308 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); |
310 __ lw(S4, Address(SP, 1 * kWordSize)); | 309 __ lw(S4, Address(SP, 1 * kWordSize)); |
311 __ addiu(SP, SP, Immediate(2 * kWordSize)); | 310 __ addiu(SP, SP, Immediate(2 * kWordSize)); |
312 | 311 |
313 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 312 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
(...skipping 10 matching lines...) Expand all Loading... |
324 // Load code pointer to this stub from the thread: | 323 // Load code pointer to this stub from the thread: |
325 // The one that is passed in, is not correct - it points to the code object | 324 // The one that is passed in, is not correct - it points to the code object |
326 // that needs to be replaced. | 325 // that needs to be replaced. |
327 __ lw(CODE_REG, Address(THR, Thread::fix_callers_target_code_offset())); | 326 __ lw(CODE_REG, Address(THR, Thread::fix_callers_target_code_offset())); |
328 // Create a stub frame as we are pushing some objects on the stack before | 327 // Create a stub frame as we are pushing some objects on the stack before |
329 // calling into the runtime. | 328 // calling into the runtime. |
330 __ EnterStubFrame(); | 329 __ EnterStubFrame(); |
331 // Setup space on stack for return value and preserve arguments descriptor. | 330 // Setup space on stack for return value and preserve arguments descriptor. |
332 __ addiu(SP, SP, Immediate(-2 * kWordSize)); | 331 __ addiu(SP, SP, Immediate(-2 * kWordSize)); |
333 __ sw(S4, Address(SP, 1 * kWordSize)); | 332 __ sw(S4, Address(SP, 1 * kWordSize)); |
334 __ LoadObject(TMP, Object::null_object()); | 333 __ sw(ZR, Address(SP, 0 * kWordSize)); |
335 __ sw(TMP, Address(SP, 0 * kWordSize)); | |
336 __ CallRuntime(kFixCallersTargetRuntimeEntry, 0); | 334 __ CallRuntime(kFixCallersTargetRuntimeEntry, 0); |
337 // Get Code object result and restore arguments descriptor array. | 335 // Get Code object result and restore arguments descriptor array. |
338 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); | 336 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); |
339 __ lw(S4, Address(SP, 1 * kWordSize)); | 337 __ lw(S4, Address(SP, 1 * kWordSize)); |
340 __ addiu(SP, SP, Immediate(2 * kWordSize)); | 338 __ addiu(SP, SP, Immediate(2 * kWordSize)); |
341 | 339 |
342 // Jump to the dart function. | 340 // Jump to the dart function. |
343 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 341 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
344 | 342 |
345 // Remove the stub frame. | 343 // Remove the stub frame. |
346 __ LeaveStubFrameAndReturn(T0); | 344 __ LeaveStubFrameAndReturn(T0); |
347 } | 345 } |
348 | 346 |
349 | 347 |
350 // Called from object allocate instruction when the allocation stub has been | 348 // Called from object allocate instruction when the allocation stub has been |
351 // disabled. | 349 // disabled. |
352 void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) { | 350 void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) { |
353 // Load code pointer to this stub from the thread: | 351 // Load code pointer to this stub from the thread: |
354 // The one that is passed in, is not correct - it points to the code object | 352 // The one that is passed in, is not correct - it points to the code object |
355 // that needs to be replaced. | 353 // that needs to be replaced. |
356 __ lw(CODE_REG, Address(THR, Thread::fix_allocation_stub_code_offset())); | 354 __ lw(CODE_REG, Address(THR, Thread::fix_allocation_stub_code_offset())); |
357 __ EnterStubFrame(); | 355 __ EnterStubFrame(); |
358 // Setup space on stack for return value. | 356 // Setup space on stack for return value. |
359 __ addiu(SP, SP, Immediate(-1 * kWordSize)); | 357 __ addiu(SP, SP, Immediate(-1 * kWordSize)); |
360 __ LoadObject(TMP, Object::null_object()); | 358 __ sw(ZR, Address(SP, 0 * kWordSize)); |
361 __ sw(TMP, Address(SP, 0 * kWordSize)); | |
362 __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0); | 359 __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0); |
363 // Get Code object result. | 360 // Get Code object result. |
364 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); | 361 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); |
365 __ addiu(SP, SP, Immediate(1 * kWordSize)); | 362 __ addiu(SP, SP, Immediate(1 * kWordSize)); |
366 | 363 |
367 // Jump to the dart function. | 364 // Jump to the dart function. |
368 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 365 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
369 | 366 |
370 // Remove the stub frame. | 367 // Remove the stub frame. |
371 __ LeaveStubFrameAndReturn(T0); | 368 __ LeaveStubFrameAndReturn(T0); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 __ sll(TMP, A1, 1); // A1 is a Smi. | 554 __ sll(TMP, A1, 1); // A1 is a Smi. |
558 __ addu(TMP, FP, TMP); | 555 __ addu(TMP, FP, TMP); |
559 __ lw(T6, Address(TMP, kParamEndSlotFromFp * kWordSize)); | 556 __ lw(T6, Address(TMP, kParamEndSlotFromFp * kWordSize)); |
560 | 557 |
561 // Push space for the return value. | 558 // Push space for the return value. |
562 // Push the receiver. | 559 // Push the receiver. |
563 // Push ICData/MegamorphicCache object. | 560 // Push ICData/MegamorphicCache object. |
564 // Push arguments descriptor array. | 561 // Push arguments descriptor array. |
565 // Push original arguments array. | 562 // Push original arguments array. |
566 __ addiu(SP, SP, Immediate(-4 * kWordSize)); | 563 __ addiu(SP, SP, Immediate(-4 * kWordSize)); |
567 __ LoadObject(TMP, Object::null_object()); | 564 __ sw(ZR, Address(SP, 3 * kWordSize)); |
568 __ sw(TMP, Address(SP, 3 * kWordSize)); | |
569 __ sw(T6, Address(SP, 2 * kWordSize)); | 565 __ sw(T6, Address(SP, 2 * kWordSize)); |
570 __ sw(S5, Address(SP, 1 * kWordSize)); | 566 __ sw(S5, Address(SP, 1 * kWordSize)); |
571 __ sw(S4, Address(SP, 0 * kWordSize)); | 567 __ sw(S4, Address(SP, 0 * kWordSize)); |
572 // A1: Smi-tagged arguments array length. | 568 // A1: Smi-tagged arguments array length. |
573 PushArgumentsArray(assembler); | 569 PushArgumentsArray(assembler); |
574 const intptr_t kNumArgs = 4; | 570 const intptr_t kNumArgs = 4; |
575 __ CallRuntime(kInvokeNoSuchMethodDispatcherRuntimeEntry, kNumArgs); | 571 __ CallRuntime(kInvokeNoSuchMethodDispatcherRuntimeEntry, kNumArgs); |
576 __ lw(V0, Address(SP, 4 * kWordSize)); // Return value. | 572 __ lw(V0, Address(SP, 4 * kWordSize)); // Return value. |
577 __ addiu(SP, SP, Immediate(5 * kWordSize)); | 573 __ addiu(SP, SP, Immediate(5 * kWordSize)); |
578 __ LeaveStubFrame(); | 574 __ LeaveStubFrame(); |
(...skipping 12 matching lines...) Expand all Loading... |
591 | 587 |
592 // Preserve IC data and arguments descriptor. | 588 // Preserve IC data and arguments descriptor. |
593 __ addiu(SP, SP, Immediate(-6 * kWordSize)); | 589 __ addiu(SP, SP, Immediate(-6 * kWordSize)); |
594 __ sw(S5, Address(SP, 5 * kWordSize)); | 590 __ sw(S5, Address(SP, 5 * kWordSize)); |
595 __ sw(S4, Address(SP, 4 * kWordSize)); | 591 __ sw(S4, Address(SP, 4 * kWordSize)); |
596 | 592 |
597 // Push space for the return value. | 593 // Push space for the return value. |
598 // Push the receiver. | 594 // Push the receiver. |
599 // Push IC data object. | 595 // Push IC data object. |
600 // Push arguments descriptor array. | 596 // Push arguments descriptor array. |
601 __ LoadObject(TMP, Object::null_object()); | 597 __ sw(ZR, Address(SP, 3 * kWordSize)); |
602 __ sw(TMP, Address(SP, 3 * kWordSize)); | |
603 __ sw(T6, Address(SP, 2 * kWordSize)); | 598 __ sw(T6, Address(SP, 2 * kWordSize)); |
604 __ sw(S5, Address(SP, 1 * kWordSize)); | 599 __ sw(S5, Address(SP, 1 * kWordSize)); |
605 __ sw(S4, Address(SP, 0 * kWordSize)); | 600 __ sw(S4, Address(SP, 0 * kWordSize)); |
606 | 601 |
607 __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3); | 602 __ CallRuntime(kMegamorphicCacheMissHandlerRuntimeEntry, 3); |
608 | 603 |
609 __ lw(T0, Address(SP, 3 * kWordSize)); // Get result function. | 604 __ lw(T0, Address(SP, 3 * kWordSize)); // Get result function. |
610 __ lw(S4, Address(SP, 4 * kWordSize)); // Restore argument descriptor. | 605 __ lw(S4, Address(SP, 4 * kWordSize)); // Restore argument descriptor. |
611 __ lw(S5, Address(SP, 5 * kWordSize)); // Restore IC data. | 606 __ lw(S5, Address(SP, 5 * kWordSize)); // Restore IC data. |
612 __ addiu(SP, SP, Immediate(6 * kWordSize)); | 607 __ addiu(SP, SP, Immediate(6 * kWordSize)); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 | 745 |
751 // Unable to allocate the array using the fast inline code, just call | 746 // Unable to allocate the array using the fast inline code, just call |
752 // into the runtime. | 747 // into the runtime. |
753 __ Bind(&slow_case); | 748 __ Bind(&slow_case); |
754 // Create a stub frame as we are pushing some objects on the stack before | 749 // Create a stub frame as we are pushing some objects on the stack before |
755 // calling into the runtime. | 750 // calling into the runtime. |
756 __ EnterStubFrame(); | 751 __ EnterStubFrame(); |
757 // Setup space on stack for return value. | 752 // Setup space on stack for return value. |
758 // Push array length as Smi and element type. | 753 // Push array length as Smi and element type. |
759 __ addiu(SP, SP, Immediate(-3 * kWordSize)); | 754 __ addiu(SP, SP, Immediate(-3 * kWordSize)); |
760 __ LoadObject(TMP, Object::null_object()); | 755 __ sw(ZR, Address(SP, 2 * kWordSize)); |
761 __ sw(TMP, Address(SP, 2 * kWordSize)); | |
762 __ sw(A1, Address(SP, 1 * kWordSize)); | 756 __ sw(A1, Address(SP, 1 * kWordSize)); |
763 __ sw(A0, Address(SP, 0 * kWordSize)); | 757 __ sw(A0, Address(SP, 0 * kWordSize)); |
764 __ CallRuntime(kAllocateArrayRuntimeEntry, 2); | 758 __ CallRuntime(kAllocateArrayRuntimeEntry, 2); |
765 __ Comment("AllocateArrayStub return"); | 759 __ Comment("AllocateArrayStub return"); |
766 // Pop arguments; result is popped in IP. | 760 // Pop arguments; result is popped in IP. |
767 __ lw(V0, Address(SP, 2 * kWordSize)); | 761 __ lw(V0, Address(SP, 2 * kWordSize)); |
768 __ lw(A1, Address(SP, 1 * kWordSize)); | 762 __ lw(A1, Address(SP, 1 * kWordSize)); |
769 __ lw(A0, Address(SP, 0 * kWordSize)); | 763 __ lw(A0, Address(SP, 0 * kWordSize)); |
770 __ addiu(SP, SP, Immediate(3 * kWordSize)); | 764 __ addiu(SP, SP, Immediate(3 * kWordSize)); |
771 | 765 |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1253 __ lw(A1, FieldAddress(S4, ArgumentsDescriptor::count_offset())); | 1247 __ lw(A1, FieldAddress(S4, ArgumentsDescriptor::count_offset())); |
1254 __ sll(TMP, A1, 1); // A1 is a Smi. | 1248 __ sll(TMP, A1, 1); // A1 is a Smi. |
1255 __ addu(TMP, FP, TMP); | 1249 __ addu(TMP, FP, TMP); |
1256 __ lw(T6, Address(TMP, kParamEndSlotFromFp * kWordSize)); | 1250 __ lw(T6, Address(TMP, kParamEndSlotFromFp * kWordSize)); |
1257 | 1251 |
1258 // Push space for the return value. | 1252 // Push space for the return value. |
1259 // Push the receiver. | 1253 // Push the receiver. |
1260 // Push arguments descriptor array. | 1254 // Push arguments descriptor array. |
1261 const intptr_t kNumArgs = 3; | 1255 const intptr_t kNumArgs = 3; |
1262 __ addiu(SP, SP, Immediate(-kNumArgs * kWordSize)); | 1256 __ addiu(SP, SP, Immediate(-kNumArgs * kWordSize)); |
1263 __ LoadObject(TMP, Object::null_object()); | 1257 __ sw(ZR, Address(SP, 2 * kWordSize)); |
1264 __ sw(TMP, Address(SP, 2 * kWordSize)); | |
1265 __ sw(T6, Address(SP, 1 * kWordSize)); | 1258 __ sw(T6, Address(SP, 1 * kWordSize)); |
1266 __ sw(S4, Address(SP, 0 * kWordSize)); | 1259 __ sw(S4, Address(SP, 0 * kWordSize)); |
1267 | 1260 |
1268 // A1: Smi-tagged arguments array length. | 1261 // A1: Smi-tagged arguments array length. |
1269 PushArgumentsArray(assembler); | 1262 PushArgumentsArray(assembler); |
1270 | 1263 |
1271 __ CallRuntime(kInvokeClosureNoSuchMethodRuntimeEntry, kNumArgs); | 1264 __ CallRuntime(kInvokeClosureNoSuchMethodRuntimeEntry, kNumArgs); |
1272 // noSuchMethod on closures always throws an error, so it will never return. | 1265 // noSuchMethod on closures always throws an error, so it will never return. |
1273 __ break_(0); | 1266 __ break_(0); |
1274 } | 1267 } |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1517 // T1: address of receiver. | 1510 // T1: address of receiver. |
1518 // Create a stub frame as we are pushing some objects on the stack before | 1511 // Create a stub frame as we are pushing some objects on the stack before |
1519 // calling into the runtime. | 1512 // calling into the runtime. |
1520 __ EnterStubFrame(); | 1513 __ EnterStubFrame(); |
1521 // Preserve IC data object and arguments descriptor array and | 1514 // Preserve IC data object and arguments descriptor array and |
1522 // setup space on stack for result (target code object). | 1515 // setup space on stack for result (target code object). |
1523 int num_slots = num_args + 4; | 1516 int num_slots = num_args + 4; |
1524 __ addiu(SP, SP, Immediate(-num_slots * kWordSize)); | 1517 __ addiu(SP, SP, Immediate(-num_slots * kWordSize)); |
1525 __ sw(S5, Address(SP, (num_slots - 1) * kWordSize)); | 1518 __ sw(S5, Address(SP, (num_slots - 1) * kWordSize)); |
1526 __ sw(S4, Address(SP, (num_slots - 2) * kWordSize)); | 1519 __ sw(S4, Address(SP, (num_slots - 2) * kWordSize)); |
1527 __ LoadObject(TMP, Object::null_object()); | 1520 __ sw(ZR, Address(SP, (num_slots - 3) * kWordSize)); |
1528 __ sw(TMP, Address(SP, (num_slots - 3) * kWordSize)); | |
1529 // Push call arguments. | 1521 // Push call arguments. |
1530 for (intptr_t i = 0; i < num_args; i++) { | 1522 for (intptr_t i = 0; i < num_args; i++) { |
1531 __ lw(TMP, Address(T1, -i * kWordSize)); | 1523 __ lw(TMP, Address(T1, -i * kWordSize)); |
1532 __ sw(TMP, Address(SP, (num_slots - i - 4) * kWordSize)); | 1524 __ sw(TMP, Address(SP, (num_slots - i - 4) * kWordSize)); |
1533 } | 1525 } |
1534 // Pass IC data object. | 1526 // Pass IC data object. |
1535 __ sw(S5, Address(SP, (num_slots - num_args - 4) * kWordSize)); | 1527 __ sw(S5, Address(SP, (num_slots - num_args - 4) * kWordSize)); |
1536 __ CallRuntime(handle_ic_miss, num_args + 1); | 1528 __ CallRuntime(handle_ic_miss, num_args + 1); |
1537 __ Comment("NArgsCheckInlineCacheStub return"); | 1529 __ Comment("NArgsCheckInlineCacheStub return"); |
1538 // Pop returned function object into T3. | 1530 // Pop returned function object into T3. |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1770 __ jr(T2); | 1762 __ jr(T2); |
1771 } | 1763 } |
1772 | 1764 |
1773 | 1765 |
1774 // S5: Contains an ICData. | 1766 // S5: Contains an ICData. |
1775 void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) { | 1767 void StubCode::GenerateICCallBreakpointStub(Assembler* assembler) { |
1776 __ Comment("ICCallBreakpoint stub"); | 1768 __ Comment("ICCallBreakpoint stub"); |
1777 __ EnterStubFrame(); | 1769 __ EnterStubFrame(); |
1778 __ addiu(SP, SP, Immediate(-2 * kWordSize)); | 1770 __ addiu(SP, SP, Immediate(-2 * kWordSize)); |
1779 __ sw(S5, Address(SP, 1 * kWordSize)); | 1771 __ sw(S5, Address(SP, 1 * kWordSize)); |
1780 __ LoadObject(TMP, Object::null_object()); | 1772 __ sw(ZR, Address(SP, 0 * kWordSize)); |
1781 __ sw(TMP, Address(SP, 0 * kWordSize)); | |
1782 | 1773 |
1783 __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0); | 1774 __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0); |
1784 | 1775 |
1785 __ lw(S5, Address(SP, 1 * kWordSize)); | 1776 __ lw(S5, Address(SP, 1 * kWordSize)); |
1786 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); | 1777 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); |
1787 __ addiu(SP, SP, Immediate(2 * kWordSize)); | 1778 __ addiu(SP, SP, Immediate(2 * kWordSize)); |
1788 __ LeaveStubFrame(); | 1779 __ LeaveStubFrame(); |
1789 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 1780 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
1790 __ jr(T0); | 1781 __ jr(T0); |
1791 } | 1782 } |
1792 | 1783 |
1793 | 1784 |
1794 void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) { | 1785 void StubCode::GenerateRuntimeCallBreakpointStub(Assembler* assembler) { |
1795 __ Comment("RuntimeCallBreakpoint stub"); | 1786 __ Comment("RuntimeCallBreakpoint stub"); |
1796 __ EnterStubFrame(); | 1787 __ EnterStubFrame(); |
1797 __ addiu(SP, SP, Immediate(-1 * kWordSize)); | 1788 __ addiu(SP, SP, Immediate(-1 * kWordSize)); |
1798 __ LoadObject(TMP, Object::null_object()); | 1789 __ sw(ZR, Address(SP, 0 * kWordSize)); |
1799 __ sw(TMP, Address(SP, 0 * kWordSize)); | |
1800 | 1790 |
1801 __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0); | 1791 __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0); |
1802 | 1792 |
1803 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); | 1793 __ lw(CODE_REG, Address(SP, 0 * kWordSize)); |
1804 __ addiu(SP, SP, Immediate(3 * kWordSize)); | 1794 __ addiu(SP, SP, Immediate(3 * kWordSize)); |
1805 __ LeaveStubFrame(); | 1795 __ LeaveStubFrame(); |
1806 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 1796 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
1807 __ jr(T0); | 1797 __ jr(T0); |
1808 } | 1798 } |
1809 | 1799 |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1985 | 1975 |
1986 // Calls to the runtime to optimize the given function. | 1976 // Calls to the runtime to optimize the given function. |
1987 // T0: function to be reoptimized. | 1977 // T0: function to be reoptimized. |
1988 // S4: argument descriptor (preserved). | 1978 // S4: argument descriptor (preserved). |
1989 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) { | 1979 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) { |
1990 __ Comment("OptimizeFunctionStub"); | 1980 __ Comment("OptimizeFunctionStub"); |
1991 __ EnterStubFrame(); | 1981 __ EnterStubFrame(); |
1992 __ addiu(SP, SP, Immediate(-3 * kWordSize)); | 1982 __ addiu(SP, SP, Immediate(-3 * kWordSize)); |
1993 __ sw(S4, Address(SP, 2 * kWordSize)); | 1983 __ sw(S4, Address(SP, 2 * kWordSize)); |
1994 // Setup space on stack for return value. | 1984 // Setup space on stack for return value. |
1995 __ LoadObject(TMP, Object::null_object()); | 1985 __ sw(ZR, Address(SP, 1 * kWordSize)); |
1996 __ sw(TMP, Address(SP, 1 * kWordSize)); | |
1997 __ sw(T0, Address(SP, 0 * kWordSize)); | 1986 __ sw(T0, Address(SP, 0 * kWordSize)); |
1998 __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1); | 1987 __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1); |
1999 __ Comment("OptimizeFunctionStub return"); | 1988 __ Comment("OptimizeFunctionStub return"); |
2000 __ lw(CODE_REG, Address(SP, 1 * kWordSize)); // Get Code object | 1989 __ lw(CODE_REG, Address(SP, 1 * kWordSize)); // Get Code object |
2001 __ lw(S4, Address(SP, 2 * kWordSize)); // Restore argument descriptor. | 1990 __ lw(S4, Address(SP, 2 * kWordSize)); // Restore argument descriptor. |
2002 __ addiu(SP, SP, Immediate(3 * kWordSize)); // Discard argument. | 1991 __ addiu(SP, SP, Immediate(3 * kWordSize)); // Discard argument. |
2003 | 1992 |
2004 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); | 1993 __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset())); |
2005 __ LeaveStubFrameAndReturn(T0); | 1994 __ LeaveStubFrameAndReturn(T0); |
2006 __ break_(0); | 1995 __ break_(0); |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2279 | 2268 |
2280 // Called from switchable IC calls. | 2269 // Called from switchable IC calls. |
2281 // T0: receiver | 2270 // T0: receiver |
2282 // S5: SingleTargetCache | 2271 // S5: SingleTargetCache |
2283 void StubCode::GenerateUnlinkedCallStub(Assembler* assembler) { | 2272 void StubCode::GenerateUnlinkedCallStub(Assembler* assembler) { |
2284 __ NoMonomorphicCheckedEntry(); | 2273 __ NoMonomorphicCheckedEntry(); |
2285 | 2274 |
2286 __ EnterStubFrame(); | 2275 __ EnterStubFrame(); |
2287 __ Push(T0); // Preserve receiver. | 2276 __ Push(T0); // Preserve receiver. |
2288 | 2277 |
2289 __ PushObject(Object::null_object()); // Result. | 2278 __ Push(ZR); // Result slot. |
2290 __ Push(T0); // Arg0: Receiver | 2279 __ Push(T0); // Arg0: Receiver |
2291 __ Push(S5); // Arg1: UnlinkedCall | 2280 __ Push(S5); // Arg1: UnlinkedCall |
2292 __ CallRuntime(kUnlinkedCallRuntimeEntry, 2); | 2281 __ CallRuntime(kUnlinkedCallRuntimeEntry, 2); |
2293 __ Drop(2); | 2282 __ Drop(2); |
2294 __ Pop(S5); // result = IC | 2283 __ Pop(S5); // result = IC |
2295 | 2284 |
2296 __ Pop(T0); // Restore receiver. | 2285 __ Pop(T0); // Restore receiver. |
2297 __ LeaveStubFrame(); | 2286 __ LeaveStubFrame(); |
2298 | 2287 |
2299 __ lw(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset())); | 2288 __ lw(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset())); |
2300 __ lw(T1, FieldAddress(CODE_REG, Code::checked_entry_point_offset())); | 2289 __ lw(T1, FieldAddress(CODE_REG, Code::checked_entry_point_offset())); |
2301 __ jr(T1); | 2290 __ jr(T1); |
(...skipping 18 matching lines...) Expand all Loading... |
2320 __ BranchUnsignedGreater(T1, T3, &miss); | 2309 __ BranchUnsignedGreater(T1, T3, &miss); |
2321 | 2310 |
2322 __ lw(T1, FieldAddress(S5, SingleTargetCache::entry_point_offset())); | 2311 __ lw(T1, FieldAddress(S5, SingleTargetCache::entry_point_offset())); |
2323 __ lw(CODE_REG, FieldAddress(S5, SingleTargetCache::target_offset())); | 2312 __ lw(CODE_REG, FieldAddress(S5, SingleTargetCache::target_offset())); |
2324 __ jr(T1); | 2313 __ jr(T1); |
2325 | 2314 |
2326 __ Bind(&miss); | 2315 __ Bind(&miss); |
2327 __ EnterStubFrame(); | 2316 __ EnterStubFrame(); |
2328 __ Push(T0); // Preserve receiver. | 2317 __ Push(T0); // Preserve receiver. |
2329 | 2318 |
2330 __ PushObject(Object::null_object()); // Result. | 2319 __ Push(ZR); // Result slot. |
2331 __ Push(T0); // Arg0: Receiver | 2320 __ Push(T0); // Arg0: Receiver |
2332 __ CallRuntime(kSingleTargetMissRuntimeEntry, 1); | 2321 __ CallRuntime(kSingleTargetMissRuntimeEntry, 1); |
2333 __ Drop(1); | 2322 __ Drop(1); |
2334 __ Pop(S5); // result = IC | 2323 __ Pop(S5); // result = IC |
2335 | 2324 |
2336 __ Pop(T0); // Restore receiver. | 2325 __ Pop(T0); // Restore receiver. |
2337 __ LeaveStubFrame(); | 2326 __ LeaveStubFrame(); |
2338 | 2327 |
2339 __ lw(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset())); | 2328 __ lw(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset())); |
2340 __ lw(T1, FieldAddress(CODE_REG, Code::checked_entry_point_offset())); | 2329 __ lw(T1, FieldAddress(CODE_REG, Code::checked_entry_point_offset())); |
2341 __ jr(T1); | 2330 __ jr(T1); |
2342 } | 2331 } |
2343 | 2332 |
2344 | 2333 |
2345 // Called from the monomorphic checked entry. | 2334 // Called from the monomorphic checked entry. |
2346 // T0: receiver | 2335 // T0: receiver |
2347 void StubCode::GenerateMonomorphicMissStub(Assembler* assembler) { | 2336 void StubCode::GenerateMonomorphicMissStub(Assembler* assembler) { |
2348 __ EnterStubFrame(); | 2337 __ EnterStubFrame(); |
2349 __ Push(T0); // Preserve receiver. | 2338 __ Push(T0); // Preserve receiver. |
2350 | 2339 |
2351 __ PushObject(Object::null_object()); // Result. | 2340 __ Push(ZR); // Result slot. |
2352 __ Push(T0); // Arg0: Receiver | 2341 __ Push(T0); // Arg0: Receiver |
2353 __ CallRuntime(kMonomorphicMissRuntimeEntry, 1); | 2342 __ CallRuntime(kMonomorphicMissRuntimeEntry, 1); |
2354 __ Drop(1); | 2343 __ Drop(1); |
2355 __ Pop(S5); // result = IC | 2344 __ Pop(S5); // result = IC |
2356 | 2345 |
2357 __ Pop(T0); // Restore receiver. | 2346 __ Pop(T0); // Restore receiver. |
2358 __ LeaveStubFrame(); | 2347 __ LeaveStubFrame(); |
2359 | 2348 |
2360 __ lw(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset())); | 2349 __ lw(CODE_REG, Address(THR, Thread::ic_lookup_through_code_stub_offset())); |
2361 __ lw(T1, FieldAddress(CODE_REG, Code::checked_entry_point_offset())); | 2350 __ lw(T1, FieldAddress(CODE_REG, Code::checked_entry_point_offset())); |
2362 __ jr(T1); | 2351 __ jr(T1); |
2363 } | 2352 } |
2364 | 2353 |
2365 | 2354 |
2366 void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) { | 2355 void StubCode::GenerateFrameAwaitingMaterializationStub(Assembler* assembler) { |
2367 __ break_(0); | 2356 __ break_(0); |
2368 } | 2357 } |
2369 | 2358 |
2370 } // namespace dart | 2359 } // namespace dart |
2371 | 2360 |
2372 #endif // defined TARGET_ARCH_MIPS | 2361 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |