Chromium Code Reviews| 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 <setjmp.h> // NOLINT | 5 #include <setjmp.h> // NOLINT |
| 6 #include <stdlib.h> | 6 #include <stdlib.h> |
| 7 | 7 |
| 8 #include "vm/globals.h" | 8 #include "vm/globals.h" |
| 9 #if defined(TARGET_ARCH_DBC) | 9 #if defined(TARGET_ARCH_DBC) |
| 10 | 10 |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 232 RawSmi* index = static_cast<RawSmi*>(args[1]); | 232 RawSmi* index = static_cast<RawSmi*>(args[1]); |
| 233 RawGrowableObjectArray* array = | 233 RawGrowableObjectArray* array = |
| 234 static_cast<RawGrowableObjectArray*>(args[0]); | 234 static_cast<RawGrowableObjectArray*>(args[0]); |
| 235 if (CheckIndex(index, array->ptr()->length_)) { | 235 if (CheckIndex(index, array->ptr()->length_)) { |
| 236 *result = array->ptr()->data_->ptr()->data()[Smi::Value(index)]; | 236 *result = array->ptr()->data_->ptr()->data()[Smi::Value(index)]; |
| 237 return true; | 237 return true; |
| 238 } | 238 } |
| 239 return false; | 239 return false; |
| 240 } | 240 } |
| 241 | 241 |
| 242 static bool Double_getIsNan(Thread* thread, | |
| 243 RawObject** FP, | |
| 244 RawObject** result) { | |
| 245 RawObject** args = FrameArguments(FP, 1); | |
| 246 RawDouble* d = static_cast<RawDouble*>(args[0]); | |
| 247 *result = isnan(d->ptr()->value_) | |
| 248 ? Bool::True().raw() | |
| 249 : Bool::False().raw(); | |
| 250 return true; | |
| 251 } | |
| 252 | |
| 253 static bool ObjectEquals(Thread* thread, | |
| 254 RawObject** FP, | |
| 255 RawObject** result) { | |
| 256 RawObject** args = FrameArguments(FP, 2); | |
| 257 *result = args[0] == args[1] ? Bool::True().raw() : Bool::False().raw(); | |
| 258 return true; | |
| 259 } | |
| 260 | |
| 261 static bool ObjectRuntimeType(Thread* thread, | |
| 262 RawObject** FP, | |
| 263 RawObject** result) { | |
| 264 RawObject** args = FrameArguments(FP, 1); | |
| 265 const intptr_t cid = GetClassId(args[0]); | |
| 266 if (cid == kClosureCid) { | |
| 267 return false; | |
| 268 } | |
| 269 RawClass* cls = thread->isolate()->class_table()->At(cid); | |
| 270 if (cls->ptr()->num_type_arguments_ != 0) { | |
| 271 return false; | |
| 272 } | |
| 273 RawType* typ = cls->ptr()->canonical_type_; | |
| 274 if (typ == Object::null()) { | |
| 275 return false; | |
| 276 } | |
| 277 *result = static_cast<RawObject*>(typ); | |
| 278 return true; | |
| 279 } | |
| 280 | |
| 281 static bool GetDoubleOperands(RawObject** args, double* d1, double* d2) { | |
| 282 RawObject* obj2 = args[1]; | |
| 283 if (!obj2->IsHeapObject()) { | |
|
Florian Schneider
2016/10/17 16:58:54
I'd rather use obj2->IsSmi() for readability avoid
zra
2016/10/17 17:22:51
IsSmi() calls GetClassId() which calls ptr() which
| |
| 284 *d2 = static_cast<double>( | |
| 285 reinterpret_cast<intptr_t>(obj2) >> kSmiTagSize); | |
| 286 } else if (obj2->GetClassId() == kDoubleCid) { | |
| 287 RawDouble* obj2d = static_cast<RawDouble*>(obj2); | |
| 288 *d2 = obj2d->ptr()->value_; | |
| 289 } else { | |
| 290 return false; | |
| 291 } | |
| 292 RawDouble* obj1 = static_cast<RawDouble*>(args[0]); | |
| 293 *d1 = obj1->ptr()->value_; | |
| 294 return true; | |
| 295 } | |
| 296 | |
| 297 static bool Double_add(Thread* thread, | |
| 298 RawObject** FP, | |
| 299 RawObject** result) { | |
| 300 double d1, d2; | |
| 301 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 302 return false; | |
| 303 } | |
| 304 *result = static_cast<RawObject*>(Double::New(d1 + d2)); | |
| 305 return true; | |
| 306 } | |
| 307 | |
| 308 static bool Double_mul(Thread* thread, | |
| 309 RawObject** FP, | |
| 310 RawObject** result) { | |
| 311 double d1, d2; | |
| 312 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 313 return false; | |
| 314 } | |
| 315 *result = static_cast<RawObject*>(Double::New(d1 * d2)); | |
| 316 return true; | |
| 317 } | |
| 318 | |
| 319 static bool Double_sub(Thread* thread, | |
| 320 RawObject** FP, | |
| 321 RawObject** result) { | |
| 322 double d1, d2; | |
| 323 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 324 return false; | |
| 325 } | |
| 326 *result = static_cast<RawObject*>(Double::New(d1 - d2)); | |
| 327 return true; | |
| 328 } | |
| 329 | |
| 330 static bool Double_div(Thread* thread, | |
| 331 RawObject** FP, | |
| 332 RawObject** result) { | |
| 333 double d1, d2; | |
| 334 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 335 return false; | |
| 336 } | |
| 337 *result = static_cast<RawObject*>(Double::New(d1 / d2)); | |
| 338 return true; | |
| 339 } | |
| 340 | |
| 341 static bool Double_greaterThan(Thread* thread, | |
| 342 RawObject** FP, | |
| 343 RawObject** result) { | |
| 344 double d1, d2; | |
| 345 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 346 return false; | |
| 347 } | |
| 348 *result = d1 > d2 ? Bool::True().raw() : Bool::False().raw(); | |
| 349 return true; | |
| 350 } | |
| 351 | |
| 352 static bool Double_greaterEqualThan(Thread* thread, | |
| 353 RawObject** FP, | |
| 354 RawObject** result) { | |
| 355 double d1, d2; | |
| 356 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 357 return false; | |
| 358 } | |
| 359 *result = d1 >= d2 ? Bool::True().raw() : Bool::False().raw(); | |
| 360 return true; | |
| 361 } | |
| 362 | |
| 363 static bool Double_lessThan(Thread* thread, | |
| 364 RawObject** FP, | |
| 365 RawObject** result) { | |
| 366 double d1, d2; | |
| 367 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 368 return false; | |
| 369 } | |
| 370 *result = d1 < d2 ? Bool::True().raw() : Bool::False().raw(); | |
| 371 return true; | |
| 372 } | |
| 373 | |
| 374 static bool Double_equal(Thread* thread, | |
| 375 RawObject** FP, | |
| 376 RawObject** result) { | |
| 377 double d1, d2; | |
| 378 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 379 return false; | |
| 380 } | |
| 381 *result = d1 == d2 ? Bool::True().raw() : Bool::False().raw(); | |
| 382 return true; | |
| 383 } | |
| 384 | |
| 385 static bool Double_lessEqualThan(Thread* thread, | |
| 386 RawObject** FP, | |
| 387 RawObject** result) { | |
| 388 double d1, d2; | |
| 389 if (!GetDoubleOperands(FrameArguments(FP, 2), &d1, &d2)) { | |
| 390 return false; | |
| 391 } | |
| 392 *result = d1 <= d2 ? Bool::True().raw() : Bool::False().raw(); | |
| 393 return true; | |
| 394 } | |
| 395 | |
| 242 DART_FORCE_INLINE static RawCode* FrameCode(RawObject** FP) { | 396 DART_FORCE_INLINE static RawCode* FrameCode(RawObject** FP) { |
| 243 ASSERT(GetClassId(FP[kPcMarkerSlotFromFp]) == kCodeCid); | 397 ASSERT(GetClassId(FP[kPcMarkerSlotFromFp]) == kCodeCid); |
| 244 return static_cast<RawCode*>(FP[kPcMarkerSlotFromFp]); | 398 return static_cast<RawCode*>(FP[kPcMarkerSlotFromFp]); |
| 245 } | 399 } |
| 246 | 400 |
| 247 | 401 |
| 248 DART_FORCE_INLINE static void SetFrameCode(RawObject** FP, RawCode* code) { | 402 DART_FORCE_INLINE static void SetFrameCode(RawObject** FP, RawCode* code) { |
| 249 ASSERT(GetClassId(code) == kCodeCid); | 403 ASSERT(GetClassId(code) == kCodeCid); |
| 250 FP[kPcMarkerSlotFromFp] = code; | 404 FP[kPcMarkerSlotFromFp] = code; |
| 251 } | 405 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 283 } | 437 } |
| 284 | 438 |
| 285 intrinsics_[kObjectArraySetIndexedIntrinsic] = | 439 intrinsics_[kObjectArraySetIndexedIntrinsic] = |
| 286 SimulatorHelpers::ObjectArraySetIndexed; | 440 SimulatorHelpers::ObjectArraySetIndexed; |
| 287 intrinsics_[kObjectArrayGetIndexedIntrinsic] = | 441 intrinsics_[kObjectArrayGetIndexedIntrinsic] = |
| 288 SimulatorHelpers::ObjectArrayGetIndexed; | 442 SimulatorHelpers::ObjectArrayGetIndexed; |
| 289 intrinsics_[kGrowableArraySetIndexedIntrinsic] = | 443 intrinsics_[kGrowableArraySetIndexedIntrinsic] = |
| 290 SimulatorHelpers::GrowableArraySetIndexed; | 444 SimulatorHelpers::GrowableArraySetIndexed; |
| 291 intrinsics_[kGrowableArrayGetIndexedIntrinsic] = | 445 intrinsics_[kGrowableArrayGetIndexedIntrinsic] = |
| 292 SimulatorHelpers::GrowableArrayGetIndexed; | 446 SimulatorHelpers::GrowableArrayGetIndexed; |
| 447 intrinsics_[kObjectEqualsIntrinsic] = | |
| 448 SimulatorHelpers::ObjectEquals; | |
| 449 intrinsics_[kObjectRuntimeTypeIntrinsic] = | |
| 450 SimulatorHelpers::ObjectRuntimeType; | |
| 451 | |
| 452 intrinsics_[kDouble_getIsNaNIntrinsic] = | |
| 453 SimulatorHelpers::Double_getIsNan; | |
| 454 intrinsics_[kDouble_addIntrinsic] = | |
| 455 SimulatorHelpers::Double_add; | |
| 456 intrinsics_[kDouble_mulIntrinsic] = | |
| 457 SimulatorHelpers::Double_mul; | |
| 458 intrinsics_[kDouble_subIntrinsic] = | |
| 459 SimulatorHelpers::Double_sub; | |
| 460 intrinsics_[kDouble_divIntrinsic] = | |
| 461 SimulatorHelpers::Double_div; | |
| 462 intrinsics_[kDouble_greaterThanIntrinsic] = | |
| 463 SimulatorHelpers::Double_greaterThan; | |
| 464 intrinsics_[kDouble_greaterEqualThanIntrinsic] = | |
| 465 SimulatorHelpers::Double_greaterEqualThan; | |
| 466 intrinsics_[kDouble_lessThanIntrinsic] = | |
| 467 SimulatorHelpers::Double_lessThan; | |
| 468 intrinsics_[kDouble_equalIntrinsic] = | |
| 469 SimulatorHelpers::Double_equal; | |
| 470 intrinsics_[kDouble_lessEqualThanIntrinsic] = | |
| 471 SimulatorHelpers::Double_lessEqualThan; | |
| 293 } | 472 } |
| 294 | 473 |
| 295 | 474 |
| 296 Simulator::Simulator() | 475 Simulator::Simulator() |
| 297 : stack_(NULL), | 476 : stack_(NULL), |
| 298 fp_(NULL), | 477 fp_(NULL), |
| 299 sp_(NULL) { | 478 sp_(NULL) { |
| 300 // Setup simulator support first. Some of this information is needed to | 479 // Setup simulator support first. Some of this information is needed to |
| 301 // setup the architecture state. | 480 // setup the architecture state. |
| 302 // We allocate the stack here, the size is computed as the sum of | 481 // We allocate the stack here, the size is computed as the sum of |
| (...skipping 2572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2875 const bool may_be_smi = (rB == 1); | 3054 const bool may_be_smi = (rB == 1); |
| 2876 const intptr_t cids_length = rC; | 3055 const intptr_t cids_length = rC; |
| 2877 if (LIKELY(!is_smi)) { | 3056 if (LIKELY(!is_smi)) { |
| 2878 const intptr_t cid = SimulatorHelpers::GetClassId(FP[rA]); | 3057 const intptr_t cid = SimulatorHelpers::GetClassId(FP[rA]); |
| 2879 for (intptr_t i = 0; i < cids_length; i++) { | 3058 for (intptr_t i = 0; i < cids_length; i++) { |
| 2880 const intptr_t desired_cid = Bytecode::DecodeD(*(pc + i)); | 3059 const intptr_t desired_cid = Bytecode::DecodeD(*(pc + i)); |
| 2881 if (cid == desired_cid) { | 3060 if (cid == desired_cid) { |
| 2882 pc++; | 3061 pc++; |
| 2883 break; | 3062 break; |
| 2884 } | 3063 } |
| 2885 // The cids are sorted in descending order. | |
| 2886 if (cid > desired_cid) { | |
| 2887 break; | |
| 2888 } | |
| 2889 } | 3064 } |
| 2890 pc += cids_length; | 3065 pc += cids_length; |
| 2891 } else { | 3066 } else { |
| 2892 pc += cids_length; | 3067 pc += cids_length; |
| 2893 pc += (may_be_smi ? 1 : 0); | 3068 pc += (may_be_smi ? 1 : 0); |
| 2894 } | 3069 } |
| 2895 DISPATCH(); | 3070 DISPATCH(); |
| 2896 } | 3071 } |
| 2897 | 3072 |
| 2898 { | 3073 { |
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3494 pc_ = pc; | 3669 pc_ = pc; |
| 3495 special_[kExceptionSpecialIndex] = raw_exception; | 3670 special_[kExceptionSpecialIndex] = raw_exception; |
| 3496 special_[kStacktraceSpecialIndex] = raw_stacktrace; | 3671 special_[kStacktraceSpecialIndex] = raw_stacktrace; |
| 3497 buf->Longjmp(); | 3672 buf->Longjmp(); |
| 3498 UNREACHABLE(); | 3673 UNREACHABLE(); |
| 3499 } | 3674 } |
| 3500 | 3675 |
| 3501 } // namespace dart | 3676 } // namespace dart |
| 3502 | 3677 |
| 3503 #endif // defined TARGET_ARCH_DBC | 3678 #endif // defined TARGET_ARCH_DBC |
| OLD | NEW |