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_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
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 1001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1012 ExternalLabel label(entry); | 1012 ExternalLabel label(entry); |
1013 __ LoadNativeEntry(T5, &label, kNotPatchable); | 1013 __ LoadNativeEntry(T5, &label, kNotPatchable); |
1014 compiler->GenerateCall(token_pos(), | 1014 compiler->GenerateCall(token_pos(), |
1015 *stub_entry, | 1015 *stub_entry, |
1016 RawPcDescriptors::kOther, | 1016 RawPcDescriptors::kOther, |
1017 locs()); | 1017 locs()); |
1018 __ Pop(result); | 1018 __ Pop(result); |
1019 } | 1019 } |
1020 | 1020 |
1021 | 1021 |
1022 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone, | 1022 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary( |
1023 bool opt) const { | 1023 Zone* zone, bool opt) const { |
1024 const intptr_t kNumInputs = 1; | 1024 const intptr_t kNumInputs = 1; |
1025 // TODO(fschneider): Allow immediate operands for the char code. | 1025 // TODO(fschneider): Allow immediate operands for the char code. |
1026 return LocationSummary::Make(zone, | 1026 return LocationSummary::Make(zone, |
1027 kNumInputs, | 1027 kNumInputs, |
1028 Location::RequiresRegister(), | 1028 Location::RequiresRegister(), |
1029 LocationSummary::kNoCall); | 1029 LocationSummary::kNoCall); |
1030 } | 1030 } |
1031 | 1031 |
1032 | 1032 |
1033 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1033 void OneByteStringFromCharCodeInstr::EmitNativeCode( |
| 1034 FlowGraphCompiler* compiler) { |
1034 ASSERT(compiler->is_optimizing()); | 1035 ASSERT(compiler->is_optimizing()); |
1035 Register char_code = locs()->in(0).reg(); | 1036 Register char_code = locs()->in(0).reg(); |
1036 Register result = locs()->out(0).reg(); | 1037 Register result = locs()->out(0).reg(); |
1037 | 1038 |
1038 __ Comment("StringFromCharCodeInstr"); | |
1039 | |
1040 __ lw(result, Address(THR, Thread::predefined_symbols_address_offset())); | 1039 __ lw(result, Address(THR, Thread::predefined_symbols_address_offset())); |
1041 __ AddImmediate(result, Symbols::kNullCharCodeSymbolOffset * kWordSize); | 1040 __ AddImmediate(result, Symbols::kNullCharCodeSymbolOffset * kWordSize); |
1042 __ sll(TMP, char_code, 1); // Char code is a smi. | 1041 __ sll(TMP, char_code, 1); // Char code is a smi. |
1043 __ addu(TMP, TMP, result); | 1042 __ addu(TMP, TMP, result); |
1044 __ lw(result, Address(TMP)); | 1043 __ lw(result, Address(TMP)); |
1045 } | 1044 } |
1046 | 1045 |
1047 | 1046 |
1048 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone, | 1047 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone, |
1049 bool opt) const { | 1048 bool opt) const { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1162 | 1161 |
1163 case kTypedDataInt8ArrayCid: | 1162 case kTypedDataInt8ArrayCid: |
1164 case kTypedDataUint8ArrayCid: | 1163 case kTypedDataUint8ArrayCid: |
1165 case kTypedDataUint8ClampedArrayCid: | 1164 case kTypedDataUint8ClampedArrayCid: |
1166 case kExternalTypedDataUint8ArrayCid: | 1165 case kExternalTypedDataUint8ArrayCid: |
1167 case kExternalTypedDataUint8ClampedArrayCid: | 1166 case kExternalTypedDataUint8ClampedArrayCid: |
1168 case kTypedDataInt16ArrayCid: | 1167 case kTypedDataInt16ArrayCid: |
1169 case kTypedDataUint16ArrayCid: | 1168 case kTypedDataUint16ArrayCid: |
1170 case kOneByteStringCid: | 1169 case kOneByteStringCid: |
1171 case kTwoByteStringCid: | 1170 case kTwoByteStringCid: |
| 1171 case kExternalOneByteStringCid: |
| 1172 case kExternalTwoByteStringCid: |
1172 return CompileType::FromCid(kSmiCid); | 1173 return CompileType::FromCid(kSmiCid); |
1173 | 1174 |
1174 case kTypedDataInt32ArrayCid: | 1175 case kTypedDataInt32ArrayCid: |
1175 case kTypedDataUint32ArrayCid: | 1176 case kTypedDataUint32ArrayCid: |
1176 return CompileType::Int(); | 1177 return CompileType::Int(); |
1177 | 1178 |
1178 default: | 1179 default: |
1179 UNIMPLEMENTED(); | 1180 UNIMPLEMENTED(); |
1180 return CompileType::Dynamic(); | 1181 return CompileType::Dynamic(); |
1181 } | 1182 } |
1182 } | 1183 } |
1183 | 1184 |
1184 | 1185 |
1185 Representation LoadIndexedInstr::representation() const { | 1186 Representation LoadIndexedInstr::representation() const { |
1186 switch (class_id_) { | 1187 switch (class_id_) { |
1187 case kArrayCid: | 1188 case kArrayCid: |
1188 case kImmutableArrayCid: | 1189 case kImmutableArrayCid: |
1189 case kTypedDataInt8ArrayCid: | 1190 case kTypedDataInt8ArrayCid: |
1190 case kTypedDataUint8ArrayCid: | 1191 case kTypedDataUint8ArrayCid: |
1191 case kTypedDataUint8ClampedArrayCid: | 1192 case kTypedDataUint8ClampedArrayCid: |
1192 case kExternalTypedDataUint8ArrayCid: | 1193 case kExternalTypedDataUint8ArrayCid: |
1193 case kExternalTypedDataUint8ClampedArrayCid: | 1194 case kExternalTypedDataUint8ClampedArrayCid: |
1194 case kTypedDataInt16ArrayCid: | 1195 case kTypedDataInt16ArrayCid: |
1195 case kTypedDataUint16ArrayCid: | 1196 case kTypedDataUint16ArrayCid: |
1196 case kOneByteStringCid: | 1197 case kOneByteStringCid: |
1197 case kTwoByteStringCid: | 1198 case kTwoByteStringCid: |
| 1199 case kExternalOneByteStringCid: |
| 1200 case kExternalTwoByteStringCid: |
1198 return kTagged; | 1201 return kTagged; |
1199 case kTypedDataInt32ArrayCid: | 1202 case kTypedDataInt32ArrayCid: |
1200 return kUnboxedInt32; | 1203 return kUnboxedInt32; |
1201 case kTypedDataUint32ArrayCid: | 1204 case kTypedDataUint32ArrayCid: |
1202 return kUnboxedUint32; | 1205 return kUnboxedUint32; |
1203 case kTypedDataFloat32ArrayCid: | 1206 case kTypedDataFloat32ArrayCid: |
1204 case kTypedDataFloat64ArrayCid: | 1207 case kTypedDataFloat64ArrayCid: |
1205 return kUnboxedDouble; | 1208 return kUnboxedDouble; |
1206 case kTypedDataInt32x4ArrayCid: | 1209 case kTypedDataInt32x4ArrayCid: |
1207 return kUnboxedInt32x4; | 1210 return kUnboxedInt32x4; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1314 case kTypedDataInt8ArrayCid: | 1317 case kTypedDataInt8ArrayCid: |
1315 ASSERT(index_scale() == 1); | 1318 ASSERT(index_scale() == 1); |
1316 __ lb(result, element_address); | 1319 __ lb(result, element_address); |
1317 __ SmiTag(result); | 1320 __ SmiTag(result); |
1318 break; | 1321 break; |
1319 case kTypedDataUint8ArrayCid: | 1322 case kTypedDataUint8ArrayCid: |
1320 case kTypedDataUint8ClampedArrayCid: | 1323 case kTypedDataUint8ClampedArrayCid: |
1321 case kExternalTypedDataUint8ArrayCid: | 1324 case kExternalTypedDataUint8ArrayCid: |
1322 case kExternalTypedDataUint8ClampedArrayCid: | 1325 case kExternalTypedDataUint8ClampedArrayCid: |
1323 case kOneByteStringCid: | 1326 case kOneByteStringCid: |
| 1327 case kExternalOneByteStringCid: |
1324 ASSERT(index_scale() == 1); | 1328 ASSERT(index_scale() == 1); |
1325 __ lbu(result, element_address); | 1329 __ lbu(result, element_address); |
1326 __ SmiTag(result); | 1330 __ SmiTag(result); |
1327 break; | 1331 break; |
1328 case kTypedDataInt16ArrayCid: | 1332 case kTypedDataInt16ArrayCid: |
1329 __ lh(result, element_address); | 1333 __ lh(result, element_address); |
1330 __ SmiTag(result); | 1334 __ SmiTag(result); |
1331 break; | 1335 break; |
1332 case kTypedDataUint16ArrayCid: | 1336 case kTypedDataUint16ArrayCid: |
1333 case kTwoByteStringCid: | 1337 case kTwoByteStringCid: |
| 1338 case kExternalTwoByteStringCid: |
1334 __ lhu(result, element_address); | 1339 __ lhu(result, element_address); |
1335 __ SmiTag(result); | 1340 __ SmiTag(result); |
1336 break; | 1341 break; |
1337 default: | 1342 default: |
1338 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); | 1343 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); |
1339 __ lw(result, element_address); | 1344 __ lw(result, element_address); |
1340 break; | 1345 break; |
1341 } | 1346 } |
1342 } | 1347 } |
1343 | 1348 |
(...skipping 4375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5719 1, | 5724 1, |
5720 locs()); | 5725 locs()); |
5721 __ lw(result, Address(SP, 1 * kWordSize)); | 5726 __ lw(result, Address(SP, 1 * kWordSize)); |
5722 __ addiu(SP, SP, Immediate(2 * kWordSize)); | 5727 __ addiu(SP, SP, Immediate(2 * kWordSize)); |
5723 } | 5728 } |
5724 | 5729 |
5725 | 5730 |
5726 } // namespace dart | 5731 } // namespace dart |
5727 | 5732 |
5728 #endif // defined TARGET_ARCH_MIPS | 5733 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |