OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 4959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4970 mode.Add(PRESERVE_SOURCE_REGISTER); | 4970 mode.Add(PRESERVE_SOURCE_REGISTER); |
4971 mode.Add(BAILOUT_ON_NO_OVERFLOW); | 4971 mode.Add(BAILOUT_ON_NO_OVERFLOW); |
4972 if (expr->op() == Token::INC) { | 4972 if (expr->op() == Token::INC) { |
4973 __ SmiAddConstant(rax, rax, Smi::FromInt(1), mode, &done, Label::kNear); | 4973 __ SmiAddConstant(rax, rax, Smi::FromInt(1), mode, &done, Label::kNear); |
4974 } else { | 4974 } else { |
4975 __ SmiSubConstant(rax, rax, Smi::FromInt(1), mode, &done, Label::kNear); | 4975 __ SmiSubConstant(rax, rax, Smi::FromInt(1), mode, &done, Label::kNear); |
4976 } | 4976 } |
4977 __ jmp(&stub_call, Label::kNear); | 4977 __ jmp(&stub_call, Label::kNear); |
4978 __ bind(&slow); | 4978 __ bind(&slow); |
4979 } | 4979 } |
4980 | 4980 if (!is_strong(language_mode())) { |
4981 ToNumberStub convert_stub(isolate()); | 4981 ToNumberStub convert_stub(isolate()); |
4982 __ CallStub(&convert_stub); | 4982 __ CallStub(&convert_stub); |
4983 PrepareForBailoutForId(expr->ToNumberId(), TOS_REG); | 4983 PrepareForBailoutForId(expr->ToNumberId(), TOS_REG); |
| 4984 } |
4984 | 4985 |
4985 // Save result for postfix expressions. | 4986 // Save result for postfix expressions. |
4986 if (expr->is_postfix()) { | 4987 if (expr->is_postfix()) { |
4987 if (!context()->IsEffect()) { | 4988 if (!context()->IsEffect()) { |
4988 // Save the result on the stack. If we have a named or keyed property | 4989 // Save the result on the stack. If we have a named or keyed property |
4989 // we store the result under the receiver that is currently on top | 4990 // we store the result under the receiver that is currently on top |
4990 // of the stack. | 4991 // of the stack. |
4991 switch (assign_type) { | 4992 switch (assign_type) { |
4992 case VARIABLE: | 4993 case VARIABLE: |
4993 __ Push(rax); | 4994 __ Push(rax); |
(...skipping 20 matching lines...) Expand all Loading... |
5014 // Call stub for +1/-1. | 5015 // Call stub for +1/-1. |
5015 __ bind(&stub_call); | 5016 __ bind(&stub_call); |
5016 __ movp(rdx, rax); | 5017 __ movp(rdx, rax); |
5017 __ Move(rax, Smi::FromInt(1)); | 5018 __ Move(rax, Smi::FromInt(1)); |
5018 Handle<Code> code = CodeFactory::BinaryOpIC(isolate(), expr->binary_op(), | 5019 Handle<Code> code = CodeFactory::BinaryOpIC(isolate(), expr->binary_op(), |
5019 strength(language_mode())).code(); | 5020 strength(language_mode())).code(); |
5020 CallIC(code, expr->CountBinOpFeedbackId()); | 5021 CallIC(code, expr->CountBinOpFeedbackId()); |
5021 patch_site.EmitPatchInfo(); | 5022 patch_site.EmitPatchInfo(); |
5022 __ bind(&done); | 5023 __ bind(&done); |
5023 | 5024 |
| 5025 if (is_strong(language_mode())) { |
| 5026 PrepareForBailoutForId(expr->ToNumberId(), TOS_REG); |
| 5027 } |
5024 // Store the value returned in rax. | 5028 // Store the value returned in rax. |
5025 switch (assign_type) { | 5029 switch (assign_type) { |
5026 case VARIABLE: | 5030 case VARIABLE: |
5027 if (expr->is_postfix()) { | 5031 if (expr->is_postfix()) { |
5028 // Perform the assignment as if via '='. | 5032 // Perform the assignment as if via '='. |
5029 { EffectContext context(this); | 5033 { EffectContext context(this); |
5030 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), | 5034 EmitVariableAssignment(expr->expression()->AsVariableProxy()->var(), |
5031 Token::ASSIGN, expr->CountSlot()); | 5035 Token::ASSIGN, expr->CountSlot()); |
5032 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 5036 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
5033 context.Plug(rax); | 5037 context.Plug(rax); |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5515 Assembler::target_address_at(call_target_address, | 5519 Assembler::target_address_at(call_target_address, |
5516 unoptimized_code)); | 5520 unoptimized_code)); |
5517 return OSR_AFTER_STACK_CHECK; | 5521 return OSR_AFTER_STACK_CHECK; |
5518 } | 5522 } |
5519 | 5523 |
5520 | 5524 |
5521 } // namespace internal | 5525 } // namespace internal |
5522 } // namespace v8 | 5526 } // namespace v8 |
5523 | 5527 |
5524 #endif // V8_TARGET_ARCH_X64 | 5528 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |