OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
805 const Object& constant = index->definition()->AsConstant()->value(); | 805 const Object& constant = index->definition()->AsConstant()->value(); |
806 if (!constant.IsSmi()) return false; | 806 if (!constant.IsSmi()) return false; |
807 const Smi& smi_const = Smi::Cast(constant); | 807 const Smi& smi_const = Smi::Cast(constant); |
808 const intptr_t scale = Instance::ElementSizeFor(cid); | 808 const intptr_t scale = Instance::ElementSizeFor(cid); |
809 const intptr_t data_offset = Instance::DataOffsetFor(cid); | 809 const intptr_t data_offset = Instance::DataOffsetFor(cid); |
810 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset; | 810 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset; |
811 return Utils::IsInt(32, disp); | 811 return Utils::IsInt(32, disp); |
812 } | 812 } |
813 | 813 |
814 | 814 |
815 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone, | 815 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary( |
816 bool opt) const { | 816 Zone* zone, bool opt) const { |
817 const intptr_t kNumInputs = 1; | 817 const intptr_t kNumInputs = 1; |
818 // TODO(fschneider): Allow immediate operands for the char code. | 818 // TODO(fschneider): Allow immediate operands for the char code. |
819 return LocationSummary::Make(zone, | 819 return LocationSummary::Make(zone, |
820 kNumInputs, | 820 kNumInputs, |
821 Location::RequiresRegister(), | 821 Location::RequiresRegister(), |
822 LocationSummary::kNoCall); | 822 LocationSummary::kNoCall); |
823 } | 823 } |
824 | 824 |
825 | 825 |
826 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 826 void OneByteStringFromCharCodeInstr::EmitNativeCode( |
| 827 FlowGraphCompiler* compiler) { |
827 ASSERT(compiler->is_optimizing()); | 828 ASSERT(compiler->is_optimizing()); |
828 Register char_code = locs()->in(0).reg(); | 829 Register char_code = locs()->in(0).reg(); |
829 Register result = locs()->out(0).reg(); | 830 Register result = locs()->out(0).reg(); |
830 | 831 |
831 __ movq(result, Address(THR, Thread::predefined_symbols_address_offset())); | 832 __ movq(result, Address(THR, Thread::predefined_symbols_address_offset())); |
832 __ movq(result, Address(result, | 833 __ movq(result, Address(result, |
833 char_code, | 834 char_code, |
834 TIMES_HALF_WORD_SIZE, // Char code is a smi. | 835 TIMES_HALF_WORD_SIZE, // Char code is a smi. |
835 Symbols::kNullCharCodeSymbolOffset * kWordSize)); | 836 Symbols::kNullCharCodeSymbolOffset * kWordSize)); |
836 } | 837 } |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
966 | 967 |
967 case kTypedDataInt8ArrayCid: | 968 case kTypedDataInt8ArrayCid: |
968 case kTypedDataUint8ArrayCid: | 969 case kTypedDataUint8ArrayCid: |
969 case kTypedDataUint8ClampedArrayCid: | 970 case kTypedDataUint8ClampedArrayCid: |
970 case kExternalTypedDataUint8ArrayCid: | 971 case kExternalTypedDataUint8ArrayCid: |
971 case kExternalTypedDataUint8ClampedArrayCid: | 972 case kExternalTypedDataUint8ClampedArrayCid: |
972 case kTypedDataInt16ArrayCid: | 973 case kTypedDataInt16ArrayCid: |
973 case kTypedDataUint16ArrayCid: | 974 case kTypedDataUint16ArrayCid: |
974 case kOneByteStringCid: | 975 case kOneByteStringCid: |
975 case kTwoByteStringCid: | 976 case kTwoByteStringCid: |
| 977 case kExternalOneByteStringCid: |
| 978 case kExternalTwoByteStringCid: |
976 case kTypedDataInt32ArrayCid: | 979 case kTypedDataInt32ArrayCid: |
977 case kTypedDataUint32ArrayCid: | 980 case kTypedDataUint32ArrayCid: |
978 return CompileType::FromCid(kSmiCid); | 981 return CompileType::FromCid(kSmiCid); |
979 | 982 |
980 case kTypedDataInt64ArrayCid: | 983 case kTypedDataInt64ArrayCid: |
981 return CompileType::Int(); | 984 return CompileType::Int(); |
982 | 985 |
983 default: | 986 default: |
984 UNIMPLEMENTED(); | 987 UNIMPLEMENTED(); |
985 return CompileType::Dynamic(); | 988 return CompileType::Dynamic(); |
986 } | 989 } |
987 } | 990 } |
988 | 991 |
989 | 992 |
990 Representation LoadIndexedInstr::representation() const { | 993 Representation LoadIndexedInstr::representation() const { |
991 switch (class_id_) { | 994 switch (class_id_) { |
992 case kArrayCid: | 995 case kArrayCid: |
993 case kImmutableArrayCid: | 996 case kImmutableArrayCid: |
994 case kTypedDataInt8ArrayCid: | 997 case kTypedDataInt8ArrayCid: |
995 case kTypedDataUint8ArrayCid: | 998 case kTypedDataUint8ArrayCid: |
996 case kTypedDataUint8ClampedArrayCid: | 999 case kTypedDataUint8ClampedArrayCid: |
997 case kExternalTypedDataUint8ArrayCid: | 1000 case kExternalTypedDataUint8ArrayCid: |
998 case kExternalTypedDataUint8ClampedArrayCid: | 1001 case kExternalTypedDataUint8ClampedArrayCid: |
999 case kTypedDataInt16ArrayCid: | 1002 case kTypedDataInt16ArrayCid: |
1000 case kTypedDataUint16ArrayCid: | 1003 case kTypedDataUint16ArrayCid: |
1001 case kOneByteStringCid: | 1004 case kOneByteStringCid: |
1002 case kTwoByteStringCid: | 1005 case kTwoByteStringCid: |
| 1006 case kExternalOneByteStringCid: |
| 1007 case kExternalTwoByteStringCid: |
1003 return kTagged; | 1008 return kTagged; |
1004 case kTypedDataInt32ArrayCid: | 1009 case kTypedDataInt32ArrayCid: |
1005 return kUnboxedInt32; | 1010 return kUnboxedInt32; |
1006 case kTypedDataUint32ArrayCid: | 1011 case kTypedDataUint32ArrayCid: |
1007 return kUnboxedUint32; | 1012 return kUnboxedUint32; |
1008 case kTypedDataInt64ArrayCid: | 1013 case kTypedDataInt64ArrayCid: |
1009 return kUnboxedMint; | 1014 return kUnboxedMint; |
1010 case kTypedDataFloat32ArrayCid: | 1015 case kTypedDataFloat32ArrayCid: |
1011 case kTypedDataFloat64ArrayCid: | 1016 case kTypedDataFloat64ArrayCid: |
1012 return kUnboxedDouble; | 1017 return kUnboxedDouble; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 switch (class_id()) { | 1133 switch (class_id()) { |
1129 case kTypedDataInt8ArrayCid: | 1134 case kTypedDataInt8ArrayCid: |
1130 __ movsxb(result, element_address); | 1135 __ movsxb(result, element_address); |
1131 __ SmiTag(result); | 1136 __ SmiTag(result); |
1132 break; | 1137 break; |
1133 case kTypedDataUint8ArrayCid: | 1138 case kTypedDataUint8ArrayCid: |
1134 case kTypedDataUint8ClampedArrayCid: | 1139 case kTypedDataUint8ClampedArrayCid: |
1135 case kExternalTypedDataUint8ArrayCid: | 1140 case kExternalTypedDataUint8ArrayCid: |
1136 case kExternalTypedDataUint8ClampedArrayCid: | 1141 case kExternalTypedDataUint8ClampedArrayCid: |
1137 case kOneByteStringCid: | 1142 case kOneByteStringCid: |
| 1143 case kExternalOneByteStringCid: |
1138 __ movzxb(result, element_address); | 1144 __ movzxb(result, element_address); |
1139 __ SmiTag(result); | 1145 __ SmiTag(result); |
1140 break; | 1146 break; |
1141 case kTypedDataInt16ArrayCid: | 1147 case kTypedDataInt16ArrayCid: |
1142 __ movsxw(result, element_address); | 1148 __ movsxw(result, element_address); |
1143 __ SmiTag(result); | 1149 __ SmiTag(result); |
1144 break; | 1150 break; |
1145 case kTypedDataUint16ArrayCid: | 1151 case kTypedDataUint16ArrayCid: |
1146 case kTwoByteStringCid: | 1152 case kTwoByteStringCid: |
| 1153 case kExternalTwoByteStringCid: |
1147 __ movzxw(result, element_address); | 1154 __ movzxw(result, element_address); |
1148 __ SmiTag(result); | 1155 __ SmiTag(result); |
1149 break; | 1156 break; |
1150 default: | 1157 default: |
1151 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); | 1158 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); |
1152 __ movq(result, element_address); | 1159 __ movq(result, element_address); |
1153 break; | 1160 break; |
1154 } | 1161 } |
1155 } | 1162 } |
1156 | 1163 |
(...skipping 5389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6546 __ Drop(1); | 6553 __ Drop(1); |
6547 __ popq(result); | 6554 __ popq(result); |
6548 } | 6555 } |
6549 | 6556 |
6550 | 6557 |
6551 } // namespace dart | 6558 } // namespace dart |
6552 | 6559 |
6553 #undef __ | 6560 #undef __ |
6554 | 6561 |
6555 #endif // defined TARGET_ARCH_X64 | 6562 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |