OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_PPC | 7 #if V8_TARGET_ARCH_PPC |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
460 arg_count++; | 460 arg_count++; |
461 } | 461 } |
462 int32_t sp_delta = arg_count * kPointerSize; | 462 int32_t sp_delta = arg_count * kPointerSize; |
463 CodeGenerator::RecordPositions(masm_, function()->end_position() - 1); | 463 CodeGenerator::RecordPositions(masm_, function()->end_position() - 1); |
464 __ RecordJSReturn(); | 464 __ RecordJSReturn(); |
465 int no_frame_start = __ LeaveFrame(StackFrame::JAVA_SCRIPT, sp_delta); | 465 int no_frame_start = __ LeaveFrame(StackFrame::JAVA_SCRIPT, sp_delta); |
466 #if V8_TARGET_ARCH_PPC64 | 466 #if V8_TARGET_ARCH_PPC64 |
467 // With 64bit we may need nop() instructions to ensure we have | 467 // With 64bit we may need nop() instructions to ensure we have |
468 // enough space to SetDebugBreakAtReturn() | 468 // enough space to SetDebugBreakAtReturn() |
469 if (is_int16(sp_delta)) { | 469 if (is_int16(sp_delta)) { |
470 #if !V8_OOL_CONSTANT_POOL | |
471 masm_->nop(); | 470 masm_->nop(); |
472 #endif | |
473 masm_->nop(); | 471 masm_->nop(); |
474 } | 472 } |
475 #endif | 473 #endif |
476 __ blr(); | 474 __ blr(); |
477 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); | 475 info_->AddNoFrameRange(no_frame_start, masm_->pc_offset()); |
478 } | 476 } |
479 | 477 |
480 #ifdef DEBUG | 478 #ifdef DEBUG |
481 // Check that the size of the code used for returning is large enough | 479 // Check that the size of the code used for returning is large enough |
482 // for the debugger's requirements. | 480 // for the debugger's requirements. |
(...skipping 1804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2287 __ LoadP(r6, FieldMemOperand(r6, FixedArray::kLengthOffset)); | 2285 __ LoadP(r6, FieldMemOperand(r6, FixedArray::kLengthOffset)); |
2288 __ SmiUntag(r6, SetRC); | 2286 __ SmiUntag(r6, SetRC); |
2289 | 2287 |
2290 // If we are sending a value and there is no operand stack, we can jump back | 2288 // If we are sending a value and there is no operand stack, we can jump back |
2291 // in directly. | 2289 // in directly. |
2292 Label call_resume; | 2290 Label call_resume; |
2293 if (resume_mode == JSGeneratorObject::NEXT) { | 2291 if (resume_mode == JSGeneratorObject::NEXT) { |
2294 Label slow_resume; | 2292 Label slow_resume; |
2295 __ bne(&slow_resume, cr0); | 2293 __ bne(&slow_resume, cr0); |
2296 __ LoadP(ip, FieldMemOperand(r7, JSFunction::kCodeEntryOffset)); | 2294 __ LoadP(ip, FieldMemOperand(r7, JSFunction::kCodeEntryOffset)); |
2297 #if V8_OOL_CONSTANT_POOL | |
2298 { | 2295 { |
2299 ConstantPoolUnavailableScope constant_pool_unavailable(masm_); | |
2300 // Load the new code object's constant pool pointer. | |
2301 __ LoadP(kConstantPoolRegister, | |
2302 MemOperand(ip, Code::kConstantPoolOffset - Code::kHeaderSize)); | |
2303 #endif | |
2304 __ LoadP(r5, FieldMemOperand(r4, JSGeneratorObject::kContinuationOffset)); | 2296 __ LoadP(r5, FieldMemOperand(r4, JSGeneratorObject::kContinuationOffset)); |
2305 __ SmiUntag(r5); | 2297 __ SmiUntag(r5); |
2306 __ add(ip, ip, r5); | 2298 __ add(ip, ip, r5); |
2307 __ LoadSmiLiteral(r5, | 2299 __ LoadSmiLiteral(r5, |
2308 Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)); | 2300 Smi::FromInt(JSGeneratorObject::kGeneratorExecuting)); |
2309 __ StoreP(r5, FieldMemOperand(r4, JSGeneratorObject::kContinuationOffset), | 2301 __ StoreP(r5, FieldMemOperand(r4, JSGeneratorObject::kContinuationOffset), |
2310 r0); | 2302 r0); |
2311 __ Jump(ip); | 2303 __ Jump(ip); |
2312 __ bind(&slow_resume); | 2304 __ bind(&slow_resume); |
2313 #if V8_OOL_CONSTANT_POOL | |
2314 } | 2305 } |
2315 #endif | |
2316 } else { | 2306 } else { |
2317 __ beq(&call_resume, cr0); | 2307 __ beq(&call_resume, cr0); |
2318 } | 2308 } |
2319 | 2309 |
2320 // Otherwise, we push holes for the operand stack and call the runtime to fix | 2310 // Otherwise, we push holes for the operand stack and call the runtime to fix |
2321 // up the stack and the handlers. | 2311 // up the stack and the handlers. |
2322 Label operand_loop; | 2312 Label operand_loop; |
2323 __ mtctr(r6); | 2313 __ mtctr(r6); |
2324 __ bind(&operand_loop); | 2314 __ bind(&operand_loop); |
2325 __ push(r5); | 2315 __ push(r5); |
(...skipping 1450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3776 FIRST_SPEC_OBJECT_TYPE + 1); | 3766 FIRST_SPEC_OBJECT_TYPE + 1); |
3777 __ beq(&function); | 3767 __ beq(&function); |
3778 | 3768 |
3779 __ cmpi(r4, Operand(LAST_SPEC_OBJECT_TYPE)); | 3769 __ cmpi(r4, Operand(LAST_SPEC_OBJECT_TYPE)); |
3780 STATIC_ASSERT(LAST_NONCALLABLE_SPEC_OBJECT_TYPE == LAST_SPEC_OBJECT_TYPE - 1); | 3770 STATIC_ASSERT(LAST_NONCALLABLE_SPEC_OBJECT_TYPE == LAST_SPEC_OBJECT_TYPE - 1); |
3781 __ beq(&function); | 3771 __ beq(&function); |
3782 // Assume that there is no larger type. | 3772 // Assume that there is no larger type. |
3783 STATIC_ASSERT(LAST_NONCALLABLE_SPEC_OBJECT_TYPE == LAST_TYPE - 1); | 3773 STATIC_ASSERT(LAST_NONCALLABLE_SPEC_OBJECT_TYPE == LAST_TYPE - 1); |
3784 | 3774 |
3785 // Check if the constructor in the map is a JS function. | 3775 // Check if the constructor in the map is a JS function. |
3786 __ LoadP(r3, FieldMemOperand(r3, Map::kConstructorOffset)); | 3776 Register instance_type = r5; |
3787 __ CompareObjectType(r3, r4, r4, JS_FUNCTION_TYPE); | 3777 __ GetMapConstructor(r3, r3, r4, instance_type); |
| 3778 __ cmpi(instance_type, Operand(JS_FUNCTION_TYPE)); |
3788 __ bne(&non_function_constructor); | 3779 __ bne(&non_function_constructor); |
3789 | 3780 |
3790 // r3 now contains the constructor function. Grab the | 3781 // r3 now contains the constructor function. Grab the |
3791 // instance class name from there. | 3782 // instance class name from there. |
3792 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); | 3783 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); |
3793 __ LoadP(r3, | 3784 __ LoadP(r3, |
3794 FieldMemOperand(r3, SharedFunctionInfo::kInstanceClassNameOffset)); | 3785 FieldMemOperand(r3, SharedFunctionInfo::kInstanceClassNameOffset)); |
3795 __ b(&done); | 3786 __ b(&done); |
3796 | 3787 |
3797 // Functions have class 'Function'. | 3788 // Functions have class 'Function'. |
(...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5444 return ON_STACK_REPLACEMENT; | 5435 return ON_STACK_REPLACEMENT; |
5445 } | 5436 } |
5446 | 5437 |
5447 DCHECK(interrupt_address == | 5438 DCHECK(interrupt_address == |
5448 isolate->builtins()->OsrAfterStackCheck()->entry()); | 5439 isolate->builtins()->OsrAfterStackCheck()->entry()); |
5449 return OSR_AFTER_STACK_CHECK; | 5440 return OSR_AFTER_STACK_CHECK; |
5450 } | 5441 } |
5451 } | 5442 } |
5452 } // namespace v8::internal | 5443 } // namespace v8::internal |
5453 #endif // V8_TARGET_ARCH_PPC | 5444 #endif // V8_TARGET_ARCH_PPC |
OLD | NEW |