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 | 5 |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #if V8_TARGET_ARCH_MIPS64 | 9 #if V8_TARGET_ARCH_MIPS64 |
10 | 10 |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 __ Branch(&ok, hs, sp, Operand(a4)); | 307 __ Branch(&ok, hs, sp, Operand(a4)); |
308 | 308 |
309 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); | 309 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode); |
310 GenerateTailCallToReturnedCode(masm); | 310 GenerateTailCallToReturnedCode(masm); |
311 | 311 |
312 __ bind(&ok); | 312 __ bind(&ok); |
313 GenerateTailCallToSharedCode(masm); | 313 GenerateTailCallToSharedCode(masm); |
314 } | 314 } |
315 | 315 |
316 | 316 |
| 317 static void Generate_Runtime_NewObject(MacroAssembler* masm, |
| 318 bool create_memento, |
| 319 Register original_constructor, |
| 320 Label* count_incremented, |
| 321 Label* allocated) { |
| 322 if (create_memento) { |
| 323 // Get the cell or allocation site. |
| 324 __ ld(a2, MemOperand(sp, 2 * kPointerSize)); |
| 325 __ push(a2); |
| 326 } |
| 327 |
| 328 __ push(a1); // argument for Runtime_NewObject |
| 329 __ push(original_constructor); // original constructor |
| 330 if (create_memento) { |
| 331 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 3); |
| 332 } else { |
| 333 __ CallRuntime(Runtime::kNewObject, 2); |
| 334 } |
| 335 __ mov(t0, v0); |
| 336 |
| 337 // Runtime_NewObjectWithAllocationSite increments allocation count. |
| 338 // Skip the increment. |
| 339 if (create_memento) { |
| 340 __ jmp(count_incremented); |
| 341 } else { |
| 342 __ jmp(allocated); |
| 343 } |
| 344 } |
| 345 |
| 346 |
317 static void Generate_JSConstructStubHelper(MacroAssembler* masm, | 347 static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
318 bool is_api_function, | 348 bool is_api_function, |
319 bool create_memento) { | 349 bool create_memento) { |
320 // ----------- S t a t e ------------- | 350 // ----------- S t a t e ------------- |
321 // -- a0 : number of arguments | 351 // -- a0 : number of arguments |
322 // -- a1 : constructor function | 352 // -- a1 : constructor function |
323 // -- a2 : allocation site or undefined | 353 // -- a2 : allocation site or undefined |
| 354 // -- a3 : original constructor |
324 // -- ra : return address | 355 // -- ra : return address |
325 // -- sp[...]: constructor arguments | 356 // -- sp[...]: constructor arguments |
326 // ----------------------------------- | 357 // ----------------------------------- |
327 | 358 |
328 // Should never create mementos for api functions. | 359 // Should never create mementos for api functions. |
329 DCHECK(!is_api_function || !create_memento); | 360 DCHECK(!is_api_function || !create_memento); |
330 | 361 |
331 Isolate* isolate = masm->isolate(); | 362 Isolate* isolate = masm->isolate(); |
332 | 363 |
333 // ----------- S t a t e ------------- | 364 // ----------- S t a t e ------------- |
334 // -- a0 : number of arguments | 365 // -- a0 : number of arguments |
335 // -- a1 : constructor function | 366 // -- a1 : constructor function |
336 // -- ra : return address | 367 // -- ra : return address |
337 // -- sp[...]: constructor arguments | 368 // -- sp[...]: constructor arguments |
338 // ----------------------------------- | 369 // ----------------------------------- |
339 | 370 |
340 // Enter a construct frame. | 371 // Enter a construct frame. |
341 { | 372 { |
342 FrameScope scope(masm, StackFrame::CONSTRUCT); | 373 FrameScope scope(masm, StackFrame::CONSTRUCT); |
343 | 374 |
344 if (create_memento) { | 375 if (create_memento) { |
345 __ AssertUndefinedOrAllocationSite(a2, a3); | 376 __ AssertUndefinedOrAllocationSite(a2, t0); |
346 __ push(a2); | 377 __ push(a2); |
347 } | 378 } |
348 | 379 |
349 // Preserve the two incoming parameters on the stack. | 380 // Preserve the two incoming parameters on the stack. |
350 // Tag arguments count. | 381 // Tag arguments count. |
351 __ dsll32(a0, a0, 0); | 382 __ dsll32(a0, a0, 0); |
352 __ MultiPushReversed(a0.bit() | a1.bit()); | 383 __ MultiPushReversed(a0.bit() | a1.bit()); |
353 | 384 |
354 Label rt_call, allocated; | 385 Label rt_call, allocated, normal_new, count_incremented; |
| 386 __ Branch(&normal_new, eq, a1, Operand(a3)); |
| 387 |
| 388 // Original constructor and function are different. |
| 389 Generate_Runtime_NewObject(masm, create_memento, a3, &count_incremented, |
| 390 &allocated); |
| 391 __ bind(&normal_new); |
| 392 |
355 // Try to allocate the object without transitioning into C code. If any of | 393 // Try to allocate the object without transitioning into C code. If any of |
356 // the preconditions is not met, the code bails out to the runtime call. | 394 // the preconditions is not met, the code bails out to the runtime call. |
357 if (FLAG_inline_new) { | 395 if (FLAG_inline_new) { |
358 Label undo_allocation; | 396 Label undo_allocation; |
359 ExternalReference debug_step_in_fp = | 397 ExternalReference debug_step_in_fp = |
360 ExternalReference::debug_step_in_fp_address(isolate); | 398 ExternalReference::debug_step_in_fp_address(isolate); |
361 __ li(a2, Operand(debug_step_in_fp)); | 399 __ li(a2, Operand(debug_step_in_fp)); |
362 __ ld(a2, MemOperand(a2)); | 400 __ ld(a2, MemOperand(a2)); |
363 __ Branch(&rt_call, ne, a2, Operand(zero_reg)); | 401 __ Branch(&rt_call, ne, a2, Operand(zero_reg)); |
364 | 402 |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 // example, the map's unused properties potentially do not match the | 628 // example, the map's unused properties potentially do not match the |
591 // allocated objects unused properties. | 629 // allocated objects unused properties. |
592 // t0: JSObject (previous new top) | 630 // t0: JSObject (previous new top) |
593 __ bind(&undo_allocation); | 631 __ bind(&undo_allocation); |
594 __ UndoAllocationInNewSpace(t0, t1); | 632 __ UndoAllocationInNewSpace(t0, t1); |
595 } | 633 } |
596 | 634 |
597 // Allocate the new receiver object using the runtime call. | 635 // Allocate the new receiver object using the runtime call. |
598 // a1: constructor function | 636 // a1: constructor function |
599 __ bind(&rt_call); | 637 __ bind(&rt_call); |
600 if (create_memento) { | 638 Generate_Runtime_NewObject(masm, create_memento, a1, &count_incremented, |
601 // Get the cell or allocation site. | 639 &allocated); |
602 __ ld(a2, MemOperand(sp, 2 * kPointerSize)); | |
603 __ push(a2); | |
604 } | |
605 | 640 |
606 __ push(a1); // Argument for Runtime_NewObject. | |
607 if (create_memento) { | |
608 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2); | |
609 } else { | |
610 __ CallRuntime(Runtime::kNewObject, 1); | |
611 } | |
612 __ mov(t0, v0); | |
613 | |
614 // If we ended up using the runtime, and we want a memento, then the | |
615 // runtime call made it for us, and we shouldn't do create count | |
616 // increment. | |
617 Label count_incremented; | |
618 if (create_memento) { | |
619 __ jmp(&count_incremented); | |
620 } | |
621 | 641 |
622 // Receiver for constructor call allocated. | 642 // Receiver for constructor call allocated. |
623 // t0: JSObject | 643 // t0: JSObject |
624 __ bind(&allocated); | 644 __ bind(&allocated); |
625 | 645 |
626 if (create_memento) { | 646 if (create_memento) { |
627 __ ld(a2, MemOperand(sp, kPointerSize * 2)); | 647 __ ld(a2, MemOperand(sp, kPointerSize * 2)); |
628 __ LoadRoot(t1, Heap::kUndefinedValueRootIndex); | 648 __ LoadRoot(t1, Heap::kUndefinedValueRootIndex); |
629 __ Branch(&count_incremented, eq, a2, Operand(t1)); | 649 __ Branch(&count_incremented, eq, a2, Operand(t1)); |
630 // a2 is an AllocationSite. We are creating a memento from it, so we | 650 // a2 is an AllocationSite. We are creating a memento from it, so we |
(...skipping 945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1576 __ break_(0xCC); | 1596 __ break_(0xCC); |
1577 } | 1597 } |
1578 } | 1598 } |
1579 | 1599 |
1580 | 1600 |
1581 #undef __ | 1601 #undef __ |
1582 | 1602 |
1583 } } // namespace v8::internal | 1603 } } // namespace v8::internal |
1584 | 1604 |
1585 #endif // V8_TARGET_ARCH_MIPS64 | 1605 #endif // V8_TARGET_ARCH_MIPS64 |
OLD | NEW |