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

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

Issue 6717018: Introduce accessors on builtins instance (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Removing Handle suffix and renaming enum entries Created 9 years, 9 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 1769 matching lines...) Expand 10 before | Expand all | Expand 10 after
1780 STATIC_ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1); 1780 STATIC_ASSERT(JS_FUNCTION_TYPE == LAST_JS_OBJECT_TYPE + 1);
1781 __ CompareObjectType(receiver_reg, r2, r3, FIRST_JS_OBJECT_TYPE); 1781 __ CompareObjectType(receiver_reg, r2, r3, FIRST_JS_OBJECT_TYPE);
1782 __ b(lt, &build_args); 1782 __ b(lt, &build_args);
1783 1783
1784 // Check that applicand.apply is Function.prototype.apply. 1784 // Check that applicand.apply is Function.prototype.apply.
1785 __ ldr(r0, MemOperand(sp, kPointerSize)); 1785 __ ldr(r0, MemOperand(sp, kPointerSize));
1786 __ JumpIfSmi(r0, &build_args); 1786 __ JumpIfSmi(r0, &build_args);
1787 __ CompareObjectType(r0, r1, r2, JS_FUNCTION_TYPE); 1787 __ CompareObjectType(r0, r1, r2, JS_FUNCTION_TYPE);
1788 __ b(ne, &build_args); 1788 __ b(ne, &build_args);
1789 Handle<Code> apply_code( 1789 Handle<Code> apply_code(
1790 Isolate::Current()->builtins()->builtin(Builtins::FunctionApply)); 1790 Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply));
1791 __ ldr(r1, FieldMemOperand(r0, JSFunction::kCodeEntryOffset)); 1791 __ ldr(r1, FieldMemOperand(r0, JSFunction::kCodeEntryOffset));
1792 __ sub(r1, r1, Operand(Code::kHeaderSize - kHeapObjectTag)); 1792 __ sub(r1, r1, Operand(Code::kHeaderSize - kHeapObjectTag));
1793 __ cmp(r1, Operand(apply_code)); 1793 __ cmp(r1, Operand(apply_code));
1794 __ b(ne, &build_args); 1794 __ b(ne, &build_args);
1795 1795
1796 // Check that applicand is a function. 1796 // Check that applicand is a function.
1797 __ ldr(r1, MemOperand(sp, 2 * kPointerSize)); 1797 __ ldr(r1, MemOperand(sp, 2 * kPointerSize));
1798 __ JumpIfSmi(r1, &build_args); 1798 __ JumpIfSmi(r1, &build_args);
1799 __ CompareObjectType(r1, r2, r3, JS_FUNCTION_TYPE); 1799 __ CompareObjectType(r1, r2, r3, JS_FUNCTION_TYPE);
1800 __ b(ne, &build_args); 1800 __ b(ne, &build_args);
(...skipping 1824 matching lines...) Expand 10 before | Expand all | Expand 10 after
3625 Expression* value = property->value(); 3625 Expression* value = property->value();
3626 switch (property->kind()) { 3626 switch (property->kind()) {
3627 case ObjectLiteral::Property::CONSTANT: 3627 case ObjectLiteral::Property::CONSTANT:
3628 break; 3628 break;
3629 case ObjectLiteral::Property::MATERIALIZED_LITERAL: 3629 case ObjectLiteral::Property::MATERIALIZED_LITERAL:
3630 if (CompileTimeValue::IsCompileTimeValue(property->value())) break; 3630 if (CompileTimeValue::IsCompileTimeValue(property->value())) break;
3631 // else fall through 3631 // else fall through
3632 case ObjectLiteral::Property::COMPUTED: 3632 case ObjectLiteral::Property::COMPUTED:
3633 if (key->handle()->IsSymbol()) { 3633 if (key->handle()->IsSymbol()) {
3634 Handle<Code> ic(Isolate::Current()->builtins()->builtin( 3634 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
3635 Builtins::StoreIC_Initialize)); 3635 Builtins::kStoreIC_Initialize));
3636 Load(value); 3636 Load(value);
3637 if (property->emit_store()) { 3637 if (property->emit_store()) {
3638 frame_->PopToR0(); 3638 frame_->PopToR0();
3639 // Fetch the object literal. 3639 // Fetch the object literal.
3640 frame_->SpillAllButCopyTOSToR1(); 3640 frame_->SpillAllButCopyTOSToR1();
3641 __ mov(r2, Operand(key->handle())); 3641 __ mov(r2, Operand(key->handle()));
3642 frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0); 3642 frame_->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
3643 } else { 3643 } else {
3644 frame_->Drop(); 3644 frame_->Drop();
3645 } 3645 }
(...skipping 807 matching lines...) Expand 10 before | Expand all | Expand 10 after
4453 4453
4454 // Load the argument count into r0 and the function into r1 as per 4454 // Load the argument count into r0 and the function into r1 as per
4455 // calling convention. 4455 // calling convention.
4456 __ mov(r0, Operand(arg_count)); 4456 __ mov(r0, Operand(arg_count));
4457 __ ldr(r1, frame_->ElementAt(arg_count)); 4457 __ ldr(r1, frame_->ElementAt(arg_count));
4458 4458
4459 // Call the construct call builtin that handles allocation and 4459 // Call the construct call builtin that handles allocation and
4460 // constructor invocation. 4460 // constructor invocation.
4461 CodeForSourcePosition(node->position()); 4461 CodeForSourcePosition(node->position());
4462 Handle<Code> ic(Isolate::Current()->builtins()->builtin( 4462 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
4463 Builtins::JSConstructCall)); 4463 Builtins::kJSConstructCall));
4464 frame_->CallCodeObject(ic, RelocInfo::CONSTRUCT_CALL, arg_count + 1); 4464 frame_->CallCodeObject(ic, RelocInfo::CONSTRUCT_CALL, arg_count + 1);
4465 frame_->EmitPush(r0); 4465 frame_->EmitPush(r0);
4466 4466
4467 ASSERT_EQ(original_height + 1, frame_->height()); 4467 ASSERT_EQ(original_height + 1, frame_->height());
4468 } 4468 }
4469 4469
4470 4470
4471 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) { 4471 void CodeGenerator::GenerateClassOf(ZoneList<Expression*>* args) {
4472 Register scratch = VirtualFrame::scratch0(); 4472 Register scratch = VirtualFrame::scratch0();
4473 JumpTarget null, function, leave, non_function_constructor; 4473 JumpTarget null, function, leave, non_function_constructor;
(...skipping 2118 matching lines...) Expand 10 before | Expand all | Expand 10 after
6592 __ IncrementCounter(COUNTERS->named_load_inline_miss(), 1, 6592 __ IncrementCounter(COUNTERS->named_load_inline_miss(), 1,
6593 scratch1, scratch2); 6593 scratch1, scratch2);
6594 6594
6595 // Ensure receiver in r0 and name in r2 to match load ic calling convention. 6595 // Ensure receiver in r0 and name in r2 to match load ic calling convention.
6596 __ Move(r0, receiver_); 6596 __ Move(r0, receiver_);
6597 __ mov(r2, Operand(name_)); 6597 __ mov(r2, Operand(name_));
6598 6598
6599 // The rest of the instructions in the deferred code must be together. 6599 // The rest of the instructions in the deferred code must be together.
6600 { Assembler::BlockConstPoolScope block_const_pool(masm_); 6600 { Assembler::BlockConstPoolScope block_const_pool(masm_);
6601 Handle<Code> ic(Isolate::Current()->builtins()->builtin( 6601 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
6602 Builtins::LoadIC_Initialize)); 6602 Builtins::kLoadIC_Initialize));
6603 RelocInfo::Mode mode = is_contextual_ 6603 RelocInfo::Mode mode = is_contextual_
6604 ? RelocInfo::CODE_TARGET_CONTEXT 6604 ? RelocInfo::CODE_TARGET_CONTEXT
6605 : RelocInfo::CODE_TARGET; 6605 : RelocInfo::CODE_TARGET;
6606 __ Call(ic, mode); 6606 __ Call(ic, mode);
6607 // We must mark the code just after the call with the correct marker. 6607 // We must mark the code just after the call with the correct marker.
6608 MacroAssembler::NopMarkerTypes code_marker; 6608 MacroAssembler::NopMarkerTypes code_marker;
6609 if (is_contextual_) { 6609 if (is_contextual_) {
6610 code_marker = is_dont_delete_ 6610 code_marker = is_dont_delete_
6611 ? MacroAssembler::PROPERTY_ACCESS_INLINED_CONTEXT_DONT_DELETE 6611 ? MacroAssembler::PROPERTY_ACCESS_INLINED_CONTEXT_DONT_DELETE
6612 : MacroAssembler::PROPERTY_ACCESS_INLINED_CONTEXT; 6612 : MacroAssembler::PROPERTY_ACCESS_INLINED_CONTEXT;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
6668 // Ensure key in r0 and receiver in r1 to match keyed load ic calling 6668 // Ensure key in r0 and receiver in r1 to match keyed load ic calling
6669 // convention. 6669 // convention.
6670 if (key_.is(r1)) { 6670 if (key_.is(r1)) {
6671 __ Swap(r0, r1, ip); 6671 __ Swap(r0, r1, ip);
6672 } 6672 }
6673 6673
6674 // The rest of the instructions in the deferred code must be together. 6674 // The rest of the instructions in the deferred code must be together.
6675 { Assembler::BlockConstPoolScope block_const_pool(masm_); 6675 { Assembler::BlockConstPoolScope block_const_pool(masm_);
6676 // Call keyed load IC. It has the arguments key and receiver in r0 and r1. 6676 // Call keyed load IC. It has the arguments key and receiver in r0 and r1.
6677 Handle<Code> ic(Isolate::Current()->builtins()->builtin( 6677 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
6678 Builtins::KeyedLoadIC_Initialize)); 6678 Builtins::kKeyedLoadIC_Initialize));
6679 __ Call(ic, RelocInfo::CODE_TARGET); 6679 __ Call(ic, RelocInfo::CODE_TARGET);
6680 // The call must be followed by a nop instruction to indicate that the 6680 // The call must be followed by a nop instruction to indicate that the
6681 // keyed load has been inlined. 6681 // keyed load has been inlined.
6682 __ MarkCode(MacroAssembler::PROPERTY_ACCESS_INLINED); 6682 __ MarkCode(MacroAssembler::PROPERTY_ACCESS_INLINED);
6683 6683
6684 // Now go back to the frame that we entered with. This will not overwrite 6684 // Now go back to the frame that we entered with. This will not overwrite
6685 // the receiver or key registers since they were not in use when we came 6685 // the receiver or key registers since they were not in use when we came
6686 // in. The instructions emitted by this merge are skipped over by the 6686 // in. The instructions emitted by this merge are skipped over by the
6687 // inline load patching mechanism when looking for the branch instruction 6687 // inline load patching mechanism when looking for the branch instruction
6688 // that tells it where the code to patch is. 6688 // that tells it where the code to patch is.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
6731 if (value_.is(r1)) { 6731 if (value_.is(r1)) {
6732 __ Swap(r0, r1, ip); 6732 __ Swap(r0, r1, ip);
6733 } 6733 }
6734 ASSERT(receiver_.is(r2)); 6734 ASSERT(receiver_.is(r2));
6735 6735
6736 // The rest of the instructions in the deferred code must be together. 6736 // The rest of the instructions in the deferred code must be together.
6737 { Assembler::BlockConstPoolScope block_const_pool(masm_); 6737 { Assembler::BlockConstPoolScope block_const_pool(masm_);
6738 // Call keyed store IC. It has the arguments value, key and receiver in r0, 6738 // Call keyed store IC. It has the arguments value, key and receiver in r0,
6739 // r1 and r2. 6739 // r1 and r2.
6740 Handle<Code> ic(Isolate::Current()->builtins()->builtin( 6740 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
6741 (strict_mode_ == kStrictMode) ? Builtins::KeyedStoreIC_Initialize_Strict 6741 (strict_mode_ == kStrictMode)
6742 : Builtins::KeyedStoreIC_Initialize)); 6742 ? Builtins::kKeyedStoreIC_Initialize_Strict
6743 : Builtins::kKeyedStoreIC_Initialize));
6743 __ Call(ic, RelocInfo::CODE_TARGET); 6744 __ Call(ic, RelocInfo::CODE_TARGET);
6744 // The call must be followed by a nop instruction to indicate that the 6745 // The call must be followed by a nop instruction to indicate that the
6745 // keyed store has been inlined. 6746 // keyed store has been inlined.
6746 __ MarkCode(MacroAssembler::PROPERTY_ACCESS_INLINED); 6747 __ MarkCode(MacroAssembler::PROPERTY_ACCESS_INLINED);
6747 6748
6748 // Block the constant pool for one more instruction after leaving this 6749 // Block the constant pool for one more instruction after leaving this
6749 // constant pool block scope to include the branch instruction ending the 6750 // constant pool block scope to include the branch instruction ending the
6750 // deferred code. 6751 // deferred code.
6751 __ BlockConstPoolFor(1); 6752 __ BlockConstPoolFor(1);
6752 } 6753 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
6786 // Ensure value in r0, receiver in r1 to match store ic calling 6787 // Ensure value in r0, receiver in r1 to match store ic calling
6787 // convention. 6788 // convention.
6788 ASSERT(value_.is(r0) && receiver_.is(r1)); 6789 ASSERT(value_.is(r0) && receiver_.is(r1));
6789 __ mov(r2, Operand(name_)); 6790 __ mov(r2, Operand(name_));
6790 6791
6791 // The rest of the instructions in the deferred code must be together. 6792 // The rest of the instructions in the deferred code must be together.
6792 { Assembler::BlockConstPoolScope block_const_pool(masm_); 6793 { Assembler::BlockConstPoolScope block_const_pool(masm_);
6793 // Call keyed store IC. It has the arguments value, key and receiver in r0, 6794 // Call keyed store IC. It has the arguments value, key and receiver in r0,
6794 // r1 and r2. 6795 // r1 and r2.
6795 Handle<Code> ic(Isolate::Current()->builtins()->builtin( 6796 Handle<Code> ic(Isolate::Current()->builtins()->builtin(
6796 (strict_mode_ == kStrictMode) ? Builtins::StoreIC_Initialize_Strict 6797 (strict_mode_ == kStrictMode) ? Builtins::kStoreIC_Initialize_Strict
6797 : Builtins::StoreIC_Initialize)); 6798 : Builtins::kStoreIC_Initialize));
6798 __ Call(ic, RelocInfo::CODE_TARGET); 6799 __ Call(ic, RelocInfo::CODE_TARGET);
6799 // The call must be followed by a nop instruction to indicate that the 6800 // The call must be followed by a nop instruction to indicate that the
6800 // named store has been inlined. 6801 // named store has been inlined.
6801 __ MarkCode(MacroAssembler::PROPERTY_ACCESS_INLINED); 6802 __ MarkCode(MacroAssembler::PROPERTY_ACCESS_INLINED);
6802 6803
6803 // Go back to the frame we entered with. The instructions 6804 // Go back to the frame we entered with. The instructions
6804 // generated by this merge are skipped over by the inline store 6805 // generated by this merge are skipped over by the inline store
6805 // patching mechanism when looking for the branch instruction that 6806 // patching mechanism when looking for the branch instruction that
6806 // tells it where the code to patch is. 6807 // tells it where the code to patch is.
6807 copied_frame.MergeTo(frame_state()->frame()); 6808 copied_frame.MergeTo(frame_state()->frame());
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after
7420 specialized_on_rhs_ ? "_ConstantRhs" : "", 7421 specialized_on_rhs_ ? "_ConstantRhs" : "",
7421 BinaryOpIC::GetName(runtime_operands_type_)); 7422 BinaryOpIC::GetName(runtime_operands_type_));
7422 return name_; 7423 return name_;
7423 } 7424 }
7424 7425
7425 #undef __ 7426 #undef __
7426 7427
7427 } } // namespace v8::internal 7428 } } // namespace v8::internal
7428 7429
7429 #endif // V8_TARGET_ARCH_ARM 7430 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « src/arm/code-stubs-arm.cc ('k') | src/arm/deoptimizer-arm.cc » ('j') | src/builtins.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698