Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(984)

Side by Side Diff: src/x87/lithium-codegen-x87.cc

Issue 1213373002: X87: VectorICs: Lithium support for vector-based stores. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x87/lithium-codegen-x87.h ('k') | src/x87/lithium-x87.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X87 7 #if V8_TARGET_ARCH_X87
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 3089 matching lines...) Expand 10 before | Expand all | Expand 10 after
3100 AllowDeferredHandleDereference vector_structure_check; 3100 AllowDeferredHandleDereference vector_structure_check;
3101 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector(); 3101 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector();
3102 __ mov(vector_register, vector); 3102 __ mov(vector_register, vector);
3103 // No need to allocate this register. 3103 // No need to allocate this register.
3104 FeedbackVectorICSlot slot = instr->hydrogen()->slot(); 3104 FeedbackVectorICSlot slot = instr->hydrogen()->slot();
3105 int index = vector->GetIndex(slot); 3105 int index = vector->GetIndex(slot);
3106 __ mov(slot_register, Immediate(Smi::FromInt(index))); 3106 __ mov(slot_register, Immediate(Smi::FromInt(index)));
3107 } 3107 }
3108 3108
3109 3109
3110 template <class T>
3111 void LCodeGen::EmitVectorStoreICRegisters(T* instr) {
3112 Register vector_register = ToRegister(instr->temp_vector());
3113 Register slot_register = ToRegister(instr->temp_slot());
3114
3115 AllowDeferredHandleDereference vector_structure_check;
3116 Handle<TypeFeedbackVector> vector = instr->hydrogen()->feedback_vector();
3117 __ mov(vector_register, vector);
3118 FeedbackVectorICSlot slot = instr->hydrogen()->slot();
3119 int index = vector->GetIndex(slot);
3120 __ mov(slot_register, Immediate(Smi::FromInt(index)));
3121 }
3122
3123
3110 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { 3124 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) {
3111 DCHECK(ToRegister(instr->context()).is(esi)); 3125 DCHECK(ToRegister(instr->context()).is(esi));
3112 DCHECK(ToRegister(instr->global_object()) 3126 DCHECK(ToRegister(instr->global_object())
3113 .is(LoadDescriptor::ReceiverRegister())); 3127 .is(LoadDescriptor::ReceiverRegister()));
3114 DCHECK(ToRegister(instr->result()).is(eax)); 3128 DCHECK(ToRegister(instr->result()).is(eax));
3115 3129
3116 __ mov(LoadDescriptor::NameRegister(), instr->name()); 3130 __ mov(LoadDescriptor::NameRegister(), instr->name());
3117 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); 3131 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr);
3118 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; 3132 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL;
3119 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode, 3133 Handle<Code> ic = CodeFactory::LoadICInOptimizedCode(isolate(), mode,
(...skipping 1360 matching lines...) Expand 10 before | Expand all | Expand 10 after
4480 instr->hydrogen()->PointersToHereCheckForValue()); 4494 instr->hydrogen()->PointersToHereCheckForValue());
4481 } 4495 }
4482 } 4496 }
4483 4497
4484 4498
4485 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { 4499 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
4486 DCHECK(ToRegister(instr->context()).is(esi)); 4500 DCHECK(ToRegister(instr->context()).is(esi));
4487 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); 4501 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister()));
4488 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); 4502 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister()));
4489 4503
4504 if (instr->hydrogen()->HasVectorAndSlot()) {
4505 EmitVectorStoreICRegisters<LStoreNamedGeneric>(instr);
4506 }
4507
4490 __ mov(StoreDescriptor::NameRegister(), instr->name()); 4508 __ mov(StoreDescriptor::NameRegister(), instr->name());
4491 Handle<Code> ic = 4509 Handle<Code> ic = CodeFactory::StoreICInOptimizedCode(
4492 StoreIC::initialize_stub(isolate(), instr->language_mode(), 4510 isolate(), instr->language_mode(),
4493 instr->hydrogen()->initialization_state()); 4511 instr->hydrogen()->initialization_state()).code();
4494 CallCode(ic, RelocInfo::CODE_TARGET, instr); 4512 CallCode(ic, RelocInfo::CODE_TARGET, instr);
4495 } 4513 }
4496 4514
4497 4515
4498 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { 4516 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
4499 Condition cc = instr->hydrogen()->allow_equality() ? above : above_equal; 4517 Condition cc = instr->hydrogen()->allow_equality() ? above : above_equal;
4500 if (instr->index()->IsConstantOperand()) { 4518 if (instr->index()->IsConstantOperand()) {
4501 __ cmp(ToOperand(instr->length()), 4519 __ cmp(ToOperand(instr->length()),
4502 ToImmediate(LConstantOperand::cast(instr->index()), 4520 ToImmediate(LConstantOperand::cast(instr->index()),
4503 instr->hydrogen()->length()->representation())); 4521 instr->hydrogen()->length()->representation()));
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
4713 } 4731 }
4714 } 4732 }
4715 4733
4716 4734
4717 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { 4735 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
4718 DCHECK(ToRegister(instr->context()).is(esi)); 4736 DCHECK(ToRegister(instr->context()).is(esi));
4719 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister())); 4737 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister()));
4720 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister())); 4738 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister()));
4721 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister())); 4739 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister()));
4722 4740
4741 if (instr->hydrogen()->HasVectorAndSlot()) {
4742 EmitVectorStoreICRegisters<LStoreKeyedGeneric>(instr);
4743 }
4744
4723 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode( 4745 Handle<Code> ic = CodeFactory::KeyedStoreICInOptimizedCode(
4724 isolate(), instr->language_mode(), 4746 isolate(), instr->language_mode(),
4725 instr->hydrogen()->initialization_state()).code(); 4747 instr->hydrogen()->initialization_state()).code();
4726 CallCode(ic, RelocInfo::CODE_TARGET, instr); 4748 CallCode(ic, RelocInfo::CODE_TARGET, instr);
4727 } 4749 }
4728 4750
4729 4751
4730 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) { 4752 void LCodeGen::DoTrapAllocationMemento(LTrapAllocationMemento* instr) {
4731 Register object = ToRegister(instr->object()); 4753 Register object = ToRegister(instr->object());
4732 Register temp = ToRegister(instr->temp()); 4754 Register temp = ToRegister(instr->temp());
(...skipping 1664 matching lines...) Expand 10 before | Expand all | Expand 10 after
6397 RecordSafepoint(Safepoint::kNoLazyDeopt); 6419 RecordSafepoint(Safepoint::kNoLazyDeopt);
6398 } 6420 }
6399 6421
6400 6422
6401 #undef __ 6423 #undef __
6402 6424
6403 } // namespace internal 6425 } // namespace internal
6404 } // namespace v8 6426 } // namespace v8
6405 6427
6406 #endif // V8_TARGET_ARCH_X87 6428 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « src/x87/lithium-codegen-x87.h ('k') | src/x87/lithium-x87.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698