OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/crankshaft/arm64/lithium-arm64.h" | 5 #include "src/crankshaft/arm64/lithium-arm64.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/crankshaft/arm64/lithium-codegen-arm64.h" | 9 #include "src/crankshaft/arm64/lithium-codegen-arm64.h" |
10 #include "src/crankshaft/hydrogen-osr.h" | 10 #include "src/crankshaft/hydrogen-osr.h" |
(...skipping 1537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1548 LOperand* temp = TempRegister(); | 1548 LOperand* temp = TempRegister(); |
1549 return AssignEnvironment(DefineAsRegister( | 1549 return AssignEnvironment(DefineAsRegister( |
1550 new(zone()) LLoadFunctionPrototype(function, temp))); | 1550 new(zone()) LLoadFunctionPrototype(function, temp))); |
1551 } | 1551 } |
1552 | 1552 |
1553 | 1553 |
1554 LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { | 1554 LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) { |
1555 LOperand* context = UseFixed(instr->context(), cp); | 1555 LOperand* context = UseFixed(instr->context(), cp); |
1556 LOperand* global_object = | 1556 LOperand* global_object = |
1557 UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); | 1557 UseFixed(instr->global_object(), LoadDescriptor::ReceiverRegister()); |
1558 LOperand* vector = NULL; | 1558 LOperand* vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); |
1559 if (instr->HasVectorAndSlot()) { | |
1560 vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); | |
1561 } | |
1562 | 1559 |
1563 LLoadGlobalGeneric* result = | 1560 LLoadGlobalGeneric* result = |
1564 new(zone()) LLoadGlobalGeneric(context, global_object, vector); | 1561 new(zone()) LLoadGlobalGeneric(context, global_object, vector); |
1565 return MarkAsCall(DefineFixed(result, x0), instr); | 1562 return MarkAsCall(DefineFixed(result, x0), instr); |
1566 } | 1563 } |
1567 | 1564 |
1568 | 1565 |
1569 LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { | 1566 LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { |
1570 DCHECK(instr->key()->representation().IsSmiOrInteger32()); | 1567 DCHECK(instr->key()->representation().IsSmiOrInteger32()); |
1571 ElementsKind elements_kind = instr->elements_kind(); | 1568 ElementsKind elements_kind = instr->elements_kind(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1614 return result; | 1611 return result; |
1615 } | 1612 } |
1616 } | 1613 } |
1617 | 1614 |
1618 | 1615 |
1619 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { | 1616 LInstruction* LChunkBuilder::DoLoadKeyedGeneric(HLoadKeyedGeneric* instr) { |
1620 LOperand* context = UseFixed(instr->context(), cp); | 1617 LOperand* context = UseFixed(instr->context(), cp); |
1621 LOperand* object = | 1618 LOperand* object = |
1622 UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); | 1619 UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); |
1623 LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); | 1620 LOperand* key = UseFixed(instr->key(), LoadDescriptor::NameRegister()); |
1624 LOperand* vector = NULL; | 1621 LOperand* vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); |
1625 if (instr->HasVectorAndSlot()) { | |
1626 vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); | |
1627 } | |
1628 | 1622 |
1629 LInstruction* result = | 1623 LInstruction* result = |
1630 DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), | 1624 DefineFixed(new(zone()) LLoadKeyedGeneric(context, object, key, vector), |
1631 x0); | 1625 x0); |
1632 return MarkAsCall(result, instr); | 1626 return MarkAsCall(result, instr); |
1633 } | 1627 } |
1634 | 1628 |
1635 | 1629 |
1636 LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { | 1630 LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) { |
1637 LOperand* object = UseRegisterAtStart(instr->object()); | 1631 LOperand* object = UseRegisterAtStart(instr->object()); |
1638 return DefineAsRegister(new(zone()) LLoadNamedField(object)); | 1632 return DefineAsRegister(new(zone()) LLoadNamedField(object)); |
1639 } | 1633 } |
1640 | 1634 |
1641 | 1635 |
1642 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { | 1636 LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) { |
1643 LOperand* context = UseFixed(instr->context(), cp); | 1637 LOperand* context = UseFixed(instr->context(), cp); |
1644 LOperand* object = | 1638 LOperand* object = |
1645 UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); | 1639 UseFixed(instr->object(), LoadDescriptor::ReceiverRegister()); |
1646 LOperand* vector = NULL; | 1640 LOperand* vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); |
1647 if (instr->HasVectorAndSlot()) { | |
1648 vector = FixedTemp(LoadWithVectorDescriptor::VectorRegister()); | |
1649 } | |
1650 | 1641 |
1651 LInstruction* result = | 1642 LInstruction* result = |
1652 DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), x0); | 1643 DefineFixed(new(zone()) LLoadNamedGeneric(context, object, vector), x0); |
1653 return MarkAsCall(result, instr); | 1644 return MarkAsCall(result, instr); |
1654 } | 1645 } |
1655 | 1646 |
1656 | 1647 |
1657 LInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { | 1648 LInstruction* LChunkBuilder::DoLoadRoot(HLoadRoot* instr) { |
1658 return DefineAsRegister(new(zone()) LLoadRoot); | 1649 return DefineAsRegister(new(zone()) LLoadRoot); |
1659 } | 1650 } |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2239 LOperand* context = UseFixed(instr->context(), cp); | 2230 LOperand* context = UseFixed(instr->context(), cp); |
2240 LOperand* object = | 2231 LOperand* object = |
2241 UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); | 2232 UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); |
2242 LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); | 2233 LOperand* key = UseFixed(instr->key(), StoreDescriptor::NameRegister()); |
2243 LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); | 2234 LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); |
2244 | 2235 |
2245 DCHECK(instr->object()->representation().IsTagged()); | 2236 DCHECK(instr->object()->representation().IsTagged()); |
2246 DCHECK(instr->key()->representation().IsTagged()); | 2237 DCHECK(instr->key()->representation().IsTagged()); |
2247 DCHECK(instr->value()->representation().IsTagged()); | 2238 DCHECK(instr->value()->representation().IsTagged()); |
2248 | 2239 |
2249 LOperand* slot = NULL; | 2240 LOperand* slot = FixedTemp(VectorStoreICDescriptor::SlotRegister()); |
2250 LOperand* vector = NULL; | 2241 LOperand* vector = FixedTemp(VectorStoreICDescriptor::VectorRegister()); |
2251 if (instr->HasVectorAndSlot()) { | |
2252 slot = FixedTemp(VectorStoreICDescriptor::SlotRegister()); | |
2253 vector = FixedTemp(VectorStoreICDescriptor::VectorRegister()); | |
2254 } | |
2255 | 2242 |
2256 LStoreKeyedGeneric* result = new (zone()) | 2243 LStoreKeyedGeneric* result = new (zone()) |
2257 LStoreKeyedGeneric(context, object, key, value, slot, vector); | 2244 LStoreKeyedGeneric(context, object, key, value, slot, vector); |
2258 return MarkAsCall(result, instr); | 2245 return MarkAsCall(result, instr); |
2259 } | 2246 } |
2260 | 2247 |
2261 | 2248 |
2262 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { | 2249 LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { |
2263 // TODO(jbramley): It might be beneficial to allow value to be a constant in | 2250 // TODO(jbramley): It might be beneficial to allow value to be a constant in |
2264 // some cases. x64 makes use of this with FLAG_track_fields, for example. | 2251 // some cases. x64 makes use of this with FLAG_track_fields, for example. |
(...skipping 22 matching lines...) Expand all Loading... |
2287 return new(zone()) LStoreNamedField(object, value, temp0, temp1); | 2274 return new(zone()) LStoreNamedField(object, value, temp0, temp1); |
2288 } | 2275 } |
2289 | 2276 |
2290 | 2277 |
2291 LInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { | 2278 LInstruction* LChunkBuilder::DoStoreNamedGeneric(HStoreNamedGeneric* instr) { |
2292 LOperand* context = UseFixed(instr->context(), cp); | 2279 LOperand* context = UseFixed(instr->context(), cp); |
2293 LOperand* object = | 2280 LOperand* object = |
2294 UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); | 2281 UseFixed(instr->object(), StoreDescriptor::ReceiverRegister()); |
2295 LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); | 2282 LOperand* value = UseFixed(instr->value(), StoreDescriptor::ValueRegister()); |
2296 | 2283 |
2297 LOperand* slot = NULL; | 2284 LOperand* slot = FixedTemp(VectorStoreICDescriptor::SlotRegister()); |
2298 LOperand* vector = NULL; | 2285 LOperand* vector = FixedTemp(VectorStoreICDescriptor::VectorRegister()); |
2299 if (instr->HasVectorAndSlot()) { | |
2300 slot = FixedTemp(VectorStoreICDescriptor::SlotRegister()); | |
2301 vector = FixedTemp(VectorStoreICDescriptor::VectorRegister()); | |
2302 } | |
2303 | 2286 |
2304 LStoreNamedGeneric* result = | 2287 LStoreNamedGeneric* result = |
2305 new (zone()) LStoreNamedGeneric(context, object, value, slot, vector); | 2288 new (zone()) LStoreNamedGeneric(context, object, value, slot, vector); |
2306 return MarkAsCall(result, instr); | 2289 return MarkAsCall(result, instr); |
2307 } | 2290 } |
2308 | 2291 |
2309 | 2292 |
2310 LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { | 2293 LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) { |
2311 LOperand* context = UseFixed(instr->context(), cp); | 2294 LOperand* context = UseFixed(instr->context(), cp); |
2312 LOperand* left = UseFixed(instr->left(), x1); | 2295 LOperand* left = UseFixed(instr->left(), x1); |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2610 | 2593 |
2611 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 2594 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
2612 LOperand* receiver = UseRegister(instr->receiver()); | 2595 LOperand* receiver = UseRegister(instr->receiver()); |
2613 LOperand* function = UseRegister(instr->function()); | 2596 LOperand* function = UseRegister(instr->function()); |
2614 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); | 2597 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); |
2615 return AssignEnvironment(DefineAsRegister(result)); | 2598 return AssignEnvironment(DefineAsRegister(result)); |
2616 } | 2599 } |
2617 | 2600 |
2618 } // namespace internal | 2601 } // namespace internal |
2619 } // namespace v8 | 2602 } // namespace v8 |
OLD | NEW |