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

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

Issue 593363003: Expands the use of Immediate and Operand wrappers. (Closed) Base URL: http://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_arm.cc ('k') | runtime/vm/intermediate_language_mips.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) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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_ARM64. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64.
6 #if defined(TARGET_ARCH_ARM64) 6 #if defined(TARGET_ARCH_ARM64)
7 7
8 #include "vm/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 const Register val_reg = locs()->in(0).reg(); 635 const Register val_reg = locs()->in(0).reg();
636 const Register cid_reg = locs()->temp(0).reg(); 636 const Register cid_reg = locs()->temp(0).reg();
637 637
638 Label* deopt = CanDeoptimize() ? 638 Label* deopt = CanDeoptimize() ?
639 compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL; 639 compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids) : NULL;
640 640
641 const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0; 641 const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
642 const ZoneGrowableArray<intptr_t>& data = cid_results(); 642 const ZoneGrowableArray<intptr_t>& data = cid_results();
643 ASSERT(data[0] == kSmiCid); 643 ASSERT(data[0] == kSmiCid);
644 bool result = data[1] == true_result; 644 bool result = data[1] == true_result;
645 __ tsti(val_reg, kSmiTagMask); 645 __ tsti(val_reg, Immediate(kSmiTagMask));
646 __ b(result ? labels.true_label : labels.false_label, EQ); 646 __ b(result ? labels.true_label : labels.false_label, EQ);
647 __ LoadClassId(cid_reg, val_reg, PP); 647 __ LoadClassId(cid_reg, val_reg, PP);
648 648
649 for (intptr_t i = 2; i < data.length(); i += 2) { 649 for (intptr_t i = 2; i < data.length(); i += 2) {
650 const intptr_t test_cid = data[i]; 650 const intptr_t test_cid = data[i];
651 ASSERT(test_cid != kSmiCid); 651 ASSERT(test_cid != kSmiCid);
652 result = data[i + 1] == true_result; 652 result = data[i + 1] == true_result;
653 __ CompareImmediate(cid_reg, test_cid, PP); 653 __ CompareImmediate(cid_reg, test_cid, PP);
654 __ b(result ? labels.true_label : labels.false_label, EQ); 654 __ b(result ? labels.true_label : labels.false_label, EQ);
655 } 655 }
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 LocationSummary::kNoCall); 930 LocationSummary::kNoCall);
931 } 931 }
932 932
933 933
934 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 934 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
935 const Register object = locs()->in(0).reg(); 935 const Register object = locs()->in(0).reg();
936 const Register result = locs()->out(0).reg(); 936 const Register result = locs()->out(0).reg();
937 static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos; 937 static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
938 938
939 __ LoadImmediate(TMP, reinterpret_cast<int64_t>(&kSmiCidSource) + 1, PP); 939 __ LoadImmediate(TMP, reinterpret_cast<int64_t>(&kSmiCidSource) + 1, PP);
940 __ tsti(object, kSmiTagMask); 940 __ tsti(object, Immediate(kSmiTagMask));
941 __ csel(TMP, TMP, object, EQ); 941 __ csel(TMP, TMP, object, EQ);
942 __ LoadClassId(result, TMP, PP); 942 __ LoadClassId(result, TMP, PP);
943 __ SmiTag(result); 943 __ SmiTag(result);
944 } 944 }
945 945
946 946
947 CompileType LoadIndexedInstr::ComputeType() const { 947 CompileType LoadIndexedInstr::ComputeType() const {
948 switch (class_id_) { 948 switch (class_id_) {
949 case kArrayCid: 949 case kArrayCid:
950 case kImmutableArrayCid: 950 case kImmutableArrayCid:
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 1320
1321 1321
1322 static void LoadValueCid(FlowGraphCompiler* compiler, 1322 static void LoadValueCid(FlowGraphCompiler* compiler,
1323 Register value_cid_reg, 1323 Register value_cid_reg,
1324 Register value_reg, 1324 Register value_reg,
1325 Label* value_is_smi = NULL) { 1325 Label* value_is_smi = NULL) {
1326 Label done; 1326 Label done;
1327 if (value_is_smi == NULL) { 1327 if (value_is_smi == NULL) {
1328 __ LoadImmediate(value_cid_reg, kSmiCid, PP); 1328 __ LoadImmediate(value_cid_reg, kSmiCid, PP);
1329 } 1329 }
1330 __ tsti(value_reg, kSmiTagMask); 1330 __ tsti(value_reg, Immediate(kSmiTagMask));
1331 if (value_is_smi == NULL) { 1331 if (value_is_smi == NULL) {
1332 __ b(&done, EQ); 1332 __ b(&done, EQ);
1333 } else { 1333 } else {
1334 __ b(value_is_smi, EQ); 1334 __ b(value_is_smi, EQ);
1335 } 1335 }
1336 __ LoadClassId(value_cid_reg, value_reg, PP); 1336 __ LoadClassId(value_cid_reg, value_reg, PP);
1337 __ Bind(&done); 1337 __ Bind(&done);
1338 } 1338 }
1339 1339
1340 1340
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1474 __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2); 1474 __ CallRuntime(kUpdateFieldCidRuntimeEntry, 2);
1475 __ Drop(2); // Drop the field and the value. 1475 __ Drop(2); // Drop the field and the value.
1476 } 1476 }
1477 } else { 1477 } else {
1478 ASSERT(compiler->is_optimizing()); 1478 ASSERT(compiler->is_optimizing());
1479 ASSERT(deopt != NULL); 1479 ASSERT(deopt != NULL);
1480 1480
1481 // Field guard class has been initialized and is known. 1481 // Field guard class has been initialized and is known.
1482 if (value_cid == kDynamicCid) { 1482 if (value_cid == kDynamicCid) {
1483 // Value's class id is not known. 1483 // Value's class id is not known.
1484 __ tsti(value_reg, kSmiTagMask); 1484 __ tsti(value_reg, Immediate(kSmiTagMask));
1485 1485
1486 if (field_cid != kSmiCid) { 1486 if (field_cid != kSmiCid) {
1487 __ b(fail, EQ); 1487 __ b(fail, EQ);
1488 __ LoadClassId(value_cid_reg, value_reg, PP); 1488 __ LoadClassId(value_cid_reg, value_reg, PP);
1489 __ CompareImmediate(value_cid_reg, field_cid, PP); 1489 __ CompareImmediate(value_cid_reg, field_cid, PP);
1490 } 1490 }
1491 1491
1492 if (field().is_nullable() && (field_cid != kNullCid)) { 1492 if (field().is_nullable() && (field_cid != kNullCid)) {
1493 __ b(&ok, EQ); 1493 __ b(&ok, EQ);
1494 __ CompareObject(value_reg, Object::null_object(), PP); 1494 __ CompareObject(value_reg, Object::null_object(), PP);
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
1784 1784
1785 __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP); 1785 __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
1786 1786
1787 __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), PP, kWord); 1787 __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), PP, kWord);
1788 __ CompareImmediate(temp2, kNullCid, PP); 1788 __ CompareImmediate(temp2, kNullCid, PP);
1789 __ b(&store_pointer, EQ); 1789 __ b(&store_pointer, EQ);
1790 1790
1791 __ LoadFromOffset( 1791 __ LoadFromOffset(
1792 temp2, temp, Field::kind_bits_offset() - kHeapObjectTag, 1792 temp2, temp, Field::kind_bits_offset() - kHeapObjectTag,
1793 PP, kUnsignedByte); 1793 PP, kUnsignedByte);
1794 __ tsti(temp2, 1 << Field::kUnboxingCandidateBit); 1794 __ tsti(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
1795 __ b(&store_pointer, EQ); 1795 __ b(&store_pointer, EQ);
1796 1796
1797 __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord); 1797 __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
1798 __ CompareImmediate(temp2, kDoubleCid, PP); 1798 __ CompareImmediate(temp2, kDoubleCid, PP);
1799 __ b(&store_double, EQ); 1799 __ b(&store_double, EQ);
1800 1800
1801 __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord); 1801 __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
1802 __ CompareImmediate(temp2, kFloat32x4Cid, PP); 1802 __ CompareImmediate(temp2, kFloat32x4Cid, PP);
1803 __ b(&store_float32x4, EQ); 1803 __ b(&store_float32x4, EQ);
1804 1804
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
2941 2941
2942 2942
2943 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2943 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2944 Label* deopt = compiler->AddDeoptStub(deopt_id(), 2944 Label* deopt = compiler->AddDeoptStub(deopt_id(),
2945 ICData::kDeoptBinaryDoubleOp); 2945 ICData::kDeoptBinaryDoubleOp);
2946 intptr_t left_cid = left()->Type()->ToCid(); 2946 intptr_t left_cid = left()->Type()->ToCid();
2947 intptr_t right_cid = right()->Type()->ToCid(); 2947 intptr_t right_cid = right()->Type()->ToCid();
2948 const Register left = locs()->in(0).reg(); 2948 const Register left = locs()->in(0).reg();
2949 const Register right = locs()->in(1).reg(); 2949 const Register right = locs()->in(1).reg();
2950 if (left_cid == kSmiCid) { 2950 if (left_cid == kSmiCid) {
2951 __ tsti(right, kSmiTagMask); 2951 __ tsti(right, Immediate(kSmiTagMask));
2952 } else if (right_cid == kSmiCid) { 2952 } else if (right_cid == kSmiCid) {
2953 __ tsti(left, kSmiTagMask); 2953 __ tsti(left, Immediate(kSmiTagMask));
2954 } else { 2954 } else {
2955 __ orr(TMP, left, Operand(right)); 2955 __ orr(TMP, left, Operand(right));
2956 __ tsti(TMP, kSmiTagMask); 2956 __ tsti(TMP, Immediate(kSmiTagMask));
2957 } 2957 }
2958 __ b(deopt, EQ); 2958 __ b(deopt, EQ);
2959 } 2959 }
2960 2960
2961 2961
2962 LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate, 2962 LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
2963 bool opt) const { 2963 bool opt) const {
2964 const intptr_t kNumInputs = 1; 2964 const intptr_t kNumInputs = 1;
2965 const intptr_t kNumTemps = 1; 2965 const intptr_t kNumTemps = 1;
2966 LocationSummary* summary = new(isolate) LocationSummary( 2966 LocationSummary* summary = new(isolate) LocationSummary(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3010 Label* deopt = compiler->AddDeoptStub(deopt_id_, 3010 Label* deopt = compiler->AddDeoptStub(deopt_id_,
3011 ICData::kDeoptBinaryDoubleOp); 3011 ICData::kDeoptBinaryDoubleOp);
3012 if (value_type->is_nullable() && 3012 if (value_type->is_nullable() &&
3013 (value_type->ToNullableCid() == kDoubleCid)) { 3013 (value_type->ToNullableCid() == kDoubleCid)) {
3014 __ CompareObject(value, Object::null_object(), PP); 3014 __ CompareObject(value, Object::null_object(), PP);
3015 __ b(deopt, EQ); 3015 __ b(deopt, EQ);
3016 // It must be double now. 3016 // It must be double now.
3017 __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP); 3017 __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
3018 } else { 3018 } else {
3019 Label is_smi, done; 3019 Label is_smi, done;
3020 __ tsti(value, kSmiTagMask); 3020 __ tsti(value, Immediate(kSmiTagMask));
3021 __ b(&is_smi, EQ); 3021 __ b(&is_smi, EQ);
3022 __ CompareClassId(value, kDoubleCid, PP); 3022 __ CompareClassId(value, kDoubleCid, PP);
3023 __ b(deopt, NE); 3023 __ b(deopt, NE);
3024 __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP); 3024 __ LoadDFieldFromOffset(result, value, Double::value_offset(), PP);
3025 __ b(&done); 3025 __ b(&done);
3026 __ Bind(&is_smi); 3026 __ Bind(&is_smi);
3027 __ SmiUntag(TMP, value); // Copy and untag. 3027 __ SmiUntag(TMP, value); // Copy and untag.
3028 __ scvtfd(result, TMP); 3028 __ scvtfd(result, TMP);
3029 __ Bind(&done); 3029 __ Bind(&done);
3030 } 3030 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3068 } 3068 }
3069 3069
3070 3070
3071 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3071 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3072 const intptr_t value_cid = value()->Type()->ToCid(); 3072 const intptr_t value_cid = value()->Type()->ToCid();
3073 const Register value = locs()->in(0).reg(); 3073 const Register value = locs()->in(0).reg();
3074 const VRegister result = locs()->out(0).fpu_reg(); 3074 const VRegister result = locs()->out(0).fpu_reg();
3075 3075
3076 if (value_cid != kFloat32x4Cid) { 3076 if (value_cid != kFloat32x4Cid) {
3077 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); 3077 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
3078 __ tsti(value, kSmiTagMask); 3078 __ tsti(value, Immediate(kSmiTagMask));
3079 __ b(deopt, EQ); 3079 __ b(deopt, EQ);
3080 __ CompareClassId(value, kFloat32x4Cid, PP); 3080 __ CompareClassId(value, kFloat32x4Cid, PP);
3081 __ b(deopt, NE); 3081 __ b(deopt, NE);
3082 } 3082 }
3083 3083
3084 __ LoadQFieldFromOffset(result, value, Float32x4::value_offset(), PP); 3084 __ LoadQFieldFromOffset(result, value, Float32x4::value_offset(), PP);
3085 } 3085 }
3086 3086
3087 3087
3088 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate, 3088 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3121 } 3121 }
3122 3122
3123 3123
3124 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3124 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3125 const intptr_t value_cid = value()->Type()->ToCid(); 3125 const intptr_t value_cid = value()->Type()->ToCid();
3126 const Register value = locs()->in(0).reg(); 3126 const Register value = locs()->in(0).reg();
3127 const VRegister result = locs()->out(0).fpu_reg(); 3127 const VRegister result = locs()->out(0).fpu_reg();
3128 3128
3129 if (value_cid != kFloat64x2Cid) { 3129 if (value_cid != kFloat64x2Cid) {
3130 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); 3130 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
3131 __ tsti(value, kSmiTagMask); 3131 __ tsti(value, Immediate(kSmiTagMask));
3132 __ b(deopt, EQ); 3132 __ b(deopt, EQ);
3133 __ CompareClassId(value, kFloat64x2Cid, PP); 3133 __ CompareClassId(value, kFloat64x2Cid, PP);
3134 __ b(deopt, NE); 3134 __ b(deopt, NE);
3135 } 3135 }
3136 3136
3137 __ LoadQFieldFromOffset(result, value, Float64x2::value_offset(), PP); 3137 __ LoadQFieldFromOffset(result, value, Float64x2::value_offset(), PP);
3138 } 3138 }
3139 3139
3140 3140
3141 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate, 3141 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3173 } 3173 }
3174 3174
3175 3175
3176 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3176 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3177 const intptr_t value_cid = value()->Type()->ToCid(); 3177 const intptr_t value_cid = value()->Type()->ToCid();
3178 const Register value = locs()->in(0).reg(); 3178 const Register value = locs()->in(0).reg();
3179 const VRegister result = locs()->out(0).fpu_reg(); 3179 const VRegister result = locs()->out(0).fpu_reg();
3180 3180
3181 if (value_cid != kInt32x4Cid) { 3181 if (value_cid != kInt32x4Cid) {
3182 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); 3182 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
3183 __ tsti(value, kSmiTagMask); 3183 __ tsti(value, Immediate(kSmiTagMask));
3184 __ b(deopt, EQ); 3184 __ b(deopt, EQ);
3185 __ CompareClassId(value, kInt32x4Cid, PP); 3185 __ CompareClassId(value, kInt32x4Cid, PP);
3186 __ b(deopt, NE); 3186 __ b(deopt, NE);
3187 } 3187 }
3188 3188
3189 __ LoadQFieldFromOffset(result, value, Int32x4::value_offset(), PP); 3189 __ LoadQFieldFromOffset(result, value, Int32x4::value_offset(), PP);
3190 } 3190 }
3191 3191
3192 3192
3193 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, 3193 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
(...skipping 1159 matching lines...) Expand 10 before | Expand all | Expand 10 after
4353 __ subs(result, ZR, Operand(value)); 4353 __ subs(result, ZR, Operand(value));
4354 __ b(deopt, VS); 4354 __ b(deopt, VS);
4355 if (FLAG_throw_on_javascript_int_overflow) { 4355 if (FLAG_throw_on_javascript_int_overflow) {
4356 EmitJavascriptOverflowCheck(compiler, range(), deopt, value); 4356 EmitJavascriptOverflowCheck(compiler, range(), deopt, value);
4357 } 4357 }
4358 break; 4358 break;
4359 } 4359 }
4360 case Token::kBIT_NOT: 4360 case Token::kBIT_NOT:
4361 __ mvn(result, value); 4361 __ mvn(result, value);
4362 // Remove inverted smi-tag. 4362 // Remove inverted smi-tag.
4363 __ andi(result, result, ~kSmiTagMask); 4363 __ andi(result, result, Immediate(~kSmiTagMask));
4364 break; 4364 break;
4365 default: 4365 default:
4366 UNREACHABLE(); 4366 UNREACHABLE();
4367 } 4367 }
4368 } 4368 }
4369 4369
4370 4370
4371 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, 4371 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
4372 bool opt) const { 4372 bool opt) const {
4373 const intptr_t kNumInputs = 1; 4373 const intptr_t kNumInputs = 1;
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
4916 } 4916 }
4917 4917
4918 ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) || 4918 ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) ||
4919 (unary_checks().NumberOfChecks() > 1)); 4919 (unary_checks().NumberOfChecks() > 1));
4920 const Register value = locs()->in(0).reg(); 4920 const Register value = locs()->in(0).reg();
4921 const Register temp = locs()->temp(0).reg(); 4921 const Register temp = locs()->temp(0).reg();
4922 Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason); 4922 Label* deopt = compiler->AddDeoptStub(deopt_id(), deopt_reason);
4923 Label is_ok; 4923 Label is_ok;
4924 intptr_t cix = 0; 4924 intptr_t cix = 0;
4925 if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) { 4925 if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) {
4926 __ tsti(value, kSmiTagMask); 4926 __ tsti(value, Immediate(kSmiTagMask));
4927 __ b(&is_ok, EQ); 4927 __ b(&is_ok, EQ);
4928 cix++; // Skip first check. 4928 cix++; // Skip first check.
4929 } else { 4929 } else {
4930 __ tsti(value, kSmiTagMask); 4930 __ tsti(value, Immediate(kSmiTagMask));
4931 __ b(deopt, EQ); 4931 __ b(deopt, EQ);
4932 } 4932 }
4933 __ LoadClassId(temp, value, PP); 4933 __ LoadClassId(temp, value, PP);
4934 4934
4935 if (IsDenseSwitch()) { 4935 if (IsDenseSwitch()) {
4936 ASSERT(cids_[0] < cids_[cids_.length() - 1]); 4936 ASSERT(cids_[0] < cids_[cids_.length() - 1]);
4937 __ AddImmediate(temp, temp, -cids_[0], PP); 4937 __ AddImmediate(temp, temp, -cids_[0], PP);
4938 __ CompareImmediate(temp, cids_[cids_.length() - 1] - cids_[0], PP); 4938 __ CompareImmediate(temp, cids_[cids_.length() - 1] - cids_[0], PP);
4939 __ b(deopt, HI); 4939 __ b(deopt, HI);
4940 4940
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
4991 LocationSummary* summary = new(isolate) LocationSummary( 4991 LocationSummary* summary = new(isolate) LocationSummary(
4992 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4992 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4993 summary->set_in(0, Location::RequiresRegister()); 4993 summary->set_in(0, Location::RequiresRegister());
4994 return summary; 4994 return summary;
4995 } 4995 }
4996 4996
4997 4997
4998 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4998 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4999 const Register value = locs()->in(0).reg(); 4999 const Register value = locs()->in(0).reg();
5000 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi); 5000 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
5001 __ tsti(value, kSmiTagMask); 5001 __ tsti(value, Immediate(kSmiTagMask));
5002 __ b(deopt, NE); 5002 __ b(deopt, NE);
5003 } 5003 }
5004 5004
5005 5005
5006 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate, 5006 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
5007 bool opt) const { 5007 bool opt) const {
5008 const intptr_t kNumInputs = 2; 5008 const intptr_t kNumInputs = 2;
5009 const intptr_t kNumTemps = 0; 5009 const intptr_t kNumTemps = 0;
5010 LocationSummary* locs = new(isolate) LocationSummary( 5010 LocationSummary* locs = new(isolate) LocationSummary(
5011 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5011 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
5481 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); 5481 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
5482 #if defined(DEBUG) 5482 #if defined(DEBUG)
5483 __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP); 5483 __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP);
5484 __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP); 5484 __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP);
5485 #endif 5485 #endif
5486 } 5486 }
5487 5487
5488 } // namespace dart 5488 } // namespace dart
5489 5489
5490 #endif // defined TARGET_ARCH_ARM64 5490 #endif // defined TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language_arm.cc ('k') | runtime/vm/intermediate_language_mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698