| 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 1998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2009 // We are pushing three values on the stack but recording a | 2009 // We are pushing three values on the stack but recording a |
| 2010 // safepoint with two arguments because stub is going to | 2010 // safepoint with two arguments because stub is going to |
| 2011 // remove the third argument from the stack before jumping | 2011 // remove the third argument from the stack before jumping |
| 2012 // to instanceof builtin on the slow path. | 2012 // to instanceof builtin on the slow path. |
| 2013 CallCodeGeneric(stub.GetCode(), | 2013 CallCodeGeneric(stub.GetCode(), |
| 2014 RelocInfo::CODE_TARGET, | 2014 RelocInfo::CODE_TARGET, |
| 2015 instr, | 2015 instr, |
| 2016 RECORD_SAFEPOINT_WITH_REGISTERS, | 2016 RECORD_SAFEPOINT_WITH_REGISTERS, |
| 2017 2); | 2017 2); |
| 2018 ASSERT(delta == masm_->SizeOfCodeGeneratedSince(map_check)); | 2018 ASSERT(delta == masm_->SizeOfCodeGeneratedSince(map_check)); |
| 2019 ASSERT(instr->HasDeoptimizationEnvironment()); | 2019 LEnvironment* env = instr->GetDeferredLazyDeoptimizationEnvironment(); |
| 2020 LEnvironment* env = instr->deoptimization_environment(); | |
| 2021 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); | 2020 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); |
| 2022 // Move result to a register that survives the end of the | 2021 // Move result to a register that survives the end of the |
| 2023 // PushSafepointRegisterScope. | 2022 // PushSafepointRegisterScope. |
| 2024 __ movq(kScratchRegister, rax); | 2023 __ movq(kScratchRegister, rax); |
| 2025 } | 2024 } |
| 2026 __ testq(kScratchRegister, kScratchRegister); | 2025 __ testq(kScratchRegister, kScratchRegister); |
| 2027 Label load_false; | 2026 Label load_false; |
| 2028 Label done; | 2027 Label done; |
| 2029 __ j(not_zero, &load_false); | 2028 __ j(not_zero, &load_false); |
| 2030 __ LoadRoot(rax, Heap::kTrueValueRootIndex); | 2029 __ LoadRoot(rax, Heap::kTrueValueRootIndex); |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2619 // length is a small non-negative integer, due to the test above. | 2618 // length is a small non-negative integer, due to the test above. |
| 2620 __ testl(length, length); | 2619 __ testl(length, length); |
| 2621 __ j(zero, &invoke, Label::kNear); | 2620 __ j(zero, &invoke, Label::kNear); |
| 2622 __ bind(&loop); | 2621 __ bind(&loop); |
| 2623 __ push(Operand(elements, length, times_pointer_size, 1 * kPointerSize)); | 2622 __ push(Operand(elements, length, times_pointer_size, 1 * kPointerSize)); |
| 2624 __ decl(length); | 2623 __ decl(length); |
| 2625 __ j(not_zero, &loop); | 2624 __ j(not_zero, &loop); |
| 2626 | 2625 |
| 2627 // Invoke the function. | 2626 // Invoke the function. |
| 2628 __ bind(&invoke); | 2627 __ bind(&invoke); |
| 2629 ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment()); | 2628 ASSERT(instr->HasPointerMap()); |
| 2630 LPointerMap* pointers = instr->pointer_map(); | 2629 LPointerMap* pointers = instr->pointer_map(); |
| 2631 RecordPosition(pointers->position()); | 2630 RecordPosition(pointers->position()); |
| 2632 SafepointGenerator safepoint_generator( | 2631 SafepointGenerator safepoint_generator( |
| 2633 this, pointers, Safepoint::kLazyDeopt); | 2632 this, pointers, Safepoint::kLazyDeopt); |
| 2634 ParameterCount actual(rax); | 2633 ParameterCount actual(rax); |
| 2635 __ InvokeFunction(function, actual, CALL_FUNCTION, | 2634 __ InvokeFunction(function, actual, CALL_FUNCTION, |
| 2636 safepoint_generator, CALL_AS_METHOD); | 2635 safepoint_generator, CALL_AS_METHOD); |
| 2637 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 2636 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| 2638 } | 2637 } |
| 2639 | 2638 |
| (...skipping 536 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3176 | 3175 |
| 3177 default: | 3176 default: |
| 3178 UNREACHABLE(); | 3177 UNREACHABLE(); |
| 3179 } | 3178 } |
| 3180 } | 3179 } |
| 3181 | 3180 |
| 3182 | 3181 |
| 3183 void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { | 3182 void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { |
| 3184 ASSERT(ToRegister(instr->function()).is(rdi)); | 3183 ASSERT(ToRegister(instr->function()).is(rdi)); |
| 3185 ASSERT(instr->HasPointerMap()); | 3184 ASSERT(instr->HasPointerMap()); |
| 3186 ASSERT(instr->HasDeoptimizationEnvironment()); | |
| 3187 LPointerMap* pointers = instr->pointer_map(); | 3185 LPointerMap* pointers = instr->pointer_map(); |
| 3188 RecordPosition(pointers->position()); | 3186 RecordPosition(pointers->position()); |
| 3189 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); | 3187 SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); |
| 3190 ParameterCount count(instr->arity()); | 3188 ParameterCount count(instr->arity()); |
| 3191 __ InvokeFunction(rdi, count, CALL_FUNCTION, generator, CALL_AS_METHOD); | 3189 __ InvokeFunction(rdi, count, CALL_FUNCTION, generator, CALL_AS_METHOD); |
| 3192 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); | 3190 __ movq(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| 3193 } | 3191 } |
| 3194 | 3192 |
| 3195 | 3193 |
| 3196 void LCodeGen::DoCallKeyed(LCallKeyed* instr) { | 3194 void LCodeGen::DoCallKeyed(LCallKeyed* instr) { |
| (...skipping 1401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4598 void LCodeGen::DoDeoptimize(LDeoptimize* instr) { | 4596 void LCodeGen::DoDeoptimize(LDeoptimize* instr) { |
| 4599 DeoptimizeIf(no_condition, instr->environment()); | 4597 DeoptimizeIf(no_condition, instr->environment()); |
| 4600 } | 4598 } |
| 4601 | 4599 |
| 4602 | 4600 |
| 4603 void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) { | 4601 void LCodeGen::DoDeleteProperty(LDeleteProperty* instr) { |
| 4604 LOperand* obj = instr->object(); | 4602 LOperand* obj = instr->object(); |
| 4605 LOperand* key = instr->key(); | 4603 LOperand* key = instr->key(); |
| 4606 EmitPushTaggedOperand(obj); | 4604 EmitPushTaggedOperand(obj); |
| 4607 EmitPushTaggedOperand(key); | 4605 EmitPushTaggedOperand(key); |
| 4608 ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment()); | 4606 ASSERT(instr->HasPointerMap()); |
| 4609 LPointerMap* pointers = instr->pointer_map(); | 4607 LPointerMap* pointers = instr->pointer_map(); |
| 4610 RecordPosition(pointers->position()); | 4608 RecordPosition(pointers->position()); |
| 4611 // Create safepoint generator that will also ensure enough space in the | 4609 // Create safepoint generator that will also ensure enough space in the |
| 4612 // reloc info for patching in deoptimization (since this is invoking a | 4610 // reloc info for patching in deoptimization (since this is invoking a |
| 4613 // builtin) | 4611 // builtin) |
| 4614 SafepointGenerator safepoint_generator( | 4612 SafepointGenerator safepoint_generator( |
| 4615 this, pointers, Safepoint::kLazyDeopt); | 4613 this, pointers, Safepoint::kLazyDeopt); |
| 4616 __ Push(Smi::FromInt(strict_mode_flag())); | 4614 __ Push(Smi::FromInt(strict_mode_flag())); |
| 4617 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, safepoint_generator); | 4615 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION, safepoint_generator); |
| 4618 } | 4616 } |
| 4619 | 4617 |
| 4620 | 4618 |
| 4621 void LCodeGen::DoIn(LIn* instr) { | 4619 void LCodeGen::DoIn(LIn* instr) { |
| 4622 LOperand* obj = instr->object(); | 4620 LOperand* obj = instr->object(); |
| 4623 LOperand* key = instr->key(); | 4621 LOperand* key = instr->key(); |
| 4624 EmitPushTaggedOperand(key); | 4622 EmitPushTaggedOperand(key); |
| 4625 EmitPushTaggedOperand(obj); | 4623 EmitPushTaggedOperand(obj); |
| 4626 ASSERT(instr->HasPointerMap() && instr->HasDeoptimizationEnvironment()); | 4624 ASSERT(instr->HasPointerMap()); |
| 4627 LPointerMap* pointers = instr->pointer_map(); | 4625 LPointerMap* pointers = instr->pointer_map(); |
| 4628 RecordPosition(pointers->position()); | 4626 RecordPosition(pointers->position()); |
| 4629 SafepointGenerator safepoint_generator( | 4627 SafepointGenerator safepoint_generator( |
| 4630 this, pointers, Safepoint::kLazyDeopt); | 4628 this, pointers, Safepoint::kLazyDeopt); |
| 4631 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator); | 4629 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator); |
| 4632 } | 4630 } |
| 4633 | 4631 |
| 4634 | 4632 |
| 4635 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { | 4633 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
| 4636 PushSafepointRegistersScope scope(this); | 4634 PushSafepointRegistersScope scope(this); |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4785 FixedArray::kHeaderSize - kPointerSize)); | 4783 FixedArray::kHeaderSize - kPointerSize)); |
| 4786 __ bind(&done); | 4784 __ bind(&done); |
| 4787 } | 4785 } |
| 4788 | 4786 |
| 4789 | 4787 |
| 4790 #undef __ | 4788 #undef __ |
| 4791 | 4789 |
| 4792 } } // namespace v8::internal | 4790 } } // namespace v8::internal |
| 4793 | 4791 |
| 4794 #endif // V8_TARGET_ARCH_X64 | 4792 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |