| 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_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
| 6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 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 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 return false; | 833 return false; |
| 834 } | 834 } |
| 835 const int64_t index = Smi::Cast(constant->value()).AsInt64Value(); | 835 const int64_t index = Smi::Cast(constant->value()).AsInt64Value(); |
| 836 const intptr_t scale = Instance::ElementSizeFor(cid); | 836 const intptr_t scale = Instance::ElementSizeFor(cid); |
| 837 const intptr_t offset = Instance::DataOffsetFor(cid); | 837 const intptr_t offset = Instance::DataOffsetFor(cid); |
| 838 const int64_t displacement = index * scale + offset; | 838 const int64_t displacement = index * scale + offset; |
| 839 return Utils::IsInt(32, displacement); | 839 return Utils::IsInt(32, displacement); |
| 840 } | 840 } |
| 841 | 841 |
| 842 | 842 |
| 843 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone, | 843 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary( |
| 844 bool opt) const { | 844 Zone* zone, bool opt) const { |
| 845 const intptr_t kNumInputs = 1; | 845 const intptr_t kNumInputs = 1; |
| 846 // TODO(fschneider): Allow immediate operands for the char code. | 846 // TODO(fschneider): Allow immediate operands for the char code. |
| 847 return LocationSummary::Make(zone, | 847 return LocationSummary::Make(zone, |
| 848 kNumInputs, | 848 kNumInputs, |
| 849 Location::RequiresRegister(), | 849 Location::RequiresRegister(), |
| 850 LocationSummary::kNoCall); | 850 LocationSummary::kNoCall); |
| 851 } | 851 } |
| 852 | 852 |
| 853 | 853 |
| 854 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 854 void OneByteStringFromCharCodeInstr::EmitNativeCode( |
| 855 FlowGraphCompiler* compiler) { |
| 855 Register char_code = locs()->in(0).reg(); | 856 Register char_code = locs()->in(0).reg(); |
| 856 Register result = locs()->out(0).reg(); | 857 Register result = locs()->out(0).reg(); |
| 857 __ movl(result, | 858 __ movl(result, |
| 858 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress()))); | 859 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress()))); |
| 859 __ movl(result, Address(result, | 860 __ movl(result, Address(result, |
| 860 char_code, | 861 char_code, |
| 861 TIMES_HALF_WORD_SIZE, // Char code is a smi. | 862 TIMES_HALF_WORD_SIZE, // Char code is a smi. |
| 862 Symbols::kNullCharCodeSymbolOffset * kWordSize)); | 863 Symbols::kNullCharCodeSymbolOffset * kWordSize)); |
| 863 } | 864 } |
| 864 | 865 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 | 994 |
| 994 case kTypedDataInt8ArrayCid: | 995 case kTypedDataInt8ArrayCid: |
| 995 case kTypedDataUint8ArrayCid: | 996 case kTypedDataUint8ArrayCid: |
| 996 case kTypedDataUint8ClampedArrayCid: | 997 case kTypedDataUint8ClampedArrayCid: |
| 997 case kExternalTypedDataUint8ArrayCid: | 998 case kExternalTypedDataUint8ArrayCid: |
| 998 case kExternalTypedDataUint8ClampedArrayCid: | 999 case kExternalTypedDataUint8ClampedArrayCid: |
| 999 case kTypedDataInt16ArrayCid: | 1000 case kTypedDataInt16ArrayCid: |
| 1000 case kTypedDataUint16ArrayCid: | 1001 case kTypedDataUint16ArrayCid: |
| 1001 case kOneByteStringCid: | 1002 case kOneByteStringCid: |
| 1002 case kTwoByteStringCid: | 1003 case kTwoByteStringCid: |
| 1004 case kExternalOneByteStringCid: |
| 1005 case kExternalTwoByteStringCid: |
| 1003 return CompileType::FromCid(kSmiCid); | 1006 return CompileType::FromCid(kSmiCid); |
| 1004 | 1007 |
| 1005 case kTypedDataInt32ArrayCid: | 1008 case kTypedDataInt32ArrayCid: |
| 1006 case kTypedDataUint32ArrayCid: | 1009 case kTypedDataUint32ArrayCid: |
| 1007 return CompileType::Int(); | 1010 return CompileType::Int(); |
| 1008 | 1011 |
| 1009 default: | 1012 default: |
| 1010 UNIMPLEMENTED(); | 1013 UNIMPLEMENTED(); |
| 1011 return CompileType::Dynamic(); | 1014 return CompileType::Dynamic(); |
| 1012 } | 1015 } |
| 1013 } | 1016 } |
| 1014 | 1017 |
| 1015 | 1018 |
| 1016 Representation LoadIndexedInstr::representation() const { | 1019 Representation LoadIndexedInstr::representation() const { |
| 1017 switch (class_id_) { | 1020 switch (class_id_) { |
| 1018 case kArrayCid: | 1021 case kArrayCid: |
| 1019 case kImmutableArrayCid: | 1022 case kImmutableArrayCid: |
| 1020 case kTypedDataInt8ArrayCid: | 1023 case kTypedDataInt8ArrayCid: |
| 1021 case kTypedDataUint8ArrayCid: | 1024 case kTypedDataUint8ArrayCid: |
| 1022 case kTypedDataUint8ClampedArrayCid: | 1025 case kTypedDataUint8ClampedArrayCid: |
| 1023 case kExternalTypedDataUint8ArrayCid: | 1026 case kExternalTypedDataUint8ArrayCid: |
| 1024 case kExternalTypedDataUint8ClampedArrayCid: | 1027 case kExternalTypedDataUint8ClampedArrayCid: |
| 1025 case kTypedDataInt16ArrayCid: | 1028 case kTypedDataInt16ArrayCid: |
| 1026 case kTypedDataUint16ArrayCid: | 1029 case kTypedDataUint16ArrayCid: |
| 1027 case kOneByteStringCid: | 1030 case kOneByteStringCid: |
| 1028 case kTwoByteStringCid: | 1031 case kTwoByteStringCid: |
| 1032 case kExternalOneByteStringCid: |
| 1033 case kExternalTwoByteStringCid: |
| 1029 return kTagged; | 1034 return kTagged; |
| 1030 case kTypedDataInt32ArrayCid: | 1035 case kTypedDataInt32ArrayCid: |
| 1031 return kUnboxedInt32; | 1036 return kUnboxedInt32; |
| 1032 case kTypedDataUint32ArrayCid: | 1037 case kTypedDataUint32ArrayCid: |
| 1033 return kUnboxedUint32; | 1038 return kUnboxedUint32; |
| 1034 case kTypedDataFloat32ArrayCid: | 1039 case kTypedDataFloat32ArrayCid: |
| 1035 case kTypedDataFloat64ArrayCid: | 1040 case kTypedDataFloat64ArrayCid: |
| 1036 return kUnboxedDouble; | 1041 return kUnboxedDouble; |
| 1037 case kTypedDataFloat32x4ArrayCid: | 1042 case kTypedDataFloat32x4ArrayCid: |
| 1038 return kUnboxedFloat32x4; | 1043 return kUnboxedFloat32x4; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1152 case kTypedDataInt8ArrayCid: | 1157 case kTypedDataInt8ArrayCid: |
| 1153 ASSERT(index_scale() == 1); | 1158 ASSERT(index_scale() == 1); |
| 1154 __ movsxb(result, element_address); | 1159 __ movsxb(result, element_address); |
| 1155 __ SmiTag(result); | 1160 __ SmiTag(result); |
| 1156 break; | 1161 break; |
| 1157 case kTypedDataUint8ArrayCid: | 1162 case kTypedDataUint8ArrayCid: |
| 1158 case kTypedDataUint8ClampedArrayCid: | 1163 case kTypedDataUint8ClampedArrayCid: |
| 1159 case kExternalTypedDataUint8ArrayCid: | 1164 case kExternalTypedDataUint8ArrayCid: |
| 1160 case kExternalTypedDataUint8ClampedArrayCid: | 1165 case kExternalTypedDataUint8ClampedArrayCid: |
| 1161 case kOneByteStringCid: | 1166 case kOneByteStringCid: |
| 1167 case kExternalOneByteStringCid: |
| 1162 ASSERT(index_scale() == 1); | 1168 ASSERT(index_scale() == 1); |
| 1163 __ movzxb(result, element_address); | 1169 __ movzxb(result, element_address); |
| 1164 __ SmiTag(result); | 1170 __ SmiTag(result); |
| 1165 break; | 1171 break; |
| 1166 case kTypedDataInt16ArrayCid: | 1172 case kTypedDataInt16ArrayCid: |
| 1167 __ movsxw(result, element_address); | 1173 __ movsxw(result, element_address); |
| 1168 __ SmiTag(result); | 1174 __ SmiTag(result); |
| 1169 break; | 1175 break; |
| 1170 case kTypedDataUint16ArrayCid: | 1176 case kTypedDataUint16ArrayCid: |
| 1171 case kTwoByteStringCid: | 1177 case kTwoByteStringCid: |
| 1178 case kExternalTwoByteStringCid: |
| 1172 __ movzxw(result, element_address); | 1179 __ movzxw(result, element_address); |
| 1173 __ SmiTag(result); | 1180 __ SmiTag(result); |
| 1174 break; | 1181 break; |
| 1175 default: | 1182 default: |
| 1176 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); | 1183 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); |
| 1177 __ movl(result, element_address); | 1184 __ movl(result, element_address); |
| 1178 break; | 1185 break; |
| 1179 } | 1186 } |
| 1180 } | 1187 } |
| 1181 | 1188 |
| (...skipping 5684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6866 __ Drop(1); | 6873 __ Drop(1); |
| 6867 __ popl(result); | 6874 __ popl(result); |
| 6868 } | 6875 } |
| 6869 | 6876 |
| 6870 | 6877 |
| 6871 } // namespace dart | 6878 } // namespace dart |
| 6872 | 6879 |
| 6873 #undef __ | 6880 #undef __ |
| 6874 | 6881 |
| 6875 #endif // defined TARGET_ARCH_IA32 | 6882 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |