| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |