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 #include "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #include "code-stubs.h" | 7 #include "code-stubs.h" |
8 #include "hydrogen.h" | 8 #include "hydrogen.h" |
9 #include "lithium.h" | 9 #include "lithium.h" |
10 | 10 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 int param_count = descriptor_->register_param_count_; | 120 int param_count = descriptor_->register_param_count_; |
121 HEnvironment* start_environment = graph()->start_environment(); | 121 HEnvironment* start_environment = graph()->start_environment(); |
122 HBasicBlock* next_block = CreateBasicBlock(start_environment); | 122 HBasicBlock* next_block = CreateBasicBlock(start_environment); |
123 Goto(next_block); | 123 Goto(next_block); |
124 next_block->SetJoinId(BailoutId::StubEntry()); | 124 next_block->SetJoinId(BailoutId::StubEntry()); |
125 set_current_block(next_block); | 125 set_current_block(next_block); |
126 | 126 |
127 bool runtime_stack_params = descriptor_->stack_parameter_count_.is_valid(); | 127 bool runtime_stack_params = descriptor_->stack_parameter_count_.is_valid(); |
128 HInstruction* stack_parameter_count = NULL; | 128 HInstruction* stack_parameter_count = NULL; |
129 for (int i = 0; i < param_count; ++i) { | 129 for (int i = 0; i < param_count; ++i) { |
130 Representation r = descriptor_->register_param_representations_ == NULL | 130 Representation r = descriptor_->IsParameterCountRegister(i) |
131 ? Representation::Tagged() | 131 ? Representation::Integer32() |
132 : descriptor_->register_param_representations_[i]; | 132 : Representation::Tagged(); |
133 HParameter* param = Add<HParameter>(i, HParameter::REGISTER_PARAMETER, r); | 133 HParameter* param = Add<HParameter>(i, HParameter::REGISTER_PARAMETER, r); |
134 start_environment->Bind(i, param); | 134 start_environment->Bind(i, param); |
135 parameters_[i] = param; | 135 parameters_[i] = param; |
136 if (descriptor_->IsParameterCountRegister(i)) { | 136 if (descriptor_->IsParameterCountRegister(i)) { |
137 param->set_type(HType::Smi()); | 137 param->set_type(HType::Smi()); |
138 stack_parameter_count = param; | 138 stack_parameter_count = param; |
139 arguments_length_ = stack_parameter_count; | 139 arguments_length_ = stack_parameter_count; |
140 } | 140 } |
141 } | 141 } |
142 | 142 |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 Handle<Code> NumberToStringStub::GenerateCode() { | 323 Handle<Code> NumberToStringStub::GenerateCode() { |
324 return DoGenerateCode(this); | 324 return DoGenerateCode(this); |
325 } | 325 } |
326 | 326 |
327 | 327 |
328 template <> | 328 template <> |
329 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { | 329 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { |
330 Factory* factory = isolate()->factory(); | 330 Factory* factory = isolate()->factory(); |
331 HValue* undefined = graph()->GetConstantUndefined(); | 331 HValue* undefined = graph()->GetConstantUndefined(); |
332 AllocationSiteMode alloc_site_mode = casted_stub()->allocation_site_mode(); | 332 AllocationSiteMode alloc_site_mode = casted_stub()->allocation_site_mode(); |
333 | 333 FastCloneShallowArrayStub::Mode mode = casted_stub()->mode(); |
334 // This stub is very performance sensitive, the generated code must be tuned | 334 int length = casted_stub()->length(); |
335 // so that it doesn't build and eager frame. | |
336 info()->MarkMustNotHaveEagerFrame(); | |
337 | 335 |
338 HInstruction* allocation_site = Add<HLoadKeyed>(GetParameter(0), | 336 HInstruction* allocation_site = Add<HLoadKeyed>(GetParameter(0), |
339 GetParameter(1), | 337 GetParameter(1), |
340 static_cast<HValue*>(NULL), | 338 static_cast<HValue*>(NULL), |
341 FAST_ELEMENTS); | 339 FAST_ELEMENTS); |
342 IfBuilder checker(this); | 340 IfBuilder checker(this); |
343 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(allocation_site, | 341 checker.IfNot<HCompareObjectEqAndBranch, HValue*>(allocation_site, |
344 undefined); | 342 undefined); |
345 checker.Then(); | 343 checker.Then(); |
346 | 344 |
347 HObjectAccess access = HObjectAccess::ForAllocationSiteOffset( | 345 HObjectAccess access = HObjectAccess::ForAllocationSiteOffset( |
348 AllocationSite::kTransitionInfoOffset); | 346 AllocationSite::kTransitionInfoOffset); |
349 HInstruction* boilerplate = Add<HLoadNamedField>( | 347 HInstruction* boilerplate = Add<HLoadNamedField>( |
350 allocation_site, static_cast<HValue*>(NULL), access); | 348 allocation_site, static_cast<HValue*>(NULL), access); |
351 HValue* elements = AddLoadElements(boilerplate); | 349 HValue* push_value; |
352 HValue* capacity = AddLoadFixedArrayLength(elements); | 350 if (mode == FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS) { |
353 IfBuilder zero_capacity(this); | 351 HValue* elements = AddLoadElements(boilerplate); |
354 zero_capacity.If<HCompareNumericAndBranch>(capacity, graph()->GetConstant0(), | |
355 Token::EQ); | |
356 zero_capacity.Then(); | |
357 Push(BuildCloneShallowArrayEmpty(boilerplate, | |
358 allocation_site, | |
359 alloc_site_mode)); | |
360 zero_capacity.Else(); | |
361 IfBuilder if_fixed_cow(this); | |
362 if_fixed_cow.If<HCompareMap>(elements, factory->fixed_cow_array_map()); | |
363 if_fixed_cow.Then(); | |
364 Push(BuildCloneShallowArrayCow(boilerplate, | |
365 allocation_site, | |
366 alloc_site_mode, | |
367 FAST_ELEMENTS)); | |
368 if_fixed_cow.Else(); | |
369 IfBuilder if_fixed(this); | |
370 if_fixed.If<HCompareMap>(elements, factory->fixed_array_map()); | |
371 if_fixed.Then(); | |
372 Push(BuildCloneShallowArrayNonEmpty(boilerplate, | |
373 allocation_site, | |
374 alloc_site_mode, | |
375 FAST_ELEMENTS)); | |
376 | 352 |
377 if_fixed.Else(); | 353 IfBuilder if_fixed_cow(this); |
378 Push(BuildCloneShallowArrayNonEmpty(boilerplate, | 354 if_fixed_cow.If<HCompareMap>(elements, factory->fixed_cow_array_map()); |
379 allocation_site, | 355 if_fixed_cow.Then(); |
380 alloc_site_mode, | 356 push_value = BuildCloneShallowArray(boilerplate, |
381 FAST_DOUBLE_ELEMENTS)); | 357 allocation_site, |
382 if_fixed.End(); | 358 alloc_site_mode, |
383 if_fixed_cow.End(); | 359 FAST_ELEMENTS, |
384 zero_capacity.End(); | 360 0/*copy-on-write*/); |
| 361 environment()->Push(push_value); |
| 362 if_fixed_cow.Else(); |
| 363 |
| 364 IfBuilder if_fixed(this); |
| 365 if_fixed.If<HCompareMap>(elements, factory->fixed_array_map()); |
| 366 if_fixed.Then(); |
| 367 push_value = BuildCloneShallowArray(boilerplate, |
| 368 allocation_site, |
| 369 alloc_site_mode, |
| 370 FAST_ELEMENTS, |
| 371 length); |
| 372 environment()->Push(push_value); |
| 373 if_fixed.Else(); |
| 374 push_value = BuildCloneShallowArray(boilerplate, |
| 375 allocation_site, |
| 376 alloc_site_mode, |
| 377 FAST_DOUBLE_ELEMENTS, |
| 378 length); |
| 379 environment()->Push(push_value); |
| 380 } else { |
| 381 ElementsKind elements_kind = casted_stub()->ComputeElementsKind(); |
| 382 push_value = BuildCloneShallowArray(boilerplate, |
| 383 allocation_site, |
| 384 alloc_site_mode, |
| 385 elements_kind, |
| 386 length); |
| 387 environment()->Push(push_value); |
| 388 } |
385 | 389 |
386 checker.ElseDeopt("Uninitialized boilerplate literals"); | 390 checker.ElseDeopt("Uninitialized boilerplate literals"); |
387 checker.End(); | 391 checker.End(); |
388 | 392 |
389 return environment()->Pop(); | 393 return environment()->Pop(); |
390 } | 394 } |
391 | 395 |
392 | 396 |
393 Handle<Code> FastCloneShallowArrayStub::GenerateCode() { | 397 Handle<Code> FastCloneShallowArrayStub::GenerateCode() { |
394 return DoGenerateCode(this); | 398 return DoGenerateCode(this); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
633 ElementsKind kind, | 637 ElementsKind kind, |
634 AllocationSiteOverrideMode override_mode, | 638 AllocationSiteOverrideMode override_mode, |
635 ArgumentClass argument_class) { | 639 ArgumentClass argument_class) { |
636 HValue* constructor = GetParameter(ArrayConstructorStubBase::kConstructor); | 640 HValue* constructor = GetParameter(ArrayConstructorStubBase::kConstructor); |
637 HValue* alloc_site = GetParameter(ArrayConstructorStubBase::kAllocationSite); | 641 HValue* alloc_site = GetParameter(ArrayConstructorStubBase::kAllocationSite); |
638 JSArrayBuilder array_builder(this, kind, alloc_site, constructor, | 642 JSArrayBuilder array_builder(this, kind, alloc_site, constructor, |
639 override_mode); | 643 override_mode); |
640 HValue* result = NULL; | 644 HValue* result = NULL; |
641 switch (argument_class) { | 645 switch (argument_class) { |
642 case NONE: | 646 case NONE: |
643 // This stub is very performance sensitive, the generated code must be | |
644 // tuned so that it doesn't build and eager frame. | |
645 info()->MarkMustNotHaveEagerFrame(); | |
646 result = array_builder.AllocateEmptyArray(); | 647 result = array_builder.AllocateEmptyArray(); |
647 break; | 648 break; |
648 case SINGLE: | 649 case SINGLE: |
649 result = BuildArraySingleArgumentConstructor(&array_builder); | 650 result = BuildArraySingleArgumentConstructor(&array_builder); |
650 break; | 651 break; |
651 case MULTIPLE: | 652 case MULTIPLE: |
652 result = BuildArrayNArgumentsConstructor(&array_builder, kind); | 653 result = BuildArrayNArgumentsConstructor(&array_builder, kind); |
653 break; | 654 break; |
654 } | 655 } |
655 | 656 |
656 return result; | 657 return result; |
657 } | 658 } |
658 | 659 |
659 | 660 |
660 HValue* CodeStubGraphBuilderBase::BuildInternalArrayConstructor( | 661 HValue* CodeStubGraphBuilderBase::BuildInternalArrayConstructor( |
661 ElementsKind kind, ArgumentClass argument_class) { | 662 ElementsKind kind, ArgumentClass argument_class) { |
662 HValue* constructor = GetParameter( | 663 HValue* constructor = GetParameter( |
663 InternalArrayConstructorStubBase::kConstructor); | 664 InternalArrayConstructorStubBase::kConstructor); |
664 JSArrayBuilder array_builder(this, kind, constructor); | 665 JSArrayBuilder array_builder(this, kind, constructor); |
665 | 666 |
666 HValue* result = NULL; | 667 HValue* result = NULL; |
667 switch (argument_class) { | 668 switch (argument_class) { |
668 case NONE: | 669 case NONE: |
669 // This stub is very performance sensitive, the generated code must be | |
670 // tuned so that it doesn't build and eager frame. | |
671 info()->MarkMustNotHaveEagerFrame(); | |
672 result = array_builder.AllocateEmptyArray(); | 670 result = array_builder.AllocateEmptyArray(); |
673 break; | 671 break; |
674 case SINGLE: | 672 case SINGLE: |
675 result = BuildArraySingleArgumentConstructor(&array_builder); | 673 result = BuildArraySingleArgumentConstructor(&array_builder); |
676 break; | 674 break; |
677 case MULTIPLE: | 675 case MULTIPLE: |
678 result = BuildArrayNArgumentsConstructor(&array_builder, kind); | 676 result = BuildArrayNArgumentsConstructor(&array_builder, kind); |
679 break; | 677 break; |
680 } | 678 } |
681 return result; | 679 return result; |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1486 return BuildRegExpConstructResult(length, index, input); | 1484 return BuildRegExpConstructResult(length, index, input); |
1487 } | 1485 } |
1488 | 1486 |
1489 | 1487 |
1490 Handle<Code> RegExpConstructResultStub::GenerateCode() { | 1488 Handle<Code> RegExpConstructResultStub::GenerateCode() { |
1491 return DoGenerateCode(this); | 1489 return DoGenerateCode(this); |
1492 } | 1490 } |
1493 | 1491 |
1494 | 1492 |
1495 } } // namespace v8::internal | 1493 } } // namespace v8::internal |
OLD | NEW |