| 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 1215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1226 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) { | 1226 void InstructionSelector::VisitFloat32RoundTiesEven(Node* node) { |
| 1227 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToNearest)); | 1227 VisitRR(this, node, kSSEFloat32Round | MiscField::encode(kRoundToNearest)); |
| 1228 } | 1228 } |
| 1229 | 1229 |
| 1230 | 1230 |
| 1231 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { | 1231 void InstructionSelector::VisitFloat64RoundTiesEven(Node* node) { |
| 1232 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToNearest)); | 1232 VisitRR(this, node, kSSEFloat64Round | MiscField::encode(kRoundToNearest)); |
| 1233 } | 1233 } |
| 1234 | 1234 |
| 1235 | 1235 |
| 1236 void InstructionSelector::EmitPrepareArguments(NodeVector* arguments, | 1236 void InstructionSelector::EmitPrepareArguments( |
| 1237 const CallDescriptor* descriptor, | 1237 ZoneVector<PushParameter>* arguments, const CallDescriptor* descriptor, |
| 1238 Node* node) { | 1238 Node* node) { |
| 1239 X64OperandGenerator g(this); | 1239 X64OperandGenerator g(this); |
| 1240 | 1240 |
| 1241 // Prepare for C function call. | 1241 // Prepare for C function call. |
| 1242 if (descriptor->IsCFunctionCall()) { | 1242 if (descriptor->IsCFunctionCall()) { |
| 1243 Emit(kArchPrepareCallCFunction | | 1243 Emit(kArchPrepareCallCFunction | |
| 1244 MiscField::encode(static_cast<int>(descriptor->CParameterCount())), | 1244 MiscField::encode(static_cast<int>(descriptor->CParameterCount())), |
| 1245 0, nullptr, 0, nullptr); | 1245 0, nullptr, 0, nullptr); |
| 1246 | 1246 |
| 1247 // Poke any stack arguments. | 1247 // Poke any stack arguments. |
| 1248 for (size_t n = 0; n < arguments->size(); ++n) { | 1248 for (size_t n = 0; n < arguments->size(); ++n) { |
| 1249 if (Node* input = (*arguments)[n]) { | 1249 PushParameter input = (*arguments)[n]; |
| 1250 if (input.node()) { |
| 1250 int slot = static_cast<int>(n); | 1251 int slot = static_cast<int>(n); |
| 1251 InstructionOperand value = g.CanBeImmediate(input) | 1252 InstructionOperand value = g.CanBeImmediate(input.node()) |
| 1252 ? g.UseImmediate(input) | 1253 ? g.UseImmediate(input.node()) |
| 1253 : g.UseRegister(input); | 1254 : g.UseRegister(input.node()); |
| 1254 Emit(kX64Poke | MiscField::encode(slot), g.NoOutput(), value); | 1255 Emit(kX64Poke | MiscField::encode(slot), g.NoOutput(), value); |
| 1255 } | 1256 } |
| 1256 } | 1257 } |
| 1257 } else { | 1258 } else { |
| 1258 // Push any stack arguments. | 1259 // Push any stack arguments. |
| 1259 for (Node* input : base::Reversed(*arguments)) { | 1260 for (PushParameter input : base::Reversed(*arguments)) { |
| 1260 // TODO(titzer): X64Push cannot handle stack->stack double moves | 1261 // TODO(titzer): X64Push cannot handle stack->stack double moves |
| 1261 // because there is no way to encode fixed double slots. | 1262 // because there is no way to encode fixed double slots. |
| 1262 InstructionOperand value = | 1263 InstructionOperand value = |
| 1263 g.CanBeImmediate(input) | 1264 g.CanBeImmediate(input.node()) |
| 1264 ? g.UseImmediate(input) | 1265 ? g.UseImmediate(input.node()) |
| 1265 : IsSupported(ATOM) || | 1266 : IsSupported(ATOM) || |
| 1266 sequence()->IsFloat(GetVirtualRegister(input)) | 1267 sequence()->IsFloat(GetVirtualRegister(input.node())) |
| 1267 ? g.UseRegister(input) | 1268 ? g.UseRegister(input.node()) |
| 1268 : g.Use(input); | 1269 : g.Use(input.node()); |
| 1269 Emit(kX64Push, g.NoOutput(), value); | 1270 Emit(kX64Push, g.NoOutput(), value); |
| 1270 } | 1271 } |
| 1271 } | 1272 } |
| 1272 } | 1273 } |
| 1273 | 1274 |
| 1274 | 1275 |
| 1275 bool InstructionSelector::IsTailCallAddressImmediate() { return true; } | 1276 bool InstructionSelector::IsTailCallAddressImmediate() { return true; } |
| 1276 | 1277 |
| 1277 | 1278 |
| 1278 namespace { | 1279 namespace { |
| (...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1769 MachineOperatorBuilder::kFloat64RoundTruncate | | 1770 MachineOperatorBuilder::kFloat64RoundTruncate | |
| 1770 MachineOperatorBuilder::kFloat32RoundTiesEven | | 1771 MachineOperatorBuilder::kFloat32RoundTiesEven | |
| 1771 MachineOperatorBuilder::kFloat64RoundTiesEven; | 1772 MachineOperatorBuilder::kFloat64RoundTiesEven; |
| 1772 } | 1773 } |
| 1773 return flags; | 1774 return flags; |
| 1774 } | 1775 } |
| 1775 | 1776 |
| 1776 } // namespace compiler | 1777 } // namespace compiler |
| 1777 } // namespace internal | 1778 } // namespace internal |
| 1778 } // namespace v8 | 1779 } // namespace v8 |
| OLD | NEW |