OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_MIPS | 7 #if V8_TARGET_ARCH_MIPS |
8 | 8 |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/ic-inl.h" | 10 #include "src/ic-inl.h" |
(...skipping 1266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1277 Register* StoreStubCompiler::registers() { | 1277 Register* StoreStubCompiler::registers() { |
1278 // receiver, name, scratch1, scratch2, scratch3. | 1278 // receiver, name, scratch1, scratch2, scratch3. |
1279 Register receiver = StoreIC::ReceiverRegister(); | 1279 Register receiver = StoreIC::ReceiverRegister(); |
1280 Register name = StoreIC::NameRegister(); | 1280 Register name = StoreIC::NameRegister(); |
1281 static Register registers[] = { receiver, name, a3, t0, t1 }; | 1281 static Register registers[] = { receiver, name, a3, t0, t1 }; |
1282 return registers; | 1282 return registers; |
1283 } | 1283 } |
1284 | 1284 |
1285 | 1285 |
1286 Register* KeyedStoreStubCompiler::registers() { | 1286 Register* KeyedStoreStubCompiler::registers() { |
1287 // receiver, name, scratch1, scratch2, scratch3. | 1287 // receiver, name, scratch1/map, scratch2, scratch3. |
1288 Register receiver = KeyedStoreIC::ReceiverRegister(); | 1288 Register receiver = KeyedStoreIC::ReceiverRegister(); |
1289 Register name = KeyedStoreIC::NameRegister(); | 1289 Register name = KeyedStoreIC::NameRegister(); |
1290 static Register registers[] = { receiver, name, a3, t0, t1 }; | 1290 Register map = KeyedStoreIC::MapRegister(); |
| 1291 static Register registers[] = { receiver, name, map, t0, t1 }; |
1291 return registers; | 1292 return registers; |
1292 } | 1293 } |
1293 | 1294 |
1294 | 1295 |
1295 #undef __ | 1296 #undef __ |
1296 #define __ ACCESS_MASM(masm) | 1297 #define __ ACCESS_MASM(masm) |
1297 | 1298 |
1298 | 1299 |
1299 void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, | 1300 void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, |
1300 Handle<HeapType> type, | 1301 Handle<HeapType> type, |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1380 if (check == PROPERTY && | 1381 if (check == PROPERTY && |
1381 (kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) { | 1382 (kind() == Code::KEYED_LOAD_IC || kind() == Code::KEYED_STORE_IC)) { |
1382 __ Branch(&miss, ne, this->name(), Operand(name)); | 1383 __ Branch(&miss, ne, this->name(), Operand(name)); |
1383 } | 1384 } |
1384 | 1385 |
1385 Label number_case; | 1386 Label number_case; |
1386 Register match = scratch1(); | 1387 Register match = scratch1(); |
1387 Label* smi_target = IncludesNumberType(types) ? &number_case : &miss; | 1388 Label* smi_target = IncludesNumberType(types) ? &number_case : &miss; |
1388 __ JumpIfSmi(receiver(), smi_target, match); // Reg match is 0 if Smi. | 1389 __ JumpIfSmi(receiver(), smi_target, match); // Reg match is 0 if Smi. |
1389 | 1390 |
| 1391 // Polymorphic keyed stores may use the map register |
1390 Register map_reg = scratch2(); | 1392 Register map_reg = scratch2(); |
| 1393 ASSERT(kind() != Code::KEYED_STORE_IC || |
| 1394 map_reg.is(KeyedStoreIC::MapRegister())); |
1391 | 1395 |
1392 int receiver_count = types->length(); | 1396 int receiver_count = types->length(); |
1393 int number_of_handled_maps = 0; | 1397 int number_of_handled_maps = 0; |
1394 __ lw(map_reg, FieldMemOperand(receiver(), HeapObject::kMapOffset)); | 1398 __ lw(map_reg, FieldMemOperand(receiver(), HeapObject::kMapOffset)); |
1395 for (int current = 0; current < receiver_count; ++current) { | 1399 for (int current = 0; current < receiver_count; ++current) { |
1396 Handle<HeapType> type = types->at(current); | 1400 Handle<HeapType> type = types->at(current); |
1397 Handle<Map> map = IC::TypeToMap(*type, isolate()); | 1401 Handle<Map> map = IC::TypeToMap(*type, isolate()); |
1398 if (!map->is_deprecated()) { | 1402 if (!map->is_deprecated()) { |
1399 number_of_handled_maps++; | 1403 number_of_handled_maps++; |
1400 // Check map and tail call if there's a match. | 1404 // Check map and tail call if there's a match. |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1494 | 1498 |
1495 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); | 1499 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); |
1496 } | 1500 } |
1497 | 1501 |
1498 | 1502 |
1499 #undef __ | 1503 #undef __ |
1500 | 1504 |
1501 } } // namespace v8::internal | 1505 } } // namespace v8::internal |
1502 | 1506 |
1503 #endif // V8_TARGET_ARCH_MIPS | 1507 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |