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 |