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

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

Issue 2840018: [Isolates] Moved more compilation-related globals (builtins, runtime, &c.)... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/isolates/
Patch Set: rebase Created 10 years, 6 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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1530 matching lines...) Expand 10 before | Expand all | Expand 10 after
1541 ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1); 1541 ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1);
1542 __ CompareObjectType(r0, r1, r2, FIRST_JS_OBJECT_TYPE); 1542 __ CompareObjectType(r0, r1, r2, FIRST_JS_OBJECT_TYPE);
1543 __ b(lt, &build_args); 1543 __ b(lt, &build_args);
1544 1544
1545 // Check that applicand.apply is Function.prototype.apply. 1545 // Check that applicand.apply is Function.prototype.apply.
1546 __ ldr(r0, MemOperand(sp, kPointerSize)); 1546 __ ldr(r0, MemOperand(sp, kPointerSize));
1547 __ BranchOnSmi(r0, &build_args); 1547 __ BranchOnSmi(r0, &build_args);
1548 __ CompareObjectType(r0, r1, r2, JS_FUNCTION_TYPE); 1548 __ CompareObjectType(r0, r1, r2, JS_FUNCTION_TYPE);
1549 __ b(ne, &build_args); 1549 __ b(ne, &build_args);
1550 __ ldr(r0, FieldMemOperand(r0, JSFunction::kSharedFunctionInfoOffset)); 1550 __ ldr(r0, FieldMemOperand(r0, JSFunction::kSharedFunctionInfoOffset));
1551 Handle<Code> apply_code(Builtins::builtin(Builtins::FunctionApply)); 1551 Handle<Code> apply_code(
1552 Isolate::Current()->builtins()->builtin(Builtins::FunctionApply));
1552 __ ldr(r1, FieldMemOperand(r0, SharedFunctionInfo::kCodeOffset)); 1553 __ ldr(r1, FieldMemOperand(r0, SharedFunctionInfo::kCodeOffset));
1553 __ cmp(r1, Operand(apply_code)); 1554 __ cmp(r1, Operand(apply_code));
1554 __ b(ne, &build_args); 1555 __ b(ne, &build_args);
1555 1556
1556 // Check that applicand is a function. 1557 // Check that applicand is a function.
1557 __ ldr(r1, MemOperand(sp, 2 * kPointerSize)); 1558 __ ldr(r1, MemOperand(sp, 2 * kPointerSize));
1558 __ BranchOnSmi(r1, &build_args); 1559 __ BranchOnSmi(r1, &build_args);
1559 __ CompareObjectType(r1, r2, r3, JS_FUNCTION_TYPE); 1560 __ CompareObjectType(r1, r2, r3, JS_FUNCTION_TYPE);
1560 __ b(ne, &build_args); 1561 __ b(ne, &build_args);
1561 1562
(...skipping 1800 matching lines...) Expand 10 before | Expand all | Expand 10 after
3362 Literal* key = property->key(); 3363 Literal* key = property->key();
3363 Expression* value = property->value(); 3364 Expression* value = property->value();
3364 switch (property->kind()) { 3365 switch (property->kind()) {
3365 case ObjectLiteral::Property::CONSTANT: 3366 case ObjectLiteral::Property::CONSTANT:
3366 break; 3367 break;
3367 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 3368 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
3368 if (CompileTimeValue::IsCompileTimeValue(property->value())) break; 3369 if (CompileTimeValue::IsCompileTimeValue(property->value())) break;
3369 // else fall through 3370 // else fall through
3370 case ObjectLiteral::Property::COMPUTED: 3371 case ObjectLiteral::Property::COMPUTED:
3371 if (key->handle()->IsSymbol()) { 3372 if (key->handle()->IsSymbol()) {
3372 Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize)); 3373 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
3374 Builtins::StoreIC_Initialize));
3373 Load(value); 3375 Load(value);
3374 frame_->EmitPop(r0); 3376 frame_->EmitPop(r0);
3375 __ mov(r2, Operand(key->handle())); 3377 __ mov(r2, Operand(key->handle()));
3376 __ ldr(r1, frame_->Top()); // Load the receiver. 3378 __ ldr(r1, frame_->Top()); // Load the receiver.
3377 frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); 3379 frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
3378 break; 3380 break;
3379 } 3381 }
3380 // else fall through 3382 // else fall through
3381 case ObjectLiteral::Property::PROTOTYPE: { 3383 case ObjectLiteral::Property::PROTOTYPE: {
3382 __ ldr(r0, frame_->Top()); 3384 __ ldr(r0, frame_->Top());
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after
4167 VirtualFrame::SpilledScope spilled_scope(frame_); 4169 VirtualFrame::SpilledScope spilled_scope(frame_);
4168 4170
4169 // r0: the number of arguments. 4171 // r0: the number of arguments.
4170 __ mov(r0, Operand(arg_count)); 4172 __ mov(r0, Operand(arg_count));
4171 // Load the function into r1 as per calling convention. 4173 // Load the function into r1 as per calling convention.
4172 __ ldr(r1, frame_->ElementAt(arg_count + 1)); 4174 __ ldr(r1, frame_->ElementAt(arg_count + 1));
4173 4175
4174 // Call the construct call builtin that handles allocation and 4176 // Call the construct call builtin that handles allocation and
4175 // constructor invocation. 4177 // constructor invocation.
4176 CodeForSourcePosition(node->position()); 4178 CodeForSourcePosition(node->position());
4177 Handle<Code> ic(Builtins::builtin(Builtins::JSConstructCall)); 4179 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
4180 Builtins::JSConstructCall));
4178 frame_->CallCodeObject(ic, RelocInfo::CONSTRUCT_CALL, arg_count + 1); 4181 frame_->CallCodeObject(ic, RelocInfo::CONSTRUCT_CALL, arg_count + 1);
4179 4182
4180 // Discard old TOS value and push r0 on the stack (same as Pop(), push(r0)). 4183 // Discard old TOS value and push r0 on the stack (same as Pop(), push(r0)).
4181 __ str(r0, frame_->Top()); 4184 __ str(r0, frame_->Top());
4182 ASSERT_EQ(original_height + 1, frame_->height()); 4185 ASSERT_EQ(original_height + 1, frame_->height());
4183 } 4186 }
4184 4187
4185 4188
4186 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) { 4189 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) {
4187 VirtualFrame::SpilledScope spilled_scope(frame_); 4190 VirtualFrame::SpilledScope spilled_scope(frame_);
(...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after
5156 int original_height = frame_->height(); 5159 int original_height = frame_->height();
5157 #endif 5160 #endif
5158 if (CheckForInlineRuntimeCall(node)) { 5161 if (CheckForInlineRuntimeCall(node)) {
5159 ASSERT((has_cc() && frame_->height() == original_height) || 5162 ASSERT((has_cc() && frame_->height() == original_height) ||
5160 (!has_cc() && frame_->height() == original_height + 1)); 5163 (!has_cc() && frame_->height() == original_height + 1));
5161 return; 5164 return;
5162 } 5165 }
5163 5166
5164 ZoneList<Expression*>* args = node->arguments(); 5167 ZoneList<Expression*>* args = node->arguments();
5165 Comment cmnt(masm_, "[ CallRuntime"); 5168 Comment cmnt(masm_, "[ CallRuntime");
5166 Runtime::Function* function = node->function(); 5169 const Runtime::Function* function = node->function();
5167 5170
5168 if (function == NULL) { 5171 if (function == NULL) {
5169 // Prepare stack for calling JS runtime function. 5172 // Prepare stack for calling JS runtime function.
5170 // Push the builtins object found in the current global object. 5173 // Push the builtins object found in the current global object.
5171 Register scratch = VirtualFrame::scratch0(); 5174 Register scratch = VirtualFrame::scratch0();
5172 __ ldr(scratch, GlobalObject()); 5175 __ ldr(scratch, GlobalObject());
5173 Register builtins = frame_->GetTOSRegister(); 5176 Register builtins = frame_->GetTOSRegister();
5174 __ ldr(builtins, FieldMemOperand(scratch, GlobalObject::kBuiltinsOffset)); 5177 __ ldr(builtins, FieldMemOperand(scratch, GlobalObject::kBuiltinsOffset));
5175 frame_->EmitPush(builtins); 5178 frame_->EmitPush(builtins);
5176 } 5179 }
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after
5892 ASSERT(!receiver_.is(scratch1) && !receiver_.is(scratch2)); 5895 ASSERT(!receiver_.is(scratch1) && !receiver_.is(scratch2));
5893 __ DecrementCounter(&Counters::named_load_inline, 1, scratch1, scratch2); 5896 __ DecrementCounter(&Counters::named_load_inline, 1, scratch1, scratch2);
5894 __ IncrementCounter(&Counters::named_load_inline_miss, 1, scratch1, scratch2); 5897 __ IncrementCounter(&Counters::named_load_inline_miss, 1, scratch1, scratch2);
5895 5898
5896 // Ensure receiver in r0 and name in r2 to match load ic calling convention. 5899 // Ensure receiver in r0 and name in r2 to match load ic calling convention.
5897 __ Move(r0, receiver_); 5900 __ Move(r0, receiver_);
5898 __ mov(r2, Operand(name_)); 5901 __ mov(r2, Operand(name_));
5899 5902
5900 // The rest of the instructions in the deferred code must be together. 5903 // The rest of the instructions in the deferred code must be together.
5901 { Assembler::BlockConstPoolScope block_const_pool(masm_); 5904 { Assembler::BlockConstPoolScope block_const_pool(masm_);
5902 Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); 5905 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
5906 Builtins::LoadIC_Initialize));
5903 __ Call(ic, RelocInfo::CODE_TARGET); 5907 __ Call(ic, RelocInfo::CODE_TARGET);
5904 // The call must be followed by a nop(1) instruction to indicate that the 5908 // The call must be followed by a nop(1) instruction to indicate that the
5905 // in-object has been inlined. 5909 // in-object has been inlined.
5906 __ nop(PROPERTY_ACCESS_INLINED); 5910 __ nop(PROPERTY_ACCESS_INLINED);
5907 5911
5908 // At this point the answer is in r0. We move it to the expected register 5912 // At this point the answer is in r0. We move it to the expected register
5909 // if necessary. 5913 // if necessary.
5910 __ Move(receiver_, r0); 5914 __ Move(receiver_, r0);
5911 5915
5912 // Now go back to the frame that we entered with. This will not overwrite 5916 // Now go back to the frame that we entered with. This will not overwrite
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
5951 5955
5952 // Ensure key in r0 and receiver in r1 to match keyed load ic calling 5956 // Ensure key in r0 and receiver in r1 to match keyed load ic calling
5953 // convention. 5957 // convention.
5954 if (key_.is(r1)) { 5958 if (key_.is(r1)) {
5955 __ Swap(r0, r1, ip); 5959 __ Swap(r0, r1, ip);
5956 } 5960 }
5957 5961
5958 // The rest of the instructions in the deferred code must be together. 5962 // The rest of the instructions in the deferred code must be together.
5959 { Assembler::BlockConstPoolScope block_const_pool(masm_); 5963 { Assembler::BlockConstPoolScope block_const_pool(masm_);
5960 // Call keyed load IC. It has the arguments key and receiver in r0 and r1. 5964 // Call keyed load IC. It has the arguments key and receiver in r0 and r1.
5961 Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); 5965 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
5966 Builtins::KeyedLoadIC_Initialize));
5962 __ Call(ic, RelocInfo::CODE_TARGET); 5967 __ Call(ic, RelocInfo::CODE_TARGET);
5963 // The call must be followed by a nop instruction to indicate that the 5968 // The call must be followed by a nop instruction to indicate that the
5964 // keyed load has been inlined. 5969 // keyed load has been inlined.
5965 __ nop(PROPERTY_ACCESS_INLINED); 5970 __ nop(PROPERTY_ACCESS_INLINED);
5966 5971
5967 // Block the constant pool for one more instruction after leaving this 5972 // Block the constant pool for one more instruction after leaving this
5968 // constant pool block scope to include the branch instruction ending the 5973 // constant pool block scope to include the branch instruction ending the
5969 // deferred code. 5974 // deferred code.
5970 __ BlockConstPoolFor(1); 5975 __ BlockConstPoolFor(1);
5971 } 5976 }
(...skipping 29 matching lines...) Expand all
6001 // calling convention. 6006 // calling convention.
6002 if (value_.is(r1)) { 6007 if (value_.is(r1)) {
6003 __ Swap(r0, r1, ip); 6008 __ Swap(r0, r1, ip);
6004 } 6009 }
6005 ASSERT(receiver_.is(r2)); 6010 ASSERT(receiver_.is(r2));
6006 6011
6007 // The rest of the instructions in the deferred code must be together. 6012 // The rest of the instructions in the deferred code must be together.
6008 { Assembler::BlockConstPoolScope block_const_pool(masm_); 6013 { Assembler::BlockConstPoolScope block_const_pool(masm_);
6009 // Call keyed store IC. It has the arguments value, key and receiver in r0, 6014 // Call keyed store IC. It has the arguments value, key and receiver in r0,
6010 // r1 and r2. 6015 // r1 and r2.
6011 Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize)); 6016 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
6017 Builtins::KeyedStoreIC_Initialize));
6012 __ Call(ic, RelocInfo::CODE_TARGET); 6018 __ Call(ic, RelocInfo::CODE_TARGET);
6013 // The call must be followed by a nop instruction to indicate that the 6019 // The call must be followed by a nop instruction to indicate that the
6014 // keyed store has been inlined. 6020 // keyed store has been inlined.
6015 __ nop(PROPERTY_ACCESS_INLINED); 6021 __ nop(PROPERTY_ACCESS_INLINED);
6016 6022
6017 // Block the constant pool for one more instruction after leaving this 6023 // Block the constant pool for one more instruction after leaving this
6018 // constant pool block scope to include the branch instruction ending the 6024 // constant pool block scope to include the branch instruction ending the
6019 // deferred code. 6025 // deferred code.
6020 __ BlockConstPoolFor(1); 6026 __ BlockConstPoolFor(1);
6021 } 6027 }
(...skipping 3529 matching lines...) Expand 10 before | Expand all | Expand 10 after
9551 __ InvokeFunction(r1, actual, JUMP_FUNCTION); 9557 __ InvokeFunction(r1, actual, JUMP_FUNCTION);
9552 9558
9553 // Slow-case: Non-function called. 9559 // Slow-case: Non-function called.
9554 __ bind(&slow); 9560 __ bind(&slow);
9555 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead 9561 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead
9556 // of the original receiver from the call site). 9562 // of the original receiver from the call site).
9557 __ str(r1, MemOperand(sp, argc_ * kPointerSize)); 9563 __ str(r1, MemOperand(sp, argc_ * kPointerSize));
9558 __ mov(r0, Operand(argc_)); // Setup the number of arguments. 9564 __ mov(r0, Operand(argc_)); // Setup the number of arguments.
9559 __ mov(r2, Operand(0)); 9565 __ mov(r2, Operand(0));
9560 __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION); 9566 __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION);
9561 __ Jump(Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)), 9567 __ Jump(Handle<Code>(Isolate::Current()->builtins()->builtin(
9562 RelocInfo::CODE_TARGET); 9568 Builtins::ArgumentsAdaptorTrampoline)), RelocInfo::CODE_TARGET);
9563 } 9569 }
9564 9570
9565 9571
9566 // Unfortunately you have to run without snapshots to see most of these 9572 // Unfortunately you have to run without snapshots to see most of these
9567 // names in the profile since most compare stubs end up in the snapshot. 9573 // names in the profile since most compare stubs end up in the snapshot.
9568 const char* CompareStub::GetName() { 9574 const char* CompareStub::GetName() {
9569 if (name_ != NULL) return name_; 9575 if (name_ != NULL) return name_;
9570 const int kMaxNameLength = 100; 9576 const int kMaxNameLength = 100;
9571 name_ = Bootstrapper::AllocateAutoDeletedArray(kMaxNameLength); 9577 name_ = Bootstrapper::AllocateAutoDeletedArray(kMaxNameLength);
9572 if (name_ == NULL) return "OOM"; 9578 if (name_ == NULL) return "OOM";
(...skipping 1127 matching lines...) Expand 10 before | Expand all | Expand 10 after
10700 __ bind(&string_add_runtime); 10706 __ bind(&string_add_runtime);
10701 __ TailCallRuntime(Runtime::kStringAdd, 2, 1); 10707 __ TailCallRuntime(Runtime::kStringAdd, 2, 1);
10702 } 10708 }
10703 10709
10704 10710
10705 #undef __ 10711 #undef __
10706 10712
10707 } } // namespace v8::internal 10713 } } // namespace v8::internal
10708 10714
10709 #endif // V8_TARGET_ARCH_ARM 10715 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/codegen-arm.h ('k') | src/arm/full-codegen-arm.cc » ('j') | src/runtime.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698