| 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 |