| OLD | NEW |
| 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 2720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2731 void LCodeGen::DoGlobalReceiver(LGlobalReceiver* instr) { | 2731 void LCodeGen::DoGlobalReceiver(LGlobalReceiver* instr) { |
| 2732 Register global = ToRegister(instr->global()); | 2732 Register global = ToRegister(instr->global()); |
| 2733 Register result = ToRegister(instr->result()); | 2733 Register result = ToRegister(instr->result()); |
| 2734 __ mov(result, FieldOperand(global, GlobalObject::kGlobalReceiverOffset)); | 2734 __ mov(result, FieldOperand(global, GlobalObject::kGlobalReceiverOffset)); |
| 2735 } | 2735 } |
| 2736 | 2736 |
| 2737 | 2737 |
| 2738 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 2738 void LCodeGen::CallKnownFunction(Handle<JSFunction> function, |
| 2739 int arity, | 2739 int arity, |
| 2740 LInstruction* instr, | 2740 LInstruction* instr, |
| 2741 CallKind call_kind) { | 2741 CallKind call_kind, |
| 2742 EDIState edi_state) { |
| 2742 bool can_invoke_directly = !function->NeedsArgumentsAdaption() || | 2743 bool can_invoke_directly = !function->NeedsArgumentsAdaption() || |
| 2743 function->shared()->formal_parameter_count() == arity; | 2744 function->shared()->formal_parameter_count() == arity; |
| 2744 | 2745 |
| 2745 LPointerMap* pointers = instr->pointer_map(); | 2746 LPointerMap* pointers = instr->pointer_map(); |
| 2746 RecordPosition(pointers->position()); | 2747 RecordPosition(pointers->position()); |
| 2747 | 2748 |
| 2748 if (can_invoke_directly) { | 2749 if (can_invoke_directly) { |
| 2749 __ LoadHeapObject(edi, function); | 2750 if (edi_state == EDI_UNINITIALIZED) { |
| 2751 __ LoadHeapObject(edi, function); |
| 2752 } |
| 2750 | 2753 |
| 2751 // Change context if needed. | 2754 // Change context if needed. |
| 2752 bool change_context = | 2755 bool change_context = |
| 2753 (info()->closure()->context() != function->context()) || | 2756 (info()->closure()->context() != function->context()) || |
| 2754 scope()->contains_with() || | 2757 scope()->contains_with() || |
| 2755 (scope()->num_heap_slots() > 0); | 2758 (scope()->num_heap_slots() > 0); |
| 2756 | 2759 |
| 2757 if (change_context) { | 2760 if (change_context) { |
| 2758 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); | 2761 __ mov(esi, FieldOperand(edi, JSFunction::kContextOffset)); |
| 2759 } else { | 2762 } else { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2782 __ InvokeFunction(function, count, CALL_FUNCTION, generator, call_kind); | 2785 __ InvokeFunction(function, count, CALL_FUNCTION, generator, call_kind); |
| 2783 } | 2786 } |
| 2784 } | 2787 } |
| 2785 | 2788 |
| 2786 | 2789 |
| 2787 void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { | 2790 void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { |
| 2788 ASSERT(ToRegister(instr->result()).is(eax)); | 2791 ASSERT(ToRegister(instr->result()).is(eax)); |
| 2789 CallKnownFunction(instr->function(), | 2792 CallKnownFunction(instr->function(), |
| 2790 instr->arity(), | 2793 instr->arity(), |
| 2791 instr, | 2794 instr, |
| 2792 CALL_AS_METHOD); | 2795 CALL_AS_METHOD, |
| 2796 EDI_UNINITIALIZED); |
| 2793 } | 2797 } |
| 2794 | 2798 |
| 2795 | 2799 |
| 2796 void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr) { | 2800 void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr) { |
| 2797 Register input_reg = ToRegister(instr->value()); | 2801 Register input_reg = ToRegister(instr->value()); |
| 2798 __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), | 2802 __ cmp(FieldOperand(input_reg, HeapObject::kMapOffset), |
| 2799 factory()->heap_number_map()); | 2803 factory()->heap_number_map()); |
| 2800 DeoptimizeIf(not_equal, instr->environment()); | 2804 DeoptimizeIf(not_equal, instr->environment()); |
| 2801 | 2805 |
| 2802 Label done; | 2806 Label done; |
| (...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3229 UNREACHABLE(); | 3233 UNREACHABLE(); |
| 3230 } | 3234 } |
| 3231 } | 3235 } |
| 3232 | 3236 |
| 3233 | 3237 |
| 3234 void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { | 3238 void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { |
| 3235 ASSERT(ToRegister(instr->context()).is(esi)); | 3239 ASSERT(ToRegister(instr->context()).is(esi)); |
| 3236 ASSERT(ToRegister(instr->function()).is(edi)); | 3240 ASSERT(ToRegister(instr->function()).is(edi)); |
| 3237 ASSERT(instr->HasPointerMap()); | 3241 ASSERT(instr->HasPointerMap()); |
| 3238 ASSERT(instr->HasDeoptimizationEnvironment()); | 3242 ASSERT(instr->HasDeoptimizationEnvironment()); |
| 3239 LPointerMap* pointers = instr->pointer_map(); | 3243 |
| 3240 RecordPosition(pointers->position()); | 3244 if (instr->known_function().is_null()) { |
| 3241 SafepointGenerator generator( | 3245 LPointerMap* pointers = instr->pointer_map(); |
| 3242 this, pointers, Safepoint::kLazyDeopt); | 3246 RecordPosition(pointers->position()); |
| 3243 ParameterCount count(instr->arity()); | 3247 SafepointGenerator generator( |
| 3244 __ InvokeFunction(edi, count, CALL_FUNCTION, generator, CALL_AS_METHOD); | 3248 this, pointers, Safepoint::kLazyDeopt); |
| 3249 ParameterCount count(instr->arity()); |
| 3250 __ InvokeFunction(edi, count, CALL_FUNCTION, generator, CALL_AS_METHOD); |
| 3251 } else { |
| 3252 CallKnownFunction(instr->known_function(), |
| 3253 instr->arity(), |
| 3254 instr, |
| 3255 CALL_AS_METHOD, |
| 3256 EDI_CONTAINS_TARGET); |
| 3257 } |
| 3245 } | 3258 } |
| 3246 | 3259 |
| 3247 | 3260 |
| 3248 void LCodeGen::DoCallKeyed(LCallKeyed* instr) { | 3261 void LCodeGen::DoCallKeyed(LCallKeyed* instr) { |
| 3249 ASSERT(ToRegister(instr->context()).is(esi)); | 3262 ASSERT(ToRegister(instr->context()).is(esi)); |
| 3250 ASSERT(ToRegister(instr->key()).is(ecx)); | 3263 ASSERT(ToRegister(instr->key()).is(ecx)); |
| 3251 ASSERT(ToRegister(instr->result()).is(eax)); | 3264 ASSERT(ToRegister(instr->result()).is(eax)); |
| 3252 | 3265 |
| 3253 int arity = instr->arity(); | 3266 int arity = instr->arity(); |
| 3254 Handle<Code> ic = | 3267 Handle<Code> ic = |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3289 RelocInfo::Mode mode = RelocInfo::CODE_TARGET_CONTEXT; | 3302 RelocInfo::Mode mode = RelocInfo::CODE_TARGET_CONTEXT; |
| 3290 Handle<Code> ic = | 3303 Handle<Code> ic = |
| 3291 isolate()->stub_cache()->ComputeCallInitialize(arity, mode); | 3304 isolate()->stub_cache()->ComputeCallInitialize(arity, mode); |
| 3292 __ mov(ecx, instr->name()); | 3305 __ mov(ecx, instr->name()); |
| 3293 CallCode(ic, mode, instr); | 3306 CallCode(ic, mode, instr); |
| 3294 } | 3307 } |
| 3295 | 3308 |
| 3296 | 3309 |
| 3297 void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { | 3310 void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { |
| 3298 ASSERT(ToRegister(instr->result()).is(eax)); | 3311 ASSERT(ToRegister(instr->result()).is(eax)); |
| 3299 CallKnownFunction(instr->target(), instr->arity(), instr, CALL_AS_FUNCTION); | 3312 CallKnownFunction(instr->target(), |
| 3313 instr->arity(), |
| 3314 instr, |
| 3315 CALL_AS_FUNCTION, |
| 3316 EDI_UNINITIALIZED); |
| 3300 } | 3317 } |
| 3301 | 3318 |
| 3302 | 3319 |
| 3303 void LCodeGen::DoCallNew(LCallNew* instr) { | 3320 void LCodeGen::DoCallNew(LCallNew* instr) { |
| 3304 ASSERT(ToRegister(instr->context()).is(esi)); | 3321 ASSERT(ToRegister(instr->context()).is(esi)); |
| 3305 ASSERT(ToRegister(instr->constructor()).is(edi)); | 3322 ASSERT(ToRegister(instr->constructor()).is(edi)); |
| 3306 ASSERT(ToRegister(instr->result()).is(eax)); | 3323 ASSERT(ToRegister(instr->result()).is(eax)); |
| 3307 | 3324 |
| 3308 CallConstructStub stub(NO_CALL_FUNCTION_FLAGS); | 3325 CallConstructStub stub(NO_CALL_FUNCTION_FLAGS); |
| 3309 __ Set(eax, Immediate(instr->arity())); | 3326 __ Set(eax, Immediate(instr->arity())); |
| (...skipping 1698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5008 FixedArray::kHeaderSize - kPointerSize)); | 5025 FixedArray::kHeaderSize - kPointerSize)); |
| 5009 __ bind(&done); | 5026 __ bind(&done); |
| 5010 } | 5027 } |
| 5011 | 5028 |
| 5012 | 5029 |
| 5013 #undef __ | 5030 #undef __ |
| 5014 | 5031 |
| 5015 } } // namespace v8::internal | 5032 } } // namespace v8::internal |
| 5016 | 5033 |
| 5017 #endif // V8_TARGET_ARCH_IA32 | 5034 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |