Chromium Code Reviews| 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "src/base/adapters.h" | 7 #include "src/base/adapters.h" |
| 8 #include "src/compiler/instruction-selector-impl.h" | 8 #include "src/compiler/instruction-selector-impl.h" |
| 9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/compiler/node-properties.h" | 10 #include "src/compiler/node-properties.h" |
| (...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1194 // Emit the call instruction. | 1194 // Emit the call instruction. |
| 1195 size_t output_count = buffer.outputs.size(); | 1195 size_t output_count = buffer.outputs.size(); |
| 1196 auto* outputs = &buffer.outputs.front(); | 1196 auto* outputs = &buffer.outputs.front(); |
| 1197 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), | 1197 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), |
| 1198 &buffer.instruction_args.front())->MarkAsCall(); | 1198 &buffer.instruction_args.front())->MarkAsCall(); |
| 1199 Emit(kArchRet, 0, nullptr, output_count, outputs); | 1199 Emit(kArchRet, 0, nullptr, output_count, outputs); |
| 1200 } | 1200 } |
| 1201 } | 1201 } |
| 1202 | 1202 |
| 1203 | 1203 |
| 1204 void InstructionSelector::VisitCallVarArgs(Node* node) { | |
| 1205 X64OperandGenerator g(this); | |
| 1206 const CallDescriptor* descriptor = OpParameter<const CallDescriptor*>(node); | |
| 1207 const int descriptor_input_count = static_cast<int>(descriptor->InputCount()); | |
| 1208 | |
| 1209 FrameStateDescriptor* frame_state_descriptor = nullptr; | |
| 1210 if (descriptor->NeedsFrameState()) { | |
| 1211 frame_state_descriptor = | |
| 1212 GetFrameStateDescriptor(node->InputAt(descriptor_input_count + 2)); | |
| 1213 } | |
| 1214 | |
| 1215 CallBuffer buffer(zone(), descriptor, frame_state_descriptor); | |
| 1216 | |
| 1217 // Compute InstructionOperands for inputs and outputs. | |
| 1218 InitializeCallBuffer(node, &buffer, true, true); | |
| 1219 | |
| 1220 // Push the arguments onto the stack. | |
| 1221 Node* args_start = node->InputAt(descriptor_input_count); | |
| 1222 Node* args_end = node->InputAt(descriptor_input_count + 1); | |
| 1223 Emit(kX64PushMultiple, g.NoOutput(), g.UseRegister(args_start), | |
|
Benedikt Meurer
2015/09/07 05:14:30
Mhm, I have mixed feelings with this, but on the o
| |
| 1224 g.UseRegister(args_end)); | |
| 1225 | |
| 1226 // Select the appropriate opcode based on the call type. | |
| 1227 CallDescriptor::Flags flags = descriptor->flags(); | |
| 1228 InstructionCode opcode; | |
| 1229 switch (descriptor->kind()) { | |
| 1230 case CallDescriptor::kCallCodeObject: | |
| 1231 opcode = kArchCallCodeObject | MiscField::encode(flags); | |
| 1232 break; | |
| 1233 case CallDescriptor::kCallJSFunction: | |
| 1234 opcode = kArchCallJSFunction | MiscField::encode(flags); | |
| 1235 break; | |
| 1236 default: | |
| 1237 UNREACHABLE(); | |
| 1238 return; | |
| 1239 } | |
| 1240 | |
| 1241 // Emit the call instruction. | |
| 1242 size_t const output_count = buffer.outputs.size(); | |
| 1243 auto* outputs = output_count ? &buffer.outputs.front() : nullptr; | |
| 1244 Emit(opcode, output_count, outputs, buffer.instruction_args.size(), | |
| 1245 &buffer.instruction_args.front())->MarkAsCall(); | |
| 1246 } | |
| 1247 | |
| 1248 | |
| 1204 namespace { | 1249 namespace { |
| 1205 | 1250 |
| 1206 // Shared routine for multiple compare operations. | 1251 // Shared routine for multiple compare operations. |
| 1207 void VisitCompare(InstructionSelector* selector, InstructionCode opcode, | 1252 void VisitCompare(InstructionSelector* selector, InstructionCode opcode, |
| 1208 InstructionOperand left, InstructionOperand right, | 1253 InstructionOperand left, InstructionOperand right, |
| 1209 FlagsContinuation* cont) { | 1254 FlagsContinuation* cont) { |
| 1210 X64OperandGenerator g(selector); | 1255 X64OperandGenerator g(selector); |
| 1211 opcode = cont->Encode(opcode); | 1256 opcode = cont->Encode(opcode); |
| 1212 if (cont->IsBranch()) { | 1257 if (cont->IsBranch()) { |
| 1213 selector->Emit(opcode, g.NoOutput(), left, right, | 1258 selector->Emit(opcode, g.NoOutput(), left, right, |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1684 if (CpuFeatures::IsSupported(SSE4_1)) { | 1729 if (CpuFeatures::IsSupported(SSE4_1)) { |
| 1685 flags |= MachineOperatorBuilder::kFloat64RoundDown | | 1730 flags |= MachineOperatorBuilder::kFloat64RoundDown | |
| 1686 MachineOperatorBuilder::kFloat64RoundTruncate; | 1731 MachineOperatorBuilder::kFloat64RoundTruncate; |
| 1687 } | 1732 } |
| 1688 return flags; | 1733 return flags; |
| 1689 } | 1734 } |
| 1690 | 1735 |
| 1691 } // namespace compiler | 1736 } // namespace compiler |
| 1692 } // namespace internal | 1737 } // namespace internal |
| 1693 } // namespace v8 | 1738 } // namespace v8 |
| OLD | NEW |