| 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/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
| 9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| 11 #include "src/ic/handler-compiler.h" | 11 #include "src/ic/handler-compiler.h" |
| 12 #include "src/ic/ic.h" | 12 #include "src/ic/ic.h" |
| 13 #include "src/ic/stub-cache.h" | 13 #include "src/ic/stub-cache.h" |
| 14 #include "src/isolate.h" | 14 #include "src/isolate.h" |
| 15 #include "src/mips64/code-stubs-mips64.h" | 15 #include "src/mips64/code-stubs-mips64.h" |
| 16 #include "src/regexp/jsregexp.h" | 16 #include "src/regexp/jsregexp.h" |
| 17 #include "src/regexp/regexp-macro-assembler.h" | 17 #include "src/regexp/regexp-macro-assembler.h" |
| 18 #include "src/runtime/runtime.h" | 18 #include "src/runtime/runtime.h" |
| 19 | 19 |
| 20 namespace v8 { | 20 namespace v8 { |
| 21 namespace internal { | 21 namespace internal { |
| 22 | 22 |
| 23 #define __ ACCESS_MASM(masm) |
| 23 | 24 |
| 24 static void InitializeArrayConstructorDescriptor( | 25 void ArrayNArgumentsConstructorStub::Generate(MacroAssembler* masm) { |
| 25 Isolate* isolate, CodeStubDescriptor* descriptor, | 26 __ dsll(t9, a0, kPointerSizeLog2); |
| 26 int constant_stack_parameter_count) { | 27 __ Daddu(t9, sp, t9); |
| 27 Address deopt_handler = Runtime::FunctionForId( | 28 __ sw(a1, MemOperand(t9, 0)); |
| 28 Runtime::kArrayConstructor)->entry; | 29 __ Push(a1); |
| 29 | 30 __ Push(a2); |
| 30 if (constant_stack_parameter_count == 0) { | 31 __ Daddu(a0, a0, 3); |
| 31 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | 32 __ TailCallRuntime(Runtime::kArrayConstructor); |
| 32 JS_FUNCTION_STUB_MODE); | |
| 33 } else { | |
| 34 descriptor->Initialize(a0, deopt_handler, constant_stack_parameter_count, | |
| 35 JS_FUNCTION_STUB_MODE); | |
| 36 } | |
| 37 } | 33 } |
| 38 | 34 |
| 39 | |
| 40 static void InitializeInternalArrayConstructorDescriptor( | |
| 41 Isolate* isolate, CodeStubDescriptor* descriptor, | |
| 42 int constant_stack_parameter_count) { | |
| 43 Address deopt_handler = Runtime::FunctionForId( | |
| 44 Runtime::kInternalArrayConstructor)->entry; | |
| 45 | |
| 46 if (constant_stack_parameter_count == 0) { | |
| 47 descriptor->Initialize(deopt_handler, constant_stack_parameter_count, | |
| 48 JS_FUNCTION_STUB_MODE); | |
| 49 } else { | |
| 50 descriptor->Initialize(a0, deopt_handler, constant_stack_parameter_count, | |
| 51 JS_FUNCTION_STUB_MODE); | |
| 52 } | |
| 53 } | |
| 54 | |
| 55 | |
| 56 void ArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 57 CodeStubDescriptor* descriptor) { | |
| 58 InitializeArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 59 } | |
| 60 | |
| 61 | |
| 62 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | 35 void FastArrayPushStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { |
| 63 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; | 36 Address deopt_handler = Runtime::FunctionForId(Runtime::kArrayPush)->entry; |
| 64 descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 37 descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 65 } | 38 } |
| 66 | 39 |
| 67 void FastFunctionBindStub::InitializeDescriptor( | 40 void FastFunctionBindStub::InitializeDescriptor( |
| 68 CodeStubDescriptor* descriptor) { | 41 CodeStubDescriptor* descriptor) { |
| 69 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; | 42 Address deopt_handler = Runtime::FunctionForId(Runtime::kFunctionBind)->entry; |
| 70 descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); | 43 descriptor->Initialize(a0, deopt_handler, -1, JS_FUNCTION_STUB_MODE); |
| 71 } | 44 } |
| 72 | 45 |
| 73 void InternalArrayNArgumentsConstructorStub::InitializeDescriptor( | |
| 74 CodeStubDescriptor* descriptor) { | |
| 75 InitializeInternalArrayConstructorDescriptor(isolate(), descriptor, -1); | |
| 76 } | |
| 77 | |
| 78 | |
| 79 #define __ ACCESS_MASM(masm) | |
| 80 | |
| 81 static void EmitIdenticalObjectComparison(MacroAssembler* masm, Label* slow, | 46 static void EmitIdenticalObjectComparison(MacroAssembler* masm, Label* slow, |
| 82 Condition cc); | 47 Condition cc); |
| 83 static void EmitSmiNonsmiComparison(MacroAssembler* masm, | 48 static void EmitSmiNonsmiComparison(MacroAssembler* masm, |
| 84 Register lhs, | 49 Register lhs, |
| 85 Register rhs, | 50 Register rhs, |
| 86 Label* rhs_not_nan, | 51 Label* rhs_not_nan, |
| 87 Label* slow, | 52 Label* slow, |
| 88 bool strict); | 53 bool strict); |
| 89 static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm, | 54 static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm, |
| 90 Register lhs, | 55 Register lhs, |
| (...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 | 971 |
| 1007 bool CEntryStub::NeedsImmovableCode() { | 972 bool CEntryStub::NeedsImmovableCode() { |
| 1008 return true; | 973 return true; |
| 1009 } | 974 } |
| 1010 | 975 |
| 1011 | 976 |
| 1012 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { | 977 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 1013 CEntryStub::GenerateAheadOfTime(isolate); | 978 CEntryStub::GenerateAheadOfTime(isolate); |
| 1014 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); | 979 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 1015 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); | 980 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); |
| 1016 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 981 CommonArrayConstructorStub::GenerateStubsAheadOfTime(isolate); |
| 1017 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); | 982 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 1018 CreateWeakCellStub::GenerateAheadOfTime(isolate); | 983 CreateWeakCellStub::GenerateAheadOfTime(isolate); |
| 1019 BinaryOpICStub::GenerateAheadOfTime(isolate); | 984 BinaryOpICStub::GenerateAheadOfTime(isolate); |
| 1020 StoreRegistersStateStub::GenerateAheadOfTime(isolate); | 985 StoreRegistersStateStub::GenerateAheadOfTime(isolate); |
| 1021 RestoreRegistersStateStub::GenerateAheadOfTime(isolate); | 986 RestoreRegistersStateStub::GenerateAheadOfTime(isolate); |
| 1022 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); | 987 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 1023 StoreFastElementStub::GenerateAheadOfTime(isolate); | 988 StoreFastElementStub::GenerateAheadOfTime(isolate); |
| 1024 TypeofStub::GenerateAheadOfTime(isolate); | 989 TypeofStub::GenerateAheadOfTime(isolate); |
| 1025 } | 990 } |
| 1026 | 991 |
| (...skipping 3349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4376 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); | 4341 ElementsKind kind = GetFastElementsKindFromSequenceIndex(i); |
| 4377 T stub(isolate, kind); | 4342 T stub(isolate, kind); |
| 4378 stub.GetCode(); | 4343 stub.GetCode(); |
| 4379 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { | 4344 if (AllocationSite::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { |
| 4380 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); | 4345 T stub1(isolate, kind, DISABLE_ALLOCATION_SITES); |
| 4381 stub1.GetCode(); | 4346 stub1.GetCode(); |
| 4382 } | 4347 } |
| 4383 } | 4348 } |
| 4384 } | 4349 } |
| 4385 | 4350 |
| 4386 | 4351 void CommonArrayConstructorStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 4387 void ArrayConstructorStubBase::GenerateStubsAheadOfTime(Isolate* isolate) { | |
| 4388 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( | 4352 ArrayConstructorStubAheadOfTimeHelper<ArrayNoArgumentConstructorStub>( |
| 4389 isolate); | 4353 isolate); |
| 4390 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( | 4354 ArrayConstructorStubAheadOfTimeHelper<ArraySingleArgumentConstructorStub>( |
| 4391 isolate); | 4355 isolate); |
| 4392 ArrayConstructorStubAheadOfTimeHelper<ArrayNArgumentsConstructorStub>( | 4356 ArrayNArgumentsConstructorStub stub(isolate); |
| 4393 isolate); | 4357 stub.GetCode(); |
| 4394 } | |
| 4395 | |
| 4396 | |
| 4397 void InternalArrayConstructorStubBase::GenerateStubsAheadOfTime( | |
| 4398 Isolate* isolate) { | |
| 4399 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; | 4358 ElementsKind kinds[2] = { FAST_ELEMENTS, FAST_HOLEY_ELEMENTS }; |
| 4400 for (int i = 0; i < 2; i++) { | 4359 for (int i = 0; i < 2; i++) { |
| 4401 // For internal arrays we only need a few things. | 4360 // For internal arrays we only need a few things. |
| 4402 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); | 4361 InternalArrayNoArgumentConstructorStub stubh1(isolate, kinds[i]); |
| 4403 stubh1.GetCode(); | 4362 stubh1.GetCode(); |
| 4404 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); | 4363 InternalArraySingleArgumentConstructorStub stubh2(isolate, kinds[i]); |
| 4405 stubh2.GetCode(); | 4364 stubh2.GetCode(); |
| 4406 InternalArrayNArgumentsConstructorStub stubh3(isolate, kinds[i]); | |
| 4407 stubh3.GetCode(); | |
| 4408 } | 4365 } |
| 4409 } | 4366 } |
| 4410 | 4367 |
| 4411 | 4368 |
| 4412 void ArrayConstructorStub::GenerateDispatchToArrayStub( | 4369 void ArrayConstructorStub::GenerateDispatchToArrayStub( |
| 4413 MacroAssembler* masm, | 4370 MacroAssembler* masm, |
| 4414 AllocationSiteOverrideMode mode) { | 4371 AllocationSiteOverrideMode mode) { |
| 4415 if (argument_count() == ANY) { | 4372 if (argument_count() == ANY) { |
| 4416 Label not_zero_case, not_one_case; | 4373 Label not_zero_case, not_one_case; |
| 4417 __ And(at, a0, a0); | 4374 __ And(at, a0, a0); |
| 4418 __ Branch(¬_zero_case, ne, at, Operand(zero_reg)); | 4375 __ Branch(¬_zero_case, ne, at, Operand(zero_reg)); |
| 4419 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4376 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4420 | 4377 |
| 4421 __ bind(¬_zero_case); | 4378 __ bind(¬_zero_case); |
| 4422 __ Branch(¬_one_case, gt, a0, Operand(1)); | 4379 __ Branch(¬_one_case, gt, a0, Operand(1)); |
| 4423 CreateArrayDispatchOneArgument(masm, mode); | 4380 CreateArrayDispatchOneArgument(masm, mode); |
| 4424 | 4381 |
| 4425 __ bind(¬_one_case); | 4382 __ bind(¬_one_case); |
| 4426 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4383 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4384 __ TailCallStub(&stub); |
| 4427 } else if (argument_count() == NONE) { | 4385 } else if (argument_count() == NONE) { |
| 4428 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); | 4386 CreateArrayDispatch<ArrayNoArgumentConstructorStub>(masm, mode); |
| 4429 } else if (argument_count() == ONE) { | 4387 } else if (argument_count() == ONE) { |
| 4430 CreateArrayDispatchOneArgument(masm, mode); | 4388 CreateArrayDispatchOneArgument(masm, mode); |
| 4431 } else if (argument_count() == MORE_THAN_ONE) { | 4389 } else if (argument_count() == MORE_THAN_ONE) { |
| 4432 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4390 ArrayNArgumentsConstructorStub stub(masm->isolate()); |
| 4391 __ TailCallStub(&stub); |
| 4433 } else { | 4392 } else { |
| 4434 UNREACHABLE(); | 4393 UNREACHABLE(); |
| 4435 } | 4394 } |
| 4436 } | 4395 } |
| 4437 | 4396 |
| 4438 | 4397 |
| 4439 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 4398 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 4440 // ----------- S t a t e ------------- | 4399 // ----------- S t a t e ------------- |
| 4441 // -- a0 : argc (only if argument_count() == ANY) | 4400 // -- a0 : argc (only if argument_count() == ANY) |
| 4442 // -- a1 : constructor | 4401 // -- a1 : constructor |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4496 case NONE: | 4455 case NONE: |
| 4497 __ sd(a1, MemOperand(sp, 0 * kPointerSize)); | 4456 __ sd(a1, MemOperand(sp, 0 * kPointerSize)); |
| 4498 __ li(a0, Operand(3)); | 4457 __ li(a0, Operand(3)); |
| 4499 break; | 4458 break; |
| 4500 case ONE: | 4459 case ONE: |
| 4501 __ sd(a1, MemOperand(sp, 1 * kPointerSize)); | 4460 __ sd(a1, MemOperand(sp, 1 * kPointerSize)); |
| 4502 __ li(a0, Operand(4)); | 4461 __ li(a0, Operand(4)); |
| 4503 break; | 4462 break; |
| 4504 } | 4463 } |
| 4505 __ Push(a3, a2); | 4464 __ Push(a3, a2); |
| 4506 __ JumpToExternalReference(ExternalReference(Runtime::kNewArray, isolate())); | 4465 __ JumpToExternalReference( |
| 4466 ExternalReference(Runtime::kArrayConstructor, isolate())); |
| 4507 } | 4467 } |
| 4508 | 4468 |
| 4509 | 4469 |
| 4510 void InternalArrayConstructorStub::GenerateCase( | 4470 void InternalArrayConstructorStub::GenerateCase( |
| 4511 MacroAssembler* masm, ElementsKind kind) { | 4471 MacroAssembler* masm, ElementsKind kind) { |
| 4512 | 4472 |
| 4513 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); | 4473 InternalArrayNoArgumentConstructorStub stub0(isolate(), kind); |
| 4514 __ TailCallStub(&stub0, lo, a0, Operand(1)); | 4474 __ TailCallStub(&stub0, lo, a0, Operand(1)); |
| 4515 | 4475 |
| 4516 InternalArrayNArgumentsConstructorStub stubN(isolate(), kind); | 4476 ArrayNArgumentsConstructorStub stubN(isolate()); |
| 4517 __ TailCallStub(&stubN, hi, a0, Operand(1)); | 4477 __ TailCallStub(&stubN, hi, a0, Operand(1)); |
| 4518 | 4478 |
| 4519 if (IsFastPackedElementsKind(kind)) { | 4479 if (IsFastPackedElementsKind(kind)) { |
| 4520 // We might need to create a holey array | 4480 // We might need to create a holey array |
| 4521 // look at the first argument. | 4481 // look at the first argument. |
| 4522 __ ld(at, MemOperand(sp, 0)); | 4482 __ ld(at, MemOperand(sp, 0)); |
| 4523 | 4483 |
| 4524 InternalArraySingleArgumentConstructorStub | 4484 InternalArraySingleArgumentConstructorStub |
| 4525 stub1_holey(isolate(), GetHoleyElementsKind(kind)); | 4485 stub1_holey(isolate(), GetHoleyElementsKind(kind)); |
| 4526 __ TailCallStub(&stub1_holey, ne, at, Operand(zero_reg)); | 4486 __ TailCallStub(&stub1_holey, ne, at, Operand(zero_reg)); |
| (...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5647 kStackUnwindSpace, kInvalidStackOffset, | 5607 kStackUnwindSpace, kInvalidStackOffset, |
| 5648 return_value_operand, NULL); | 5608 return_value_operand, NULL); |
| 5649 } | 5609 } |
| 5650 | 5610 |
| 5651 #undef __ | 5611 #undef __ |
| 5652 | 5612 |
| 5653 } // namespace internal | 5613 } // namespace internal |
| 5654 } // namespace v8 | 5614 } // namespace v8 |
| 5655 | 5615 |
| 5656 #endif // V8_TARGET_ARCH_MIPS64 | 5616 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |