| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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_DBC. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_DBC. |
| 6 #if defined(TARGET_ARCH_DBC) | 6 #if defined(TARGET_ARCH_DBC) |
| 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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 FOR_EACH_UNREACHABLE_INSTRUCTION(DEFINE_UNREACHABLE) | 179 FOR_EACH_UNREACHABLE_INSTRUCTION(DEFINE_UNREACHABLE) |
| 180 | 180 |
| 181 #undef DEFINE_UNREACHABLE | 181 #undef DEFINE_UNREACHABLE |
| 182 | 182 |
| 183 | 183 |
| 184 // Only used in AOT compilation. | 184 // Only used in AOT compilation. |
| 185 DEFINE_UNIMPLEMENTED_EMIT_BRANCH_CODE(CheckedSmiComparison) | 185 DEFINE_UNIMPLEMENTED_EMIT_BRANCH_CODE(CheckedSmiComparison) |
| 186 | 186 |
| 187 | 187 |
| 188 EMIT_NATIVE_CODE(InstanceOf, | 188 EMIT_NATIVE_CODE(InstanceOf, |
| 189 2, | 189 3, |
| 190 Location::SameAsFirstInput(), | 190 Location::SameAsFirstInput(), |
| 191 LocationSummary::kCall) { | 191 LocationSummary::kCall) { |
| 192 SubtypeTestCache& test_cache = SubtypeTestCache::Handle(); | 192 SubtypeTestCache& test_cache = SubtypeTestCache::Handle(); |
| 193 if (!type().IsVoidType() && type().IsInstantiated()) { | 193 if (!type().IsVoidType() && type().IsInstantiated()) { |
| 194 test_cache = SubtypeTestCache::New(); | 194 test_cache = SubtypeTestCache::New(); |
| 195 } | 195 } |
| 196 | 196 |
| 197 if (compiler->is_optimizing()) { | 197 if (compiler->is_optimizing()) { |
| 198 __ Push(locs()->in(0).reg()); // Value. | 198 __ Push(locs()->in(0).reg()); // Value. |
| 199 __ Push(locs()->in(1).reg()); // Instantiator type arguments. | 199 __ Push(locs()->in(1).reg()); // Instantiator type arguments. |
| 200 __ Push(locs()->in(2).reg()); // Function type arguments. |
| 200 } | 201 } |
| 201 | 202 |
| 202 __ PushConstant(type()); | 203 __ PushConstant(type()); |
| 203 __ PushConstant(test_cache); | 204 __ PushConstant(test_cache); |
| 204 __ InstanceOf(); | 205 __ InstanceOf(); |
| 205 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), | 206 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), |
| 206 token_pos()); | 207 token_pos()); |
| 207 compiler->RecordAfterCall(this, FlowGraphCompiler::kHasResult); | 208 compiler->RecordAfterCall(this, FlowGraphCompiler::kHasResult); |
| 208 if (compiler->is_optimizing()) { | 209 if (compiler->is_optimizing()) { |
| 209 __ PopLocal(locs()->out(0).reg()); | 210 __ PopLocal(locs()->out(0).reg()); |
| 210 } | 211 } |
| 211 } | 212 } |
| 212 | 213 |
| 213 | 214 |
| 214 DEFINE_MAKE_LOCATION_SUMMARY(AssertAssignable, | 215 DEFINE_MAKE_LOCATION_SUMMARY(AssertAssignable, |
| 215 2, | 216 3, |
| 216 Location::SameAsFirstInput(), | 217 Location::SameAsFirstInput(), |
| 217 LocationSummary::kCall); | 218 LocationSummary::kCall); |
| 218 | 219 |
| 219 | 220 |
| 220 EMIT_NATIVE_CODE(AssertBoolean, | 221 EMIT_NATIVE_CODE(AssertBoolean, |
| 221 1, | 222 1, |
| 222 Location::SameAsFirstInput(), | 223 Location::SameAsFirstInput(), |
| 223 LocationSummary::kCall) { | 224 LocationSummary::kCall) { |
| 224 if (compiler->is_optimizing()) { | 225 if (compiler->is_optimizing()) { |
| 225 __ Push(locs()->in(0).reg()); | 226 __ Push(locs()->in(0).reg()); |
| (...skipping 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1265 EMIT_NATIVE_CODE(ReThrow, 0, Location::NoLocation(), LocationSummary::kCall) { | 1266 EMIT_NATIVE_CODE(ReThrow, 0, Location::NoLocation(), LocationSummary::kCall) { |
| 1266 compiler->SetNeedsStackTrace(catch_try_index()); | 1267 compiler->SetNeedsStackTrace(catch_try_index()); |
| 1267 __ Throw(1); | 1268 __ Throw(1); |
| 1268 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), | 1269 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), |
| 1269 token_pos()); | 1270 token_pos()); |
| 1270 compiler->RecordAfterCall(this, FlowGraphCompiler::kNoResult); | 1271 compiler->RecordAfterCall(this, FlowGraphCompiler::kNoResult); |
| 1271 __ Trap(); | 1272 __ Trap(); |
| 1272 } | 1273 } |
| 1273 | 1274 |
| 1274 EMIT_NATIVE_CODE(InstantiateType, | 1275 EMIT_NATIVE_CODE(InstantiateType, |
| 1275 1, | 1276 2, |
| 1276 Location::RequiresRegister(), | 1277 Location::RequiresRegister(), |
| 1277 LocationSummary::kCall) { | 1278 LocationSummary::kCall) { |
| 1278 if (compiler->is_optimizing()) { | 1279 if (compiler->is_optimizing()) { |
| 1279 __ Push(locs()->in(0).reg()); | 1280 __ Push(locs()->in(0).reg()); // Instantiator type arguments. |
| 1281 __ Push(locs()->in(1).reg()); // Function type arguments. |
| 1280 } | 1282 } |
| 1281 __ InstantiateType(__ AddConstant(type())); | 1283 __ InstantiateType(__ AddConstant(type())); |
| 1282 compiler->RecordSafepoint(locs()); | 1284 compiler->RecordSafepoint(locs()); |
| 1283 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), | 1285 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), |
| 1284 token_pos()); | 1286 token_pos()); |
| 1285 if (compiler->is_optimizing()) { | 1287 if (compiler->is_optimizing()) { |
| 1286 __ PopLocal(locs()->out(0).reg()); | 1288 __ PopLocal(locs()->out(0).reg()); |
| 1287 } | 1289 } |
| 1288 } | 1290 } |
| 1289 | 1291 |
| 1290 EMIT_NATIVE_CODE(InstantiateTypeArguments, | 1292 EMIT_NATIVE_CODE(InstantiateTypeArguments, |
| 1291 1, | 1293 2, |
| 1292 Location::RequiresRegister(), | 1294 Location::RequiresRegister(), |
| 1293 LocationSummary::kCall) { | 1295 LocationSummary::kCall) { |
| 1294 if (compiler->is_optimizing()) { | 1296 if (compiler->is_optimizing()) { |
| 1295 __ Push(locs()->in(0).reg()); | 1297 __ Push(locs()->in(0).reg()); // Instantiator type arguments. |
| 1298 __ Push(locs()->in(1).reg()); // Function type arguments. |
| 1296 } | 1299 } |
| 1297 __ InstantiateTypeArgumentsTOS( | 1300 __ InstantiateTypeArgumentsTOS( |
| 1298 type_arguments().IsRawInstantiatedRaw(type_arguments().Length()), | 1301 type_arguments().IsRawWhenInstantiatedFromRaw(type_arguments().Length()), |
| 1299 __ AddConstant(type_arguments())); | 1302 __ AddConstant(type_arguments())); |
| 1300 compiler->RecordSafepoint(locs()); | 1303 compiler->RecordSafepoint(locs()); |
| 1301 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), | 1304 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, deopt_id(), |
| 1302 token_pos()); | 1305 token_pos()); |
| 1303 if (compiler->is_optimizing()) { | 1306 if (compiler->is_optimizing()) { |
| 1304 __ PopLocal(locs()->out(0).reg()); | 1307 __ PopLocal(locs()->out(0).reg()); |
| 1305 } | 1308 } |
| 1306 } | 1309 } |
| 1307 | 1310 |
| 1308 | 1311 |
| (...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2095 } | 2098 } |
| 2096 __ IfULe(length, index); | 2099 __ IfULe(length, index); |
| 2097 compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckArrayBound, | 2100 compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckArrayBound, |
| 2098 (generalized_ ? ICData::kGeneralized : 0) | | 2101 (generalized_ ? ICData::kGeneralized : 0) | |
| 2099 (licm_hoisted_ ? ICData::kHoisted : 0)); | 2102 (licm_hoisted_ ? ICData::kHoisted : 0)); |
| 2100 } | 2103 } |
| 2101 | 2104 |
| 2102 } // namespace dart | 2105 } // namespace dart |
| 2103 | 2106 |
| 2104 #endif // defined TARGET_ARCH_DBC | 2107 #endif // defined TARGET_ARCH_DBC |
| OLD | NEW |