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

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

Issue 527093002: Make concrete classes for individual call descriptors. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE. Created 6 years, 3 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 | Annotate | Revision Log
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 #include "src/arm/lithium-codegen-arm.h" 7 #include "src/arm/lithium-codegen-arm.h"
8 #include "src/arm/lithium-gap-resolver-arm.h" 8 #include "src/arm/lithium-gap-resolver-arm.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/hydrogen-osr.h" 10 #include "src/hydrogen-osr.h"
(...skipping 2976 matching lines...) Expand 10 before | Expand all | Expand 10 after
2987 __ cmp(result, ip); 2987 __ cmp(result, ip);
2988 DeoptimizeIf(eq, instr->environment()); 2988 DeoptimizeIf(eq, instr->environment());
2989 } 2989 }
2990 } 2990 }
2991 2991
2992 2992
2993 template <class T> 2993 template <class T>
2994 void LCodeGen::EmitVectorLoadICRegisters(T* instr) { 2994 void LCodeGen::EmitVectorLoadICRegisters(T* instr) {
2995 DCHECK(FLAG_vector_ics); 2995 DCHECK(FLAG_vector_ics);
2996 Register vector = ToRegister(instr->temp_vector()); 2996 Register vector = ToRegister(instr->temp_vector());
2997 DCHECK(vector.is(FullVectorLoadConvention::VectorRegister())); 2997 DCHECK(vector.is(VectorLoadICDescriptor::VectorRegister()));
2998 __ Move(vector, instr->hydrogen()->feedback_vector()); 2998 __ Move(vector, instr->hydrogen()->feedback_vector());
2999 // No need to allocate this register. 2999 // No need to allocate this register.
3000 DCHECK(FullVectorLoadConvention::SlotRegister().is(r0)); 3000 DCHECK(VectorLoadICDescriptor::SlotRegister().is(r0));
3001 __ mov(FullVectorLoadConvention::SlotRegister(), 3001 __ mov(VectorLoadICDescriptor::SlotRegister(),
3002 Operand(Smi::FromInt(instr->hydrogen()->slot()))); 3002 Operand(Smi::FromInt(instr->hydrogen()->slot())));
3003 } 3003 }
3004 3004
3005 3005
3006 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) { 3006 void LCodeGen::DoLoadGlobalGeneric(LLoadGlobalGeneric* instr) {
3007 DCHECK(ToRegister(instr->context()).is(cp)); 3007 DCHECK(ToRegister(instr->context()).is(cp));
3008 DCHECK(ToRegister(instr->global_object()) 3008 DCHECK(ToRegister(instr->global_object())
3009 .is(LoadConvention::ReceiverRegister())); 3009 .is(LoadDescriptor::ReceiverRegister()));
3010 DCHECK(ToRegister(instr->result()).is(r0)); 3010 DCHECK(ToRegister(instr->result()).is(r0));
3011 3011
3012 __ mov(LoadConvention::NameRegister(), Operand(instr->name())); 3012 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name()));
3013 if (FLAG_vector_ics) { 3013 if (FLAG_vector_ics) {
3014 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr); 3014 EmitVectorLoadICRegisters<LLoadGlobalGeneric>(instr);
3015 } 3015 }
3016 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL; 3016 ContextualMode mode = instr->for_typeof() ? NOT_CONTEXTUAL : CONTEXTUAL;
3017 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode); 3017 Handle<Code> ic = LoadIC::initialize_stub(isolate(), mode);
3018 CallCode(ic, RelocInfo::CODE_TARGET, instr); 3018 CallCode(ic, RelocInfo::CODE_TARGET, instr);
3019 } 3019 }
3020 3020
3021 3021
3022 void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) { 3022 void LCodeGen::DoStoreGlobalCell(LStoreGlobalCell* instr) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
3121 __ ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); 3121 __ ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
3122 object = result; 3122 object = result;
3123 } 3123 }
3124 MemOperand operand = FieldMemOperand(object, offset); 3124 MemOperand operand = FieldMemOperand(object, offset);
3125 __ Load(result, operand, access.representation()); 3125 __ Load(result, operand, access.representation());
3126 } 3126 }
3127 3127
3128 3128
3129 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { 3129 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
3130 DCHECK(ToRegister(instr->context()).is(cp)); 3130 DCHECK(ToRegister(instr->context()).is(cp));
3131 DCHECK(ToRegister(instr->object()).is(LoadConvention::ReceiverRegister())); 3131 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister()));
3132 DCHECK(ToRegister(instr->result()).is(r0)); 3132 DCHECK(ToRegister(instr->result()).is(r0));
3133 3133
3134 // Name is always in r2. 3134 // Name is always in r2.
3135 __ mov(LoadConvention::NameRegister(), Operand(instr->name())); 3135 __ mov(LoadDescriptor::NameRegister(), Operand(instr->name()));
3136 if (FLAG_vector_ics) { 3136 if (FLAG_vector_ics) {
3137 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr); 3137 EmitVectorLoadICRegisters<LLoadNamedGeneric>(instr);
3138 } 3138 }
3139 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL); 3139 Handle<Code> ic = LoadIC::initialize_stub(isolate(), NOT_CONTEXTUAL);
3140 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); 3140 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS);
3141 } 3141 }
3142 3142
3143 3143
3144 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) { 3144 void LCodeGen::DoLoadFunctionPrototype(LLoadFunctionPrototype* instr) {
3145 Register scratch = scratch0(); 3145 Register scratch = scratch0();
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
3413 } else { 3413 } else {
3414 DCHECK_EQ(-1, shift_size); 3414 DCHECK_EQ(-1, shift_size);
3415 __ add(scratch0(), base, Operand(key, ASR, 1)); 3415 __ add(scratch0(), base, Operand(key, ASR, 1));
3416 return MemOperand(scratch0(), base_offset); 3416 return MemOperand(scratch0(), base_offset);
3417 } 3417 }
3418 } 3418 }
3419 3419
3420 3420
3421 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) { 3421 void LCodeGen::DoLoadKeyedGeneric(LLoadKeyedGeneric* instr) {
3422 DCHECK(ToRegister(instr->context()).is(cp)); 3422 DCHECK(ToRegister(instr->context()).is(cp));
3423 DCHECK(ToRegister(instr->object()).is(LoadConvention::ReceiverRegister())); 3423 DCHECK(ToRegister(instr->object()).is(LoadDescriptor::ReceiverRegister()));
3424 DCHECK(ToRegister(instr->key()).is(LoadConvention::NameRegister())); 3424 DCHECK(ToRegister(instr->key()).is(LoadDescriptor::NameRegister()));
3425 3425
3426 if (FLAG_vector_ics) { 3426 if (FLAG_vector_ics) {
3427 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr); 3427 EmitVectorLoadICRegisters<LLoadKeyedGeneric>(instr);
3428 } 3428 }
3429 3429
3430 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize(); 3430 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
3431 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); 3431 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS);
3432 } 3432 }
3433 3433
3434 3434
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after
3972 DCHECK(ToRegister(instr->result()).is(r0)); 3972 DCHECK(ToRegister(instr->result()).is(r0));
3973 3973
3974 LPointerMap* pointers = instr->pointer_map(); 3974 LPointerMap* pointers = instr->pointer_map();
3975 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); 3975 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt);
3976 3976
3977 if (instr->target()->IsConstantOperand()) { 3977 if (instr->target()->IsConstantOperand()) {
3978 LConstantOperand* target = LConstantOperand::cast(instr->target()); 3978 LConstantOperand* target = LConstantOperand::cast(instr->target());
3979 Handle<Code> code = Handle<Code>::cast(ToHandle(target)); 3979 Handle<Code> code = Handle<Code>::cast(ToHandle(target));
3980 generator.BeforeCall(__ CallSize(code, RelocInfo::CODE_TARGET)); 3980 generator.BeforeCall(__ CallSize(code, RelocInfo::CODE_TARGET));
3981 PlatformInterfaceDescriptor* call_descriptor = 3981 PlatformInterfaceDescriptor* call_descriptor =
3982 instr->descriptor()->platform_specific_descriptor(); 3982 instr->descriptor().platform_specific_descriptor();
3983 __ Call(code, RelocInfo::CODE_TARGET, TypeFeedbackId::None(), al, 3983 __ Call(code, RelocInfo::CODE_TARGET, TypeFeedbackId::None(), al,
3984 call_descriptor->storage_mode()); 3984 call_descriptor->storage_mode());
3985 } else { 3985 } else {
3986 DCHECK(instr->target()->IsRegister()); 3986 DCHECK(instr->target()->IsRegister());
3987 Register target = ToRegister(instr->target()); 3987 Register target = ToRegister(instr->target());
3988 generator.BeforeCall(__ CallSize(target)); 3988 generator.BeforeCall(__ CallSize(target));
3989 // Make sure we don't emit any additional entries in the constant pool 3989 // Make sure we don't emit any additional entries in the constant pool
3990 // before the call to ensure that the CallCodeSize() calculated the correct 3990 // before the call to ensure that the CallCodeSize() calculated the correct
3991 // number of instructions for the constant pool load. 3991 // number of instructions for the constant pool load.
3992 { 3992 {
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
4192 EMIT_REMEMBERED_SET, 4192 EMIT_REMEMBERED_SET,
4193 instr->hydrogen()->SmiCheckForWriteBarrier(), 4193 instr->hydrogen()->SmiCheckForWriteBarrier(),
4194 instr->hydrogen()->PointersToHereCheckForValue()); 4194 instr->hydrogen()->PointersToHereCheckForValue());
4195 } 4195 }
4196 } 4196 }
4197 } 4197 }
4198 4198
4199 4199
4200 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { 4200 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) {
4201 DCHECK(ToRegister(instr->context()).is(cp)); 4201 DCHECK(ToRegister(instr->context()).is(cp));
4202 DCHECK(ToRegister(instr->object()).is(StoreConvention::ReceiverRegister())); 4202 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister()));
4203 DCHECK(ToRegister(instr->value()).is(StoreConvention::ValueRegister())); 4203 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister()));
4204 4204
4205 __ mov(StoreConvention::NameRegister(), Operand(instr->name())); 4205 __ mov(StoreDescriptor::NameRegister(), Operand(instr->name()));
4206 Handle<Code> ic = StoreIC::initialize_stub(isolate(), instr->strict_mode()); 4206 Handle<Code> ic = StoreIC::initialize_stub(isolate(), instr->strict_mode());
4207 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); 4207 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS);
4208 } 4208 }
4209 4209
4210 4210
4211 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { 4211 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
4212 Condition cc = instr->hydrogen()->allow_equality() ? hi : hs; 4212 Condition cc = instr->hydrogen()->allow_equality() ? hi : hs;
4213 if (instr->index()->IsConstantOperand()) { 4213 if (instr->index()->IsConstantOperand()) {
4214 Operand index = ToOperand(instr->index()); 4214 Operand index = ToOperand(instr->index());
4215 Register length = ToRegister(instr->length()); 4215 Register length = ToRegister(instr->length());
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
4413 } else if (instr->hydrogen()->value()->representation().IsDouble()) { 4413 } else if (instr->hydrogen()->value()->representation().IsDouble()) {
4414 DoStoreKeyedFixedDoubleArray(instr); 4414 DoStoreKeyedFixedDoubleArray(instr);
4415 } else { 4415 } else {
4416 DoStoreKeyedFixedArray(instr); 4416 DoStoreKeyedFixedArray(instr);
4417 } 4417 }
4418 } 4418 }
4419 4419
4420 4420
4421 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { 4421 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
4422 DCHECK(ToRegister(instr->context()).is(cp)); 4422 DCHECK(ToRegister(instr->context()).is(cp));
4423 DCHECK(ToRegister(instr->object()).is(StoreConvention::ReceiverRegister())); 4423 DCHECK(ToRegister(instr->object()).is(StoreDescriptor::ReceiverRegister()));
4424 DCHECK(ToRegister(instr->key()).is(StoreConvention::NameRegister())); 4424 DCHECK(ToRegister(instr->key()).is(StoreDescriptor::NameRegister()));
4425 DCHECK(ToRegister(instr->value()).is(StoreConvention::ValueRegister())); 4425 DCHECK(ToRegister(instr->value()).is(StoreDescriptor::ValueRegister()));
4426 4426
4427 Handle<Code> ic = instr->strict_mode() == STRICT 4427 Handle<Code> ic = instr->strict_mode() == STRICT
4428 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict() 4428 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
4429 : isolate()->builtins()->KeyedStoreIC_Initialize(); 4429 : isolate()->builtins()->KeyedStoreIC_Initialize();
4430 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS); 4430 CallCode(ic, RelocInfo::CODE_TARGET, instr, NEVER_INLINE_TARGET_ADDRESS);
4431 } 4431 }
4432 4432
4433 4433
4434 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { 4434 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
4435 Register object_reg = ToRegister(instr->object()); 4435 Register object_reg = ToRegister(instr->object());
(...skipping 1443 matching lines...) Expand 10 before | Expand all | Expand 10 after
5879 __ Push(scope_info); 5879 __ Push(scope_info);
5880 __ push(ToRegister(instr->function())); 5880 __ push(ToRegister(instr->function()));
5881 CallRuntime(Runtime::kPushBlockContext, 2, instr); 5881 CallRuntime(Runtime::kPushBlockContext, 2, instr);
5882 RecordSafepoint(Safepoint::kNoLazyDeopt); 5882 RecordSafepoint(Safepoint::kNoLazyDeopt);
5883 } 5883 }
5884 5884
5885 5885
5886 #undef __ 5886 #undef __
5887 5887
5888 } } // namespace v8::internal 5888 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698