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

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

Issue 88043002: Out-of-line constant pool on Arm: Stage 3 - Set Constant Pool Pointer on Function Entry (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Re-upload to fix code-review error. Created 7 years 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 // 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 112
113 113
114 // Generate code for a JS function. On entry to the function the receiver 114 // Generate code for a JS function. On entry to the function the receiver
115 // and arguments have been pushed on the stack left to right. The actual 115 // and arguments have been pushed on the stack left to right. The actual
116 // argument count matches the formal parameter count expected by the 116 // argument count matches the formal parameter count expected by the
117 // function. 117 // function.
118 // 118 //
119 // The live registers are: 119 // The live registers are:
120 // o r1: the JS function object being called (i.e., ourselves) 120 // o r1: the JS function object being called (i.e., ourselves)
121 // o cp: our context 121 // o cp: our context
122 // o pp: our constant pool pointer (if FLAG_enable_ool_constant_pool)
122 // o fp: our caller's frame pointer 123 // o fp: our caller's frame pointer
123 // o sp: stack pointer 124 // o sp: stack pointer
124 // o lr: return address 125 // o lr: return address
125 // 126 //
126 // The function builds a JS frame. Please see JavaScriptFrameConstants in 127 // The function builds a JS frame. Please see JavaScriptFrameConstants in
127 // frames-arm.h for its layout. 128 // frames-arm.h for its layout.
128 void FullCodeGenerator::Generate() { 129 void FullCodeGenerator::Generate() {
129 CompilationInfo* info = info_; 130 CompilationInfo* info = info_;
130 handler_table_ = 131 handler_table_ =
131 isolate()->factory()->NewFixedArray(function()->handler_count(), TENURED); 132 isolate()->factory()->NewFixedArray(function()->handler_count(), TENURED);
(...skipping 1872 matching lines...) Expand 10 before | Expand all | Expand 10 after
2004 __ str(cp, FieldMemOperand(r0, JSGeneratorObject::kContextOffset)); 2005 __ str(cp, FieldMemOperand(r0, JSGeneratorObject::kContextOffset));
2005 __ mov(r1, cp); 2006 __ mov(r1, cp);
2006 __ RecordWriteField(r0, JSGeneratorObject::kContextOffset, r1, r2, 2007 __ RecordWriteField(r0, JSGeneratorObject::kContextOffset, r1, r2,
2007 kLRHasBeenSaved, kDontSaveFPRegs); 2008 kLRHasBeenSaved, kDontSaveFPRegs);
2008 __ add(r1, fp, Operand(StandardFrameConstants::kExpressionsOffset)); 2009 __ add(r1, fp, Operand(StandardFrameConstants::kExpressionsOffset));
2009 __ cmp(sp, r1); 2010 __ cmp(sp, r1);
2010 __ b(eq, &post_runtime); 2011 __ b(eq, &post_runtime);
2011 __ push(r0); // generator object 2012 __ push(r0); // generator object
2012 __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1); 2013 __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1);
2013 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2014 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2015 __ RestoreConstantPoolPointer();
2014 __ bind(&post_runtime); 2016 __ bind(&post_runtime);
2015 __ pop(result_register()); 2017 __ pop(result_register());
2016 EmitReturnSequence(); 2018 EmitReturnSequence();
2017 2019
2018 __ bind(&resume); 2020 __ bind(&resume);
2019 context()->Plug(result_register()); 2021 context()->Plug(result_register());
2020 break; 2022 break;
2021 } 2023 }
2022 2024
2023 case Yield::FINAL: { 2025 case Yield::FINAL: {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2070 __ push(r0); // g 2072 __ push(r0); // g
2071 ASSERT(l_continuation.pos() > 0 && Smi::IsValid(l_continuation.pos())); 2073 ASSERT(l_continuation.pos() > 0 && Smi::IsValid(l_continuation.pos()));
2072 __ mov(r1, Operand(Smi::FromInt(l_continuation.pos()))); 2074 __ mov(r1, Operand(Smi::FromInt(l_continuation.pos())));
2073 __ str(r1, FieldMemOperand(r0, JSGeneratorObject::kContinuationOffset)); 2075 __ str(r1, FieldMemOperand(r0, JSGeneratorObject::kContinuationOffset));
2074 __ str(cp, FieldMemOperand(r0, JSGeneratorObject::kContextOffset)); 2076 __ str(cp, FieldMemOperand(r0, JSGeneratorObject::kContextOffset));
2075 __ mov(r1, cp); 2077 __ mov(r1, cp);
2076 __ RecordWriteField(r0, JSGeneratorObject::kContextOffset, r1, r2, 2078 __ RecordWriteField(r0, JSGeneratorObject::kContextOffset, r1, r2,
2077 kLRHasBeenSaved, kDontSaveFPRegs); 2079 kLRHasBeenSaved, kDontSaveFPRegs);
2078 __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1); 2080 __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1);
2079 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2081 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2082 __ RestoreConstantPoolPointer();
2080 __ pop(r0); // result 2083 __ pop(r0); // result
2081 EmitReturnSequence(); 2084 EmitReturnSequence();
2082 __ bind(&l_resume); // received in r0 2085 __ bind(&l_resume); // received in r0
2083 __ PopTryHandler(); 2086 __ PopTryHandler();
2084 2087
2085 // receiver = iter; f = 'next'; arg = received; 2088 // receiver = iter; f = 'next'; arg = received;
2086 __ bind(&l_next); 2089 __ bind(&l_next);
2087 __ LoadRoot(r2, Heap::knext_stringRootIndex); // "next" 2090 __ LoadRoot(r2, Heap::knext_stringRootIndex); // "next"
2088 __ ldr(r3, MemOperand(sp, 1 * kPointerSize)); // iter 2091 __ ldr(r3, MemOperand(sp, 1 * kPointerSize)); // iter
2089 __ Push(r3, r0); // iter, received 2092 __ Push(r3, r0); // iter, received
2090 2093
2091 // result = receiver[f](arg); 2094 // result = receiver[f](arg);
2092 __ bind(&l_call); 2095 __ bind(&l_call);
2093 Handle<Code> ic = isolate()->stub_cache()->ComputeKeyedCallInitialize(1); 2096 Handle<Code> ic = isolate()->stub_cache()->ComputeKeyedCallInitialize(1);
2094 CallIC(ic); 2097 CallIC(ic);
2095 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2098 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2099 __ RestoreConstantPoolPointer();
2096 2100
2097 // if (!result.done) goto l_try; 2101 // if (!result.done) goto l_try;
2098 __ bind(&l_loop); 2102 __ bind(&l_loop);
2099 __ push(r0); // save result 2103 __ push(r0); // save result
2100 __ LoadRoot(r2, Heap::kdone_stringRootIndex); // "done" 2104 __ LoadRoot(r2, Heap::kdone_stringRootIndex); // "done"
2101 Handle<Code> done_ic = isolate()->builtins()->LoadIC_Initialize(); 2105 Handle<Code> done_ic = isolate()->builtins()->LoadIC_Initialize();
2102 CallIC(done_ic); // result.done in r0 2106 CallIC(done_ic); // result.done in r0
2103 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate()); 2107 Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
2104 CallIC(bool_ic); 2108 CallIC(bool_ic);
2105 __ cmp(r0, Operand(0)); 2109 __ cmp(r0, Operand(0));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 // Enter a new JavaScript frame, and initialize its slots as they were when 2162 // Enter a new JavaScript frame, and initialize its slots as they were when
2159 // the generator was suspended. 2163 // the generator was suspended.
2160 Label resume_frame; 2164 Label resume_frame;
2161 __ bind(&push_frame); 2165 __ bind(&push_frame);
2162 __ bl(&resume_frame); 2166 __ bl(&resume_frame);
2163 __ jmp(&done); 2167 __ jmp(&done);
2164 __ bind(&resume_frame); 2168 __ bind(&resume_frame);
2165 // lr = return address. 2169 // lr = return address.
2166 // fp = caller's frame pointer. 2170 // fp = caller's frame pointer.
2167 // cp = callee's context, 2171 // cp = callee's context,
2172 // pp = callee's constant pool (if FLAG_enable_ool_constant_pool),
2168 // r4 = callee's JS function. 2173 // r4 = callee's JS function.
2169 __ Push(lr, fp, cp, r4); 2174 __ PushFixedFrame(r4);
2170 // Adjust FP to point to saved FP. 2175 // Adjust FP to point to saved FP.
2171 __ add(fp, sp, Operand(2 * kPointerSize)); 2176 __ add(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp));
2172 2177
2173 // Load the operand stack size. 2178 // Load the operand stack size.
2174 __ ldr(r3, FieldMemOperand(r1, JSGeneratorObject::kOperandStackOffset)); 2179 __ ldr(r3, FieldMemOperand(r1, JSGeneratorObject::kOperandStackOffset));
2175 __ ldr(r3, FieldMemOperand(r3, FixedArray::kLengthOffset)); 2180 __ ldr(r3, FieldMemOperand(r3, FixedArray::kLengthOffset));
2176 __ SmiUntag(r3); 2181 __ SmiUntag(r3);
2177 2182
2178 // If we are sending a value and there is no operand stack, we can jump back 2183 // If we are sending a value and there is no operand stack, we can jump back
2179 // in directly. 2184 // in directly.
2180 if (resume_mode == JSGeneratorObject::NEXT) { 2185 if (resume_mode == JSGeneratorObject::NEXT) {
2181 Label slow_resume; 2186 Label slow_resume;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2224 Handle<Map> map(isolate()->native_context()->generator_result_map()); 2229 Handle<Map> map(isolate()->native_context()->generator_result_map());
2225 2230
2226 __ Allocate(map->instance_size(), r0, r2, r3, &gc_required, TAG_OBJECT); 2231 __ Allocate(map->instance_size(), r0, r2, r3, &gc_required, TAG_OBJECT);
2227 __ jmp(&allocated); 2232 __ jmp(&allocated);
2228 2233
2229 __ bind(&gc_required); 2234 __ bind(&gc_required);
2230 __ Push(Smi::FromInt(map->instance_size())); 2235 __ Push(Smi::FromInt(map->instance_size()));
2231 __ CallRuntime(Runtime::kAllocateInNewSpace, 1); 2236 __ CallRuntime(Runtime::kAllocateInNewSpace, 1);
2232 __ ldr(context_register(), 2237 __ ldr(context_register(),
2233 MemOperand(fp, StandardFrameConstants::kContextOffset)); 2238 MemOperand(fp, StandardFrameConstants::kContextOffset));
2239 __ RestoreConstantPoolPointer();
2234 2240
2235 __ bind(&allocated); 2241 __ bind(&allocated);
2236 __ mov(r1, Operand(map)); 2242 __ mov(r1, Operand(map));
2237 __ pop(r2); 2243 __ pop(r2);
2238 __ mov(r3, Operand(isolate()->factory()->ToBoolean(done))); 2244 __ mov(r3, Operand(isolate()->factory()->ToBoolean(done)));
2239 __ mov(r4, Operand(isolate()->factory()->empty_fixed_array())); 2245 __ mov(r4, Operand(isolate()->factory()->empty_fixed_array()));
2240 ASSERT_EQ(map->instance_size(), 5 * kPointerSize); 2246 ASSERT_EQ(map->instance_size(), 5 * kPointerSize);
2241 __ str(r1, FieldMemOperand(r0, HeapObject::kMapOffset)); 2247 __ str(r1, FieldMemOperand(r0, HeapObject::kMapOffset));
2242 __ str(r4, FieldMemOperand(r0, JSObject::kPropertiesOffset)); 2248 __ str(r4, FieldMemOperand(r0, JSObject::kPropertiesOffset));
2243 __ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset)); 2249 __ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset));
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after
2609 } 2615 }
2610 __ mov(r2, Operand(name)); 2616 __ mov(r2, Operand(name));
2611 } 2617 }
2612 // Record source position for debugger. 2618 // Record source position for debugger.
2613 SetSourcePosition(expr->position()); 2619 SetSourcePosition(expr->position());
2614 // Call the IC initialization code. 2620 // Call the IC initialization code.
2615 Handle<Code> ic = 2621 Handle<Code> ic =
2616 isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode); 2622 isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode);
2617 CallIC(ic, mode, expr->CallFeedbackId()); 2623 CallIC(ic, mode, expr->CallFeedbackId());
2618 RecordJSReturnSite(expr); 2624 RecordJSReturnSite(expr);
2619 // Restore context register. 2625 // Restore context and pointer pool registers.
2620 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2626 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2627 __ RestoreConstantPoolPointer();
2621 context()->Plug(r0); 2628 context()->Plug(r0);
2622 } 2629 }
2623 2630
2624 2631
2625 void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr, 2632 void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr,
2626 Expression* key) { 2633 Expression* key) {
2627 // Load the key. 2634 // Load the key.
2628 VisitForAccumulatorValue(key); 2635 VisitForAccumulatorValue(key);
2629 2636
2630 // Swap the name of the function and the receiver on the stack to follow 2637 // Swap the name of the function and the receiver on the stack to follow
(...skipping 11 matching lines...) Expand all
2642 } 2649 }
2643 } 2650 }
2644 // Record source position for debugger. 2651 // Record source position for debugger.
2645 SetSourcePosition(expr->position()); 2652 SetSourcePosition(expr->position());
2646 // Call the IC initialization code. 2653 // Call the IC initialization code.
2647 Handle<Code> ic = 2654 Handle<Code> ic =
2648 isolate()->stub_cache()->ComputeKeyedCallInitialize(arg_count); 2655 isolate()->stub_cache()->ComputeKeyedCallInitialize(arg_count);
2649 __ ldr(r2, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Key. 2656 __ ldr(r2, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Key.
2650 CallIC(ic, RelocInfo::CODE_TARGET, expr->CallFeedbackId()); 2657 CallIC(ic, RelocInfo::CODE_TARGET, expr->CallFeedbackId());
2651 RecordJSReturnSite(expr); 2658 RecordJSReturnSite(expr);
2652 // Restore context register. 2659 // Restore context and pointer pool registers.
2653 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2660 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2661 __ RestoreConstantPoolPointer();
2654 context()->DropAndPlug(1, r0); // Drop the key still on the stack. 2662 context()->DropAndPlug(1, r0); // Drop the key still on the stack.
2655 } 2663 }
2656 2664
2657 2665
2658 void FullCodeGenerator::EmitCallWithStub(Call* expr, CallFunctionFlags flags) { 2666 void FullCodeGenerator::EmitCallWithStub(Call* expr, CallFunctionFlags flags) {
2659 // Code common for calls using the call stub. 2667 // Code common for calls using the call stub.
2660 ZoneList<Expression*>* args = expr->arguments(); 2668 ZoneList<Expression*>* args = expr->arguments();
2661 int arg_count = args->length(); 2669 int arg_count = args->length();
2662 { PreservePositionScope scope(masm()->positions_recorder()); 2670 { PreservePositionScope scope(masm()->positions_recorder());
2663 for (int i = 0; i < arg_count; i++) { 2671 for (int i = 0; i < arg_count; i++) {
2664 VisitForStackValue(args->at(i)); 2672 VisitForStackValue(args->at(i));
2665 } 2673 }
2666 } 2674 }
2667 // Record source position for debugger. 2675 // Record source position for debugger.
2668 SetSourcePosition(expr->position()); 2676 SetSourcePosition(expr->position());
2669 2677
2670 // Record call targets in unoptimized code. 2678 // Record call targets in unoptimized code.
2671 flags = static_cast<CallFunctionFlags>(flags | RECORD_CALL_TARGET); 2679 flags = static_cast<CallFunctionFlags>(flags | RECORD_CALL_TARGET);
2672 Handle<Object> uninitialized = 2680 Handle<Object> uninitialized =
2673 TypeFeedbackCells::UninitializedSentinel(isolate()); 2681 TypeFeedbackCells::UninitializedSentinel(isolate());
2674 Handle<Cell> cell = isolate()->factory()->NewCell(uninitialized); 2682 Handle<Cell> cell = isolate()->factory()->NewCell(uninitialized);
2675 RecordTypeFeedbackCell(expr->CallFeedbackId(), cell); 2683 RecordTypeFeedbackCell(expr->CallFeedbackId(), cell);
2676 __ mov(r2, Operand(cell)); 2684 __ mov(r2, Operand(cell));
2677 2685
2678 CallFunctionStub stub(arg_count, flags); 2686 CallFunctionStub stub(arg_count, flags);
2679 __ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); 2687 __ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize));
2680 __ CallStub(&stub, expr->CallFeedbackId()); 2688 __ CallStub(&stub, expr->CallFeedbackId());
2681 RecordJSReturnSite(expr); 2689 RecordJSReturnSite(expr);
2682 // Restore context register. 2690 // Restore context and pointer pool registers.
2683 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2691 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2692 __ RestoreConstantPoolPointer();
2684 context()->DropAndPlug(1, r0); 2693 context()->DropAndPlug(1, r0);
2685 } 2694 }
2686 2695
2687 2696
2688 void FullCodeGenerator::EmitResolvePossiblyDirectEval(int arg_count) { 2697 void FullCodeGenerator::EmitResolvePossiblyDirectEval(int arg_count) {
2689 // r4: copy of the first argument or undefined if it doesn't exist. 2698 // r4: copy of the first argument or undefined if it doesn't exist.
2690 if (arg_count > 0) { 2699 if (arg_count > 0) {
2691 __ ldr(r4, MemOperand(sp, arg_count * kPointerSize)); 2700 __ ldr(r4, MemOperand(sp, arg_count * kPointerSize));
2692 } else { 2701 } else {
2693 __ LoadRoot(r4, Heap::kUndefinedValueRootIndex); 2702 __ LoadRoot(r4, Heap::kUndefinedValueRootIndex);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2750 __ str(r0, MemOperand(sp, (arg_count + 1) * kPointerSize)); 2759 __ str(r0, MemOperand(sp, (arg_count + 1) * kPointerSize));
2751 __ str(r1, MemOperand(sp, arg_count * kPointerSize)); 2760 __ str(r1, MemOperand(sp, arg_count * kPointerSize));
2752 } 2761 }
2753 2762
2754 // Record source position for debugger. 2763 // Record source position for debugger.
2755 SetSourcePosition(expr->position()); 2764 SetSourcePosition(expr->position());
2756 CallFunctionStub stub(arg_count, RECEIVER_MIGHT_BE_IMPLICIT); 2765 CallFunctionStub stub(arg_count, RECEIVER_MIGHT_BE_IMPLICIT);
2757 __ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize)); 2766 __ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize));
2758 __ CallStub(&stub); 2767 __ CallStub(&stub);
2759 RecordJSReturnSite(expr); 2768 RecordJSReturnSite(expr);
2760 // Restore context register. 2769 // Restore context and pointer pool registers.
2761 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 2770 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2771 __ RestoreConstantPoolPointer();
2762 context()->DropAndPlug(1, r0); 2772 context()->DropAndPlug(1, r0);
2763 } else if (proxy != NULL && proxy->var()->IsUnallocated()) { 2773 } else if (proxy != NULL && proxy->var()->IsUnallocated()) {
2764 // Push global object as receiver for the call IC. 2774 // Push global object as receiver for the call IC.
2765 __ ldr(r0, GlobalObjectOperand()); 2775 __ ldr(r0, GlobalObjectOperand());
2766 __ push(r0); 2776 __ push(r0);
2767 EmitCallWithIC(expr, proxy->name(), RelocInfo::CODE_TARGET_CONTEXT); 2777 EmitCallWithIC(expr, proxy->name(), RelocInfo::CODE_TARGET_CONTEXT);
2768 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) { 2778 } else if (proxy != NULL && proxy->var()->IsLookupSlot()) {
2769 // Call to a lookup slot (dynamically introduced variable). 2779 // Call to a lookup slot (dynamically introduced variable).
2770 Label slow, done; 2780 Label slow, done;
2771 2781
(...skipping 973 matching lines...) Expand 10 before | Expand all | Expand 10 after
3745 __ JumpIfSmi(r0, &runtime); 3755 __ JumpIfSmi(r0, &runtime);
3746 __ CompareObjectType(r0, r1, r1, JS_FUNCTION_TYPE); 3756 __ CompareObjectType(r0, r1, r1, JS_FUNCTION_TYPE);
3747 __ b(ne, &runtime); 3757 __ b(ne, &runtime);
3748 3758
3749 // InvokeFunction requires the function in r1. Move it in there. 3759 // InvokeFunction requires the function in r1. Move it in there.
3750 __ mov(r1, result_register()); 3760 __ mov(r1, result_register());
3751 ParameterCount count(arg_count); 3761 ParameterCount count(arg_count);
3752 __ InvokeFunction(r1, count, CALL_FUNCTION, 3762 __ InvokeFunction(r1, count, CALL_FUNCTION,
3753 NullCallWrapper(), CALL_AS_METHOD); 3763 NullCallWrapper(), CALL_AS_METHOD);
3754 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 3764 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
3765 __ RestoreConstantPoolPointer();
3755 __ jmp(&done); 3766 __ jmp(&done);
3756 3767
3757 __ bind(&runtime); 3768 __ bind(&runtime);
3758 __ push(r0); 3769 __ push(r0);
3759 __ CallRuntime(Runtime::kCall, args->length()); 3770 __ CallRuntime(Runtime::kCall, args->length());
3760 __ bind(&done); 3771 __ bind(&done);
3761 3772
3762 context()->Plug(r0); 3773 context()->Plug(r0);
3763 } 3774 }
3764 3775
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
4159 VisitForStackValue(args->at(i)); 4170 VisitForStackValue(args->at(i));
4160 } 4171 }
4161 4172
4162 if (expr->is_jsruntime()) { 4173 if (expr->is_jsruntime()) {
4163 // Call the JS runtime function. 4174 // Call the JS runtime function.
4164 __ mov(r2, Operand(expr->name())); 4175 __ mov(r2, Operand(expr->name()));
4165 RelocInfo::Mode mode = RelocInfo::CODE_TARGET; 4176 RelocInfo::Mode mode = RelocInfo::CODE_TARGET;
4166 Handle<Code> ic = 4177 Handle<Code> ic =
4167 isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode); 4178 isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode);
4168 CallIC(ic, mode, expr->CallRuntimeFeedbackId()); 4179 CallIC(ic, mode, expr->CallRuntimeFeedbackId());
4169 // Restore context register. 4180 // Restore context and pointer pool registers.
4170 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); 4181 __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
4182 __ RestoreConstantPoolPointer();
4171 } else { 4183 } else {
4172 // Call the C runtime function. 4184 // Call the C runtime function.
4173 __ CallRuntime(expr->function(), arg_count); 4185 __ CallRuntime(expr->function(), arg_count);
4174 } 4186 }
4175 context()->Plug(r0); 4187 context()->Plug(r0);
4176 } 4188 }
4177 4189
4178 4190
4179 void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { 4191 void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
4180 switch (expr->op()) { 4192 switch (expr->op()) {
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
4924 ASSERT(Memory::uint32_at(interrupt_address_pointer) == 4936 ASSERT(Memory::uint32_at(interrupt_address_pointer) ==
4925 reinterpret_cast<uint32_t>( 4937 reinterpret_cast<uint32_t>(
4926 isolate->builtins()->OsrAfterStackCheck()->entry())); 4938 isolate->builtins()->OsrAfterStackCheck()->entry()));
4927 return OSR_AFTER_STACK_CHECK; 4939 return OSR_AFTER_STACK_CHECK;
4928 } 4940 }
4929 4941
4930 4942
4931 } } // namespace v8::internal 4943 } } // namespace v8::internal
4932 4944
4933 #endif // V8_TARGET_ARCH_ARM 4945 #endif // V8_TARGET_ARCH_ARM
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698