Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(569)

Side by Side Diff: runtime/vm/intermediate_language_arm.cc

Issue 676743002: IR cleanup: pass deopt id as constructor argument instead of doing deopt_id_ assignment. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/intermediate_language_arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language.cc ('k') | runtime/vm/intermediate_language_arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698