| 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 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 __ Bind(&is_true); | 676 __ Bind(&is_true); |
| 677 __ LoadConstant(result_reg, Bool::True()); | 677 __ LoadConstant(result_reg, Bool::True()); |
| 678 __ Bind(&done); | 678 __ Bind(&done); |
| 679 } | 679 } |
| 680 | 680 |
| 681 | 681 |
| 682 EMIT_NATIVE_CODE(CreateArray, | 682 EMIT_NATIVE_CODE(CreateArray, |
| 683 2, Location::RequiresRegister(), | 683 2, Location::RequiresRegister(), |
| 684 LocationSummary::kCall) { | 684 LocationSummary::kCall) { |
| 685 if (compiler->is_optimizing()) { | 685 if (compiler->is_optimizing()) { |
| 686 __ Push(locs()->in(0).reg()); | 686 const Register length = locs()->in(kLengthPos).reg(); |
| 687 __ Push(locs()->in(1).reg()); | 687 const Register type_arguments = locs()->in(kElementTypePos).reg(); |
| 688 } | 688 const Register out = locs()->out(0).reg(); |
| 689 __ CreateArrayTOS(); | 689 __ CreateArrayOpt(out, length, type_arguments); |
| 690 compiler->RecordSafepoint(locs()); | 690 __ Push(type_arguments); |
| 691 if (compiler->is_optimizing()) { | 691 __ Push(length); |
| 692 __ PopLocal(locs()->out(0).reg()); | 692 __ CreateArrayTOS(); |
| 693 compiler->RecordSafepoint(locs()); |
| 694 __ PopLocal(out); |
| 695 } else { |
| 696 __ CreateArrayTOS(); |
| 697 compiler->RecordSafepoint(locs()); |
| 693 } | 698 } |
| 694 } | 699 } |
| 695 | 700 |
| 696 | 701 |
| 697 EMIT_NATIVE_CODE(StoreIndexed, 3, Location::NoLocation(), | 702 EMIT_NATIVE_CODE(StoreIndexed, 3, Location::NoLocation(), |
| 698 LocationSummary::kNoCall, 1) { | 703 LocationSummary::kNoCall, 1) { |
| 699 if (!compiler->is_optimizing()) { | 704 if (!compiler->is_optimizing()) { |
| 700 ASSERT(class_id() == kArrayCid); | 705 ASSERT(class_id() == kArrayCid); |
| 701 __ StoreIndexedTOS(); | 706 __ StoreIndexedTOS(); |
| 702 return; | 707 return; |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 903 const Register str = locs()->in(0).reg(); | 908 const Register str = locs()->in(0).reg(); |
| 904 const Register result = locs()->out(0).reg(); // Result char code is a smi. | 909 const Register result = locs()->out(0).reg(); // Result char code is a smi. |
| 905 __ StringToCharCode(result, str); | 910 __ StringToCharCode(result, str); |
| 906 } | 911 } |
| 907 | 912 |
| 908 | 913 |
| 909 EMIT_NATIVE_CODE(AllocateObject, | 914 EMIT_NATIVE_CODE(AllocateObject, |
| 910 0, Location::RequiresRegister(), | 915 0, Location::RequiresRegister(), |
| 911 LocationSummary::kCall) { | 916 LocationSummary::kCall) { |
| 912 if (ArgumentCount() == 1) { | 917 if (ArgumentCount() == 1) { |
| 918 // Allocate with type arguments. |
| 913 __ PushConstant(cls()); | 919 __ PushConstant(cls()); |
| 914 __ AllocateT(); | 920 __ AllocateT(); |
| 915 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, | 921 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| 916 Thread::kNoDeoptId, | 922 Thread::kNoDeoptId, |
| 917 token_pos()); | 923 token_pos()); |
| 924 compiler->RecordSafepoint(locs()); |
| 925 if (compiler->is_optimizing()) { |
| 926 __ PopLocal(locs()->out(0).reg()); |
| 927 } |
| 928 } else if (compiler->is_optimizing()) { |
| 929 // If we're optimizing, try a streamlined fastpath. |
| 930 const intptr_t instance_size = cls().instance_size(); |
| 931 Isolate* isolate = Isolate::Current(); |
| 932 if (Heap::IsAllocatableInNewSpace(instance_size) && |
| 933 !cls().TraceAllocation(isolate)) { |
| 934 uword tags = 0; |
| 935 tags = RawObject::SizeTag::update(instance_size, tags); |
| 936 ASSERT(cls().id() != kIllegalCid); |
| 937 tags = RawObject::ClassIdTag::update(cls().id(), tags); |
| 938 if (Smi::IsValid(tags)) { |
| 939 const intptr_t tags_kidx = __ AddConstant(Smi::Handle(Smi::New(tags))); |
| 940 __ AllocateOpt(locs()->out(0).reg(), tags_kidx); |
| 941 } |
| 942 } |
| 943 const intptr_t kidx = __ AddConstant(cls()); |
| 944 __ Allocate(kidx); |
| 945 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| 946 Thread::kNoDeoptId, |
| 947 token_pos()); |
| 948 compiler->RecordSafepoint(locs()); |
| 949 __ PopLocal(locs()->out(0).reg()); |
| 918 } else { | 950 } else { |
| 919 const intptr_t kidx = __ AddConstant(cls()); | 951 const intptr_t kidx = __ AddConstant(cls()); |
| 920 __ Allocate(kidx); | 952 __ Allocate(kidx); |
| 921 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, | 953 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| 922 Thread::kNoDeoptId, | 954 Thread::kNoDeoptId, |
| 923 token_pos()); | 955 token_pos()); |
| 924 } | 956 compiler->RecordSafepoint(locs()); |
| 925 compiler->RecordSafepoint(locs()); | |
| 926 if (compiler->is_optimizing()) { | |
| 927 __ PopLocal(locs()->out(0).reg()); | |
| 928 } | 957 } |
| 929 } | 958 } |
| 930 | 959 |
| 931 | 960 |
| 932 EMIT_NATIVE_CODE(StoreInstanceField, 2) { | 961 EMIT_NATIVE_CODE(StoreInstanceField, 2) { |
| 933 ASSERT(!HasTemp()); | 962 ASSERT(!HasTemp()); |
| 934 ASSERT(offset_in_bytes() % kWordSize == 0); | 963 ASSERT(offset_in_bytes() % kWordSize == 0); |
| 935 if (compiler->is_optimizing()) { | 964 if (compiler->is_optimizing()) { |
| 936 const Register value = locs()->in(1).reg(); | 965 const Register value = locs()->in(1).reg(); |
| 937 const Register instance = locs()->in(0).reg(); | 966 const Register instance = locs()->in(0).reg(); |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1406 UNREACHABLE(); | 1435 UNREACHABLE(); |
| 1407 break; | 1436 break; |
| 1408 } | 1437 } |
| 1409 } | 1438 } |
| 1410 | 1439 |
| 1411 | 1440 |
| 1412 EMIT_NATIVE_CODE(Box, 1, Location::RequiresRegister(), LocationSummary::kCall) { | 1441 EMIT_NATIVE_CODE(Box, 1, Location::RequiresRegister(), LocationSummary::kCall) { |
| 1413 ASSERT(from_representation() == kUnboxedDouble); | 1442 ASSERT(from_representation() == kUnboxedDouble); |
| 1414 const Register value = locs()->in(0).reg(); | 1443 const Register value = locs()->in(0).reg(); |
| 1415 const Register out = locs()->out(0).reg(); | 1444 const Register out = locs()->out(0).reg(); |
| 1445 const intptr_t instance_size = compiler->double_class().instance_size(); |
| 1446 Isolate* isolate = Isolate::Current(); |
| 1447 ASSERT(Heap::IsAllocatableInNewSpace(instance_size)); |
| 1448 if (!compiler->double_class().TraceAllocation(isolate)) { |
| 1449 uword tags = 0; |
| 1450 tags = RawObject::SizeTag::update(instance_size, tags); |
| 1451 tags = RawObject::ClassIdTag::update(compiler->double_class().id(), tags); |
| 1452 if (Smi::IsValid(tags)) { |
| 1453 const intptr_t tags_kidx = __ AddConstant(Smi::Handle(Smi::New(tags))); |
| 1454 __ AllocateOpt(out, tags_kidx); |
| 1455 } |
| 1456 } |
| 1416 const intptr_t kidx = __ AddConstant(compiler->double_class()); | 1457 const intptr_t kidx = __ AddConstant(compiler->double_class()); |
| 1417 __ Allocate(kidx); | 1458 __ Allocate(kidx); |
| 1418 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, | 1459 compiler->AddCurrentDescriptor(RawPcDescriptors::kOther, |
| 1419 Thread::kNoDeoptId, | 1460 Thread::kNoDeoptId, |
| 1420 token_pos()); | 1461 token_pos()); |
| 1421 compiler->RecordSafepoint(locs()); | 1462 compiler->RecordSafepoint(locs()); |
| 1422 // __ Allocate puts the box at the top of the stack. | 1463 __ PopLocal(out); |
| 1423 __ WriteIntoDouble(out, value); | 1464 __ WriteIntoDouble(out, value); |
| 1424 } | 1465 } |
| 1425 | 1466 |
| 1426 | 1467 |
| 1427 EMIT_NATIVE_CODE(Unbox, 1, Location::RequiresRegister()) { | 1468 EMIT_NATIVE_CODE(Unbox, 1, Location::RequiresRegister()) { |
| 1428 ASSERT(representation() == kUnboxedDouble); | 1469 ASSERT(representation() == kUnboxedDouble); |
| 1429 const intptr_t value_cid = value()->Type()->ToCid(); | 1470 const intptr_t value_cid = value()->Type()->ToCid(); |
| 1430 const intptr_t box_cid = BoxCid(); | 1471 const intptr_t box_cid = BoxCid(); |
| 1431 const Register box = locs()->in(0).reg(); | 1472 const Register box = locs()->in(0).reg(); |
| 1432 const Register result = locs()->out(0).reg(); | 1473 const Register result = locs()->out(0).reg(); |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1743 __ IfULe(length, index); | 1784 __ IfULe(length, index); |
| 1744 compiler->EmitDeopt(deopt_id(), | 1785 compiler->EmitDeopt(deopt_id(), |
| 1745 ICData::kDeoptCheckArrayBound, | 1786 ICData::kDeoptCheckArrayBound, |
| 1746 (generalized_ ? ICData::kGeneralized : 0) | | 1787 (generalized_ ? ICData::kGeneralized : 0) | |
| 1747 (licm_hoisted_ ? ICData::kHoisted : 0)); | 1788 (licm_hoisted_ ? ICData::kHoisted : 0)); |
| 1748 } | 1789 } |
| 1749 | 1790 |
| 1750 } // namespace dart | 1791 } // namespace dart |
| 1751 | 1792 |
| 1752 #endif // defined TARGET_ARCH_DBC | 1793 #endif // defined TARGET_ARCH_DBC |
| OLD | NEW |