| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 3606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3617 const Register value = locs()->in(0).reg(); | 3617 const Register value = locs()->in(0).reg(); |
| 3618 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg()); | 3618 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg()); |
| 3619 | 3619 |
| 3620 if (value_cid == kDoubleCid) { | 3620 if (value_cid == kDoubleCid) { |
| 3621 __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag); | 3621 __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag); |
| 3622 } else if (value_cid == kSmiCid) { | 3622 } else if (value_cid == kSmiCid) { |
| 3623 __ SmiUntag(IP, value); | 3623 __ SmiUntag(IP, value); |
| 3624 __ vmovdr(DTMP, 0, IP); | 3624 __ vmovdr(DTMP, 0, IP); |
| 3625 __ vcvtdi(result, STMP); | 3625 __ vcvtdi(result, STMP); |
| 3626 } else { | 3626 } else { |
| 3627 Label* deopt = compiler->AddDeoptStub(deopt_id_, | 3627 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
| 3628 ICData::kDeoptBinaryDoubleOp); | 3628 ICData::kDeoptBinaryDoubleOp); |
| 3629 const Register temp = locs()->temp(0).reg(); | 3629 const Register temp = locs()->temp(0).reg(); |
| 3630 if (value_type->is_nullable() && | 3630 if (value_type->is_nullable() && |
| 3631 (value_type->ToNullableCid() == kDoubleCid)) { | 3631 (value_type->ToNullableCid() == kDoubleCid)) { |
| 3632 __ CompareImmediate(value, reinterpret_cast<intptr_t>(Object::null())); | 3632 __ CompareImmediate(value, reinterpret_cast<intptr_t>(Object::null())); |
| 3633 __ b(deopt, EQ); | 3633 __ b(deopt, EQ); |
| 3634 // It must be double now. | 3634 // It must be double now. |
| 3635 __ LoadDFromOffset(result, value, | 3635 __ LoadDFromOffset(result, value, |
| 3636 Double::value_offset() - kHeapObjectTag); | 3636 Double::value_offset() - kHeapObjectTag); |
| 3637 } else { | 3637 } else { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3701 } | 3701 } |
| 3702 | 3702 |
| 3703 | 3703 |
| 3704 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3704 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3705 const intptr_t value_cid = value()->Type()->ToCid(); | 3705 const intptr_t value_cid = value()->Type()->ToCid(); |
| 3706 const Register value = locs()->in(0).reg(); | 3706 const Register value = locs()->in(0).reg(); |
| 3707 const QRegister result = locs()->out(0).fpu_reg(); | 3707 const QRegister result = locs()->out(0).fpu_reg(); |
| 3708 | 3708 |
| 3709 if (value_cid != kFloat32x4Cid) { | 3709 if (value_cid != kFloat32x4Cid) { |
| 3710 const Register temp = locs()->temp(0).reg(); | 3710 const Register temp = locs()->temp(0).reg(); |
| 3711 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3711 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass); |
| 3712 __ tst(value, Operand(kSmiTagMask)); | 3712 __ tst(value, Operand(kSmiTagMask)); |
| 3713 __ b(deopt, EQ); | 3713 __ b(deopt, EQ); |
| 3714 __ CompareClassId(value, kFloat32x4Cid, temp); | 3714 __ CompareClassId(value, kFloat32x4Cid, temp); |
| 3715 __ b(deopt, NE); | 3715 __ b(deopt, NE); |
| 3716 } | 3716 } |
| 3717 | 3717 |
| 3718 const DRegister dresult0 = EvenDRegisterOf(result); | 3718 const DRegister dresult0 = EvenDRegisterOf(result); |
| 3719 __ LoadMultipleDFromOffset(dresult0, 2, value, | 3719 __ LoadMultipleDFromOffset(dresult0, 2, value, |
| 3720 Float32x4::value_offset() - kHeapObjectTag); | 3720 Float32x4::value_offset() - kHeapObjectTag); |
| 3721 } | 3721 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3769 } | 3769 } |
| 3770 | 3770 |
| 3771 | 3771 |
| 3772 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3772 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3773 const intptr_t value_cid = value()->Type()->ToCid(); | 3773 const intptr_t value_cid = value()->Type()->ToCid(); |
| 3774 const Register value = locs()->in(0).reg(); | 3774 const Register value = locs()->in(0).reg(); |
| 3775 const QRegister result = locs()->out(0).fpu_reg(); | 3775 const QRegister result = locs()->out(0).fpu_reg(); |
| 3776 | 3776 |
| 3777 if (value_cid != kFloat64x2Cid) { | 3777 if (value_cid != kFloat64x2Cid) { |
| 3778 const Register temp = locs()->temp(0).reg(); | 3778 const Register temp = locs()->temp(0).reg(); |
| 3779 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3779 Label* deopt = compiler->AddDeoptStub(GetDeoptId(), |
| 3780 ICData::kDeoptCheckClass); |
| 3780 __ tst(value, Operand(kSmiTagMask)); | 3781 __ tst(value, Operand(kSmiTagMask)); |
| 3781 __ b(deopt, EQ); | 3782 __ b(deopt, EQ); |
| 3782 __ CompareClassId(value, kFloat64x2Cid, temp); | 3783 __ CompareClassId(value, kFloat64x2Cid, temp); |
| 3783 __ b(deopt, NE); | 3784 __ b(deopt, NE); |
| 3784 } | 3785 } |
| 3785 | 3786 |
| 3786 const DRegister dresult0 = EvenDRegisterOf(result); | 3787 const DRegister dresult0 = EvenDRegisterOf(result); |
| 3787 __ LoadMultipleDFromOffset(dresult0, 2, value, | 3788 __ LoadMultipleDFromOffset(dresult0, 2, value, |
| 3788 Float64x2::value_offset() - kHeapObjectTag); | 3789 Float64x2::value_offset() - kHeapObjectTag); |
| 3789 } | 3790 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3837 } | 3838 } |
| 3838 | 3839 |
| 3839 | 3840 |
| 3840 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3841 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3841 const intptr_t value_cid = value()->Type()->ToCid(); | 3842 const intptr_t value_cid = value()->Type()->ToCid(); |
| 3842 const Register value = locs()->in(0).reg(); | 3843 const Register value = locs()->in(0).reg(); |
| 3843 const QRegister result = locs()->out(0).fpu_reg(); | 3844 const QRegister result = locs()->out(0).fpu_reg(); |
| 3844 | 3845 |
| 3845 if (value_cid != kInt32x4Cid) { | 3846 if (value_cid != kInt32x4Cid) { |
| 3846 const Register temp = locs()->temp(0).reg(); | 3847 const Register temp = locs()->temp(0).reg(); |
| 3847 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3848 Label* deopt = compiler->AddDeoptStub(GetDeoptId(), |
| 3849 ICData::kDeoptCheckClass); |
| 3848 __ tst(value, Operand(kSmiTagMask)); | 3850 __ tst(value, Operand(kSmiTagMask)); |
| 3849 __ b(deopt, EQ); | 3851 __ b(deopt, EQ); |
| 3850 __ CompareClassId(value, kInt32x4Cid, temp); | 3852 __ CompareClassId(value, kInt32x4Cid, temp); |
| 3851 __ b(deopt, NE); | 3853 __ b(deopt, NE); |
| 3852 } | 3854 } |
| 3853 | 3855 |
| 3854 const DRegister dresult0 = EvenDRegisterOf(result); | 3856 const DRegister dresult0 = EvenDRegisterOf(result); |
| 3855 __ LoadMultipleDFromOffset(dresult0, 2, value, | 3857 __ LoadMultipleDFromOffset(dresult0, 2, value, |
| 3856 Int32x4::value_offset() - kHeapObjectTag); | 3858 Int32x4::value_offset() - kHeapObjectTag); |
| 3857 } | 3859 } |
| (...skipping 2174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6032 value, | 6034 value, |
| 6033 Mint::value_offset() - kHeapObjectTag + kWordSize); | 6035 Mint::value_offset() - kHeapObjectTag + kWordSize); |
| 6034 } else if (value_cid == kSmiCid) { | 6036 } else if (value_cid == kSmiCid) { |
| 6035 // Load Smi into result_lo. | 6037 // Load Smi into result_lo. |
| 6036 __ mov(result_lo, Operand(value)); | 6038 __ mov(result_lo, Operand(value)); |
| 6037 // Untag. | 6039 // Untag. |
| 6038 __ SmiUntag(result_lo); | 6040 __ SmiUntag(result_lo); |
| 6039 __ SignFill(result_hi, result_lo); | 6041 __ SignFill(result_hi, result_lo); |
| 6040 } else { | 6042 } else { |
| 6041 const Register temp = locs()->temp(0).reg(); | 6043 const Register temp = locs()->temp(0).reg(); |
| 6042 Label* deopt = compiler->AddDeoptStub(deopt_id_, | 6044 Label* deopt = compiler->AddDeoptStub(GetDeoptId(), |
| 6043 ICData::kDeoptUnboxInteger); | 6045 ICData::kDeoptUnboxInteger); |
| 6044 Label is_smi, done; | 6046 Label is_smi, done; |
| 6045 __ tst(value, Operand(kSmiTagMask)); | 6047 __ tst(value, Operand(kSmiTagMask)); |
| 6046 __ b(&is_smi, EQ); | 6048 __ b(&is_smi, EQ); |
| 6047 __ CompareClassId(value, kMintCid, temp); | 6049 __ CompareClassId(value, kMintCid, temp); |
| 6048 __ b(deopt, NE); | 6050 __ b(deopt, NE); |
| 6049 | 6051 |
| 6050 // It's a Mint. | 6052 // It's a Mint. |
| 6051 // Load low word. | 6053 // Load low word. |
| 6052 __ LoadFromOffset(kWord, | 6054 __ LoadFromOffset(kWord, |
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6701 return summary; | 6703 return summary; |
| 6702 } | 6704 } |
| 6703 | 6705 |
| 6704 | 6706 |
| 6705 void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6707 void UnboxIntNInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 6706 const intptr_t value_cid = value()->Type()->ToCid(); | 6708 const intptr_t value_cid = value()->Type()->ToCid(); |
| 6707 const Register value = locs()->in(0).reg(); | 6709 const Register value = locs()->in(0).reg(); |
| 6708 const Register out = locs()->out(0).reg(); | 6710 const Register out = locs()->out(0).reg(); |
| 6709 const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister; | 6711 const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister; |
| 6710 Label* deopt = CanDeoptimize() ? | 6712 Label* deopt = CanDeoptimize() ? |
| 6711 compiler->AddDeoptStub(deopt_id_, ICData::kDeoptUnboxInteger) : NULL; | 6713 compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger) : NULL; |
| 6712 Label* out_of_range = !is_truncating() ? deopt : NULL; | 6714 Label* out_of_range = !is_truncating() ? deopt : NULL; |
| 6713 ASSERT(value != out); | 6715 ASSERT(value != out); |
| 6714 | 6716 |
| 6715 if (value_cid == kSmiCid) { | 6717 if (value_cid == kSmiCid) { |
| 6716 __ SmiUntag(out, value); | 6718 __ SmiUntag(out, value); |
| 6717 } else if (value_cid == kMintCid) { | 6719 } else if (value_cid == kMintCid) { |
| 6718 LoadInt32FromMint(compiler, value, out, temp, out_of_range); | 6720 LoadInt32FromMint(compiler, value, out, temp, out_of_range); |
| 6719 } else { | 6721 } else { |
| 6720 Label done; | 6722 Label done; |
| 6721 __ SmiUntag(out, value, &done); | 6723 __ SmiUntag(out, value, &done); |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7010 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); | 7012 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); |
| 7011 #if defined(DEBUG) | 7013 #if defined(DEBUG) |
| 7012 __ LoadImmediate(R4, kInvalidObjectPointer); | 7014 __ LoadImmediate(R4, kInvalidObjectPointer); |
| 7013 __ LoadImmediate(R5, kInvalidObjectPointer); | 7015 __ LoadImmediate(R5, kInvalidObjectPointer); |
| 7014 #endif | 7016 #endif |
| 7015 } | 7017 } |
| 7016 | 7018 |
| 7017 } // namespace dart | 7019 } // namespace dart |
| 7018 | 7020 |
| 7019 #endif // defined TARGET_ARCH_ARM | 7021 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |