| 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-inl.h" | 7 #include "src/compiler/node-properties-inl.h" |
| 8 | 8 |
| 9 namespace v8 { | 9 namespace v8 { |
| 10 namespace internal { | 10 namespace internal { |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 } else { | 448 } else { |
| 449 if (g.CanBeBetterLeftOperand(right)) { | 449 if (g.CanBeBetterLeftOperand(right)) { |
| 450 std::swap(left, right); | 450 std::swap(left, right); |
| 451 } | 451 } |
| 452 Emit(kIA32Imul, g.DefineSameAsFirst(node), g.UseRegister(left), | 452 Emit(kIA32Imul, g.DefineSameAsFirst(node), g.UseRegister(left), |
| 453 g.Use(right)); | 453 g.Use(right)); |
| 454 } | 454 } |
| 455 } | 455 } |
| 456 | 456 |
| 457 | 457 |
| 458 void InstructionSelector::VisitInt32MulHigh(Node* node) { |
| 459 IA32OperandGenerator g(this); |
| 460 InstructionOperand* temps[] = {g.TempRegister(eax)}; |
| 461 size_t temp_count = arraysize(temps); |
| 462 Emit(kIA32ImulHigh, g.DefineAsFixed(node, edx), |
| 463 g.UseFixed(node->InputAt(0), eax), g.UseRegister(node->InputAt(1)), |
| 464 temp_count, temps); |
| 465 } |
| 466 |
| 467 |
| 458 static inline void VisitDiv(InstructionSelector* selector, Node* node, | 468 static inline void VisitDiv(InstructionSelector* selector, Node* node, |
| 459 ArchOpcode opcode) { | 469 ArchOpcode opcode) { |
| 460 IA32OperandGenerator g(selector); | 470 IA32OperandGenerator g(selector); |
| 461 InstructionOperand* temps[] = {g.TempRegister(edx)}; | 471 InstructionOperand* temps[] = {g.TempRegister(edx)}; |
| 462 size_t temp_count = arraysize(temps); | 472 size_t temp_count = arraysize(temps); |
| 463 selector->Emit(opcode, g.DefineAsFixed(node, eax), | 473 selector->Emit(opcode, g.DefineAsFixed(node, eax), |
| 464 g.UseFixed(node->InputAt(0), eax), | 474 g.UseFixed(node->InputAt(0), eax), |
| 465 g.UseUnique(node->InputAt(1)), temp_count, temps); | 475 g.UseUnique(node->InputAt(1)), temp_count, temps); |
| 466 } | 476 } |
| 467 | 477 |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 | 863 |
| 854 | 864 |
| 855 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { | 865 void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { |
| 856 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); | 866 FlagsContinuation cont(kUnorderedLessThanOrEqual, node); |
| 857 VisitFloat64Compare(this, node, &cont); | 867 VisitFloat64Compare(this, node, &cont); |
| 858 } | 868 } |
| 859 | 869 |
| 860 } // namespace compiler | 870 } // namespace compiler |
| 861 } // namespace internal | 871 } // namespace internal |
| 862 } // namespace v8 | 872 } // namespace v8 |
| OLD | NEW |