| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 2081 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2092 } | 2092 } |
| 2093 } | 2093 } |
| 2094 | 2094 |
| 2095 | 2095 |
| 2096 void LCodeGen::DoArithmeticT(LArithmeticT* instr) { | 2096 void LCodeGen::DoArithmeticT(LArithmeticT* instr) { |
| 2097 DCHECK(ToRegister(instr->context()).is(rsi)); | 2097 DCHECK(ToRegister(instr->context()).is(rsi)); |
| 2098 DCHECK(ToRegister(instr->left()).is(rdx)); | 2098 DCHECK(ToRegister(instr->left()).is(rdx)); |
| 2099 DCHECK(ToRegister(instr->right()).is(rax)); | 2099 DCHECK(ToRegister(instr->right()).is(rax)); |
| 2100 DCHECK(ToRegister(instr->result()).is(rax)); | 2100 DCHECK(ToRegister(instr->result()).is(rax)); |
| 2101 | 2101 |
| 2102 Handle<Code> code = CodeFactory::BinaryOpIC( | 2102 Handle<Code> code = |
| 2103 isolate(), instr->op(), instr->language_mode()).code(); | 2103 CodeFactory::BinaryOpIC(isolate(), instr->op(), instr->strength()).code(); |
| 2104 CallCode(code, RelocInfo::CODE_TARGET, instr); | 2104 CallCode(code, RelocInfo::CODE_TARGET, instr); |
| 2105 } | 2105 } |
| 2106 | 2106 |
| 2107 | 2107 |
| 2108 template<class InstrType> | 2108 template<class InstrType> |
| 2109 void LCodeGen::EmitBranch(InstrType instr, Condition cc) { | 2109 void LCodeGen::EmitBranch(InstrType instr, Condition cc) { |
| 2110 int left_block = instr->TrueDestination(chunk_); | 2110 int left_block = instr->TrueDestination(chunk_); |
| 2111 int right_block = instr->FalseDestination(chunk_); | 2111 int right_block = instr->FalseDestination(chunk_); |
| 2112 | 2112 |
| 2113 int next_block = GetNextEmittedBlock(); | 2113 int next_block = GetNextEmittedBlock(); |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2536 __ testb(FieldOperand(temp, Map::kBitFieldOffset), | 2536 __ testb(FieldOperand(temp, Map::kBitFieldOffset), |
| 2537 Immediate(1 << Map::kIsUndetectable)); | 2537 Immediate(1 << Map::kIsUndetectable)); |
| 2538 EmitBranch(instr, not_zero); | 2538 EmitBranch(instr, not_zero); |
| 2539 } | 2539 } |
| 2540 | 2540 |
| 2541 | 2541 |
| 2542 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { | 2542 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) { |
| 2543 DCHECK(ToRegister(instr->context()).is(rsi)); | 2543 DCHECK(ToRegister(instr->context()).is(rsi)); |
| 2544 Token::Value op = instr->op(); | 2544 Token::Value op = instr->op(); |
| 2545 | 2545 |
| 2546 Handle<Code> ic = CodeFactory::CompareIC(isolate(), op, SLOPPY).code(); | 2546 Handle<Code> ic = |
| 2547 CodeFactory::CompareIC(isolate(), op, Strength::WEAK).code(); |
| 2547 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2548 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2548 | 2549 |
| 2549 Condition condition = TokenToCondition(op, false); | 2550 Condition condition = TokenToCondition(op, false); |
| 2550 __ testp(rax, rax); | 2551 __ testp(rax, rax); |
| 2551 | 2552 |
| 2552 EmitBranch(instr, condition); | 2553 EmitBranch(instr, condition); |
| 2553 } | 2554 } |
| 2554 | 2555 |
| 2555 | 2556 |
| 2556 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) { | 2557 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) { |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2821 __ LoadRoot(rax, Heap::kFalseValueRootIndex); | 2822 __ LoadRoot(rax, Heap::kFalseValueRootIndex); |
| 2822 __ bind(&done); | 2823 __ bind(&done); |
| 2823 } | 2824 } |
| 2824 | 2825 |
| 2825 | 2826 |
| 2826 void LCodeGen::DoCmpT(LCmpT* instr) { | 2827 void LCodeGen::DoCmpT(LCmpT* instr) { |
| 2827 DCHECK(ToRegister(instr->context()).is(rsi)); | 2828 DCHECK(ToRegister(instr->context()).is(rsi)); |
| 2828 Token::Value op = instr->op(); | 2829 Token::Value op = instr->op(); |
| 2829 | 2830 |
| 2830 Handle<Code> ic = | 2831 Handle<Code> ic = |
| 2831 CodeFactory::CompareIC(isolate(), op, instr->language_mode()).code(); | 2832 CodeFactory::CompareIC(isolate(), op, instr->strength()).code(); |
| 2832 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2833 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 2833 | 2834 |
| 2834 Condition condition = TokenToCondition(op, false); | 2835 Condition condition = TokenToCondition(op, false); |
| 2835 Label true_value, done; | 2836 Label true_value, done; |
| 2836 __ testp(rax, rax); | 2837 __ testp(rax, rax); |
| 2837 __ j(condition, &true_value, Label::kNear); | 2838 __ j(condition, &true_value, Label::kNear); |
| 2838 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); | 2839 __ LoadRoot(ToRegister(instr->result()), Heap::kFalseValueRootIndex); |
| 2839 __ jmp(&done, Label::kNear); | 2840 __ jmp(&done, Label::kNear); |
| 2840 __ bind(&true_value); | 2841 __ bind(&true_value); |
| 2841 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); | 2842 __ LoadRoot(ToRegister(instr->result()), Heap::kTrueValueRootIndex); |
| (...skipping 3185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6027 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6028 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6028 } | 6029 } |
| 6029 | 6030 |
| 6030 | 6031 |
| 6031 #undef __ | 6032 #undef __ |
| 6032 | 6033 |
| 6033 } // namespace internal | 6034 } // namespace internal |
| 6034 } // namespace v8 | 6035 } // namespace v8 |
| 6035 | 6036 |
| 6036 #endif // V8_TARGET_ARCH_X64 | 6037 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |