OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/instruction-selector-impl.h" | 5 #include "src/compiler/instruction-selector-impl.h" |
6 #include "src/compiler/node-matchers.h" | 6 #include "src/compiler/node-matchers.h" |
7 #include "src/compiler/node-properties.h" | 7 #include "src/compiler/node-properties.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1338 frame_state_descriptor = GetFrameStateDescriptor( | 1338 frame_state_descriptor = GetFrameStateDescriptor( |
1339 node->InputAt(static_cast<int>(descriptor->InputCount()))); | 1339 node->InputAt(static_cast<int>(descriptor->InputCount()))); |
1340 } | 1340 } |
1341 | 1341 |
1342 CallBuffer buffer(zone(), descriptor, frame_state_descriptor); | 1342 CallBuffer buffer(zone(), descriptor, frame_state_descriptor); |
1343 | 1343 |
1344 // Compute InstructionOperands for inputs and outputs. | 1344 // Compute InstructionOperands for inputs and outputs. |
1345 // TODO(turbofan): on ARM64 it's probably better to use the code object in a | 1345 // TODO(turbofan): on ARM64 it's probably better to use the code object in a |
1346 // register if there are multiple uses of it. Improve constant pool and the | 1346 // register if there are multiple uses of it. Improve constant pool and the |
1347 // heuristics in the register allocator for where to emit constants. | 1347 // heuristics in the register allocator for where to emit constants. |
1348 InitializeCallBuffer(node, &buffer, true, false); | 1348 InitializeCallBuffer(node, &buffer, true, true); |
1349 | 1349 |
1350 // Push the arguments to the stack. | 1350 // Push the arguments to the stack. |
1351 int aligned_push_count = static_cast<int>(buffer.pushed_nodes.size()); | 1351 int aligned_push_count = static_cast<int>(buffer.pushed_nodes.size()); |
1352 bool pushed_count_uneven = aligned_push_count & 1; | 1352 bool pushed_count_uneven = aligned_push_count & 1; |
1353 // TODO(dcarney): claim and poke probably take small immediates, | 1353 // TODO(dcarney): claim and poke probably take small immediates, |
1354 // loop here or whatever. | 1354 // loop here or whatever. |
1355 // Bump the stack pointer(s). | 1355 // Bump the stack pointer(s). |
1356 if (aligned_push_count > 0) { | 1356 if (aligned_push_count > 0) { |
1357 // TODO(dcarney): it would be better to bump the csp here only | 1357 // TODO(dcarney): it would be better to bump the csp here only |
1358 // and emit paired stores with increment for non c frames. | 1358 // and emit paired stores with increment for non c frames. |
(...skipping 26 matching lines...) Expand all Loading... |
1385 if (hint == IfExceptionHint::kLocallyCaught) { | 1385 if (hint == IfExceptionHint::kLocallyCaught) { |
1386 flags |= CallDescriptor::kHasLocalCatchHandler; | 1386 flags |= CallDescriptor::kHasLocalCatchHandler; |
1387 } | 1387 } |
1388 flags |= CallDescriptor::kHasExceptionHandler; | 1388 flags |= CallDescriptor::kHasExceptionHandler; |
1389 buffer.instruction_args.push_back(g.Label(handler)); | 1389 buffer.instruction_args.push_back(g.Label(handler)); |
1390 } | 1390 } |
1391 | 1391 |
1392 // Select the appropriate opcode based on the call type. | 1392 // Select the appropriate opcode based on the call type. |
1393 InstructionCode opcode; | 1393 InstructionCode opcode; |
1394 switch (descriptor->kind()) { | 1394 switch (descriptor->kind()) { |
1395 case CallDescriptor::kCallCodeObject: { | 1395 case CallDescriptor::kCallAddress: |
1396 opcode = kArchCallCodeObject; | 1396 opcode = |
| 1397 kArchCallCFunction | |
| 1398 MiscField::encode(static_cast<int>(descriptor->CParameterCount())); |
1397 break; | 1399 break; |
1398 } | 1400 case CallDescriptor::kCallCodeObject: |
| 1401 opcode = kArchCallCodeObject | MiscField::encode(flags); |
| 1402 break; |
1399 case CallDescriptor::kCallJSFunction: | 1403 case CallDescriptor::kCallJSFunction: |
1400 opcode = kArchCallJSFunction; | 1404 opcode = kArchCallJSFunction | MiscField::encode(flags); |
1401 break; | 1405 break; |
1402 default: | 1406 default: |
1403 UNREACHABLE(); | 1407 UNREACHABLE(); |
1404 return; | 1408 return; |
1405 } | 1409 } |
1406 opcode |= MiscField::encode(flags); | |
1407 | 1410 |
1408 // Emit the call instruction. | 1411 // Emit the call instruction. |
1409 size_t const output_count = buffer.outputs.size(); | 1412 size_t const output_count = buffer.outputs.size(); |
1410 auto* outputs = output_count ? &buffer.outputs.front() : nullptr; | 1413 auto* outputs = output_count ? &buffer.outputs.front() : nullptr; |
1411 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), | 1414 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), |
1412 &buffer.instruction_args.front())->MarkAsCall(); | 1415 &buffer.instruction_args.front())->MarkAsCall(); |
1413 } | 1416 } |
1414 | 1417 |
1415 | 1418 |
1416 void InstructionSelector::VisitTailCall(Node* node) { | 1419 void InstructionSelector::VisitTailCall(Node* node) { |
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2005 MachineOperatorBuilder::kFloat64RoundTruncate | | 2008 MachineOperatorBuilder::kFloat64RoundTruncate | |
2006 MachineOperatorBuilder::kFloat64RoundTiesAway | | 2009 MachineOperatorBuilder::kFloat64RoundTiesAway | |
2007 MachineOperatorBuilder::kWord32ShiftIsSafe | | 2010 MachineOperatorBuilder::kWord32ShiftIsSafe | |
2008 MachineOperatorBuilder::kInt32DivIsSafe | | 2011 MachineOperatorBuilder::kInt32DivIsSafe | |
2009 MachineOperatorBuilder::kUint32DivIsSafe; | 2012 MachineOperatorBuilder::kUint32DivIsSafe; |
2010 } | 2013 } |
2011 | 2014 |
2012 } // namespace compiler | 2015 } // namespace compiler |
2013 } // namespace internal | 2016 } // namespace internal |
2014 } // namespace v8 | 2017 } // namespace v8 |
OLD | NEW |