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/assembler-inl.h" | 5 #include "src/assembler-inl.h" |
6 #include "src/compiler/instruction-selector-impl.h" | 6 #include "src/compiler/instruction-selector-impl.h" |
7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 2649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2660 case MachineRepresentation::kWord16: | 2660 case MachineRepresentation::kWord16: |
2661 opcode = load_rep.IsSigned() ? kAtomicLoadInt16 : kAtomicLoadUint16; | 2661 opcode = load_rep.IsSigned() ? kAtomicLoadInt16 : kAtomicLoadUint16; |
2662 break; | 2662 break; |
2663 case MachineRepresentation::kWord32: | 2663 case MachineRepresentation::kWord32: |
2664 opcode = kAtomicLoadWord32; | 2664 opcode = kAtomicLoadWord32; |
2665 break; | 2665 break; |
2666 default: | 2666 default: |
2667 UNREACHABLE(); | 2667 UNREACHABLE(); |
2668 return; | 2668 return; |
2669 } | 2669 } |
2670 Emit(opcode | AddressingModeField::encode(kMode_MRR), | 2670 InstructionOperand inputs[] = {g.UseRegister(base), g.UseRegister(index)}; |
2671 g.DefineAsRegister(node), g.UseRegister(base), g.UseRegister(index)); | 2671 InstructionOperand outputs[] = {g.DefineAsRegister(node)}; |
| 2672 InstructionOperand temps[] = {g.TempRegister()}; |
| 2673 InstructionCode code = opcode | AddressingModeField::encode(kMode_MRR); |
| 2674 Emit(code, arraysize(outputs), outputs, arraysize(inputs), inputs, |
| 2675 arraysize(temps), temps); |
2672 } | 2676 } |
2673 | 2677 |
2674 void InstructionSelector::VisitAtomicStore(Node* node) { | 2678 void InstructionSelector::VisitAtomicStore(Node* node) { |
2675 MachineRepresentation rep = AtomicStoreRepresentationOf(node->op()); | 2679 MachineRepresentation rep = AtomicStoreRepresentationOf(node->op()); |
2676 Arm64OperandGenerator g(this); | 2680 Arm64OperandGenerator g(this); |
2677 Node* base = node->InputAt(0); | 2681 Node* base = node->InputAt(0); |
2678 Node* index = node->InputAt(1); | 2682 Node* index = node->InputAt(1); |
2679 Node* value = node->InputAt(2); | 2683 Node* value = node->InputAt(2); |
2680 ArchOpcode opcode = kArchNop; | 2684 ArchOpcode opcode = kArchNop; |
2681 switch (rep) { | 2685 switch (rep) { |
(...skipping 11 matching lines...) Expand all Loading... |
2693 return; | 2697 return; |
2694 } | 2698 } |
2695 | 2699 |
2696 AddressingMode addressing_mode = kMode_MRR; | 2700 AddressingMode addressing_mode = kMode_MRR; |
2697 InstructionOperand inputs[3]; | 2701 InstructionOperand inputs[3]; |
2698 size_t input_count = 0; | 2702 size_t input_count = 0; |
2699 inputs[input_count++] = g.UseUniqueRegister(base); | 2703 inputs[input_count++] = g.UseUniqueRegister(base); |
2700 inputs[input_count++] = g.UseUniqueRegister(index); | 2704 inputs[input_count++] = g.UseUniqueRegister(index); |
2701 inputs[input_count++] = g.UseUniqueRegister(value); | 2705 inputs[input_count++] = g.UseUniqueRegister(value); |
2702 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); | 2706 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); |
2703 Emit(code, 0, nullptr, input_count, inputs); | 2707 InstructionOperand temps[] = {g.TempRegister()}; |
| 2708 Emit(code, 0, nullptr, input_count, inputs, arraysize(temps), temps); |
2704 } | 2709 } |
2705 | 2710 |
2706 void InstructionSelector::VisitAtomicExchange(Node* node) { | 2711 void InstructionSelector::VisitAtomicExchange(Node* node) { |
2707 Arm64OperandGenerator g(this); | 2712 Arm64OperandGenerator g(this); |
2708 Node* base = node->InputAt(0); | 2713 Node* base = node->InputAt(0); |
2709 Node* index = node->InputAt(1); | 2714 Node* index = node->InputAt(1); |
2710 Node* value = node->InputAt(2); | 2715 Node* value = node->InputAt(2); |
2711 ArchOpcode opcode = kArchNop; | 2716 ArchOpcode opcode = kArchNop; |
2712 MachineType type = AtomicExchangeRepresentationOf(node->op()); | 2717 MachineType type = AtomicExchangeRepresentationOf(node->op()); |
2713 if (type == MachineType::Int8()) { | 2718 if (type == MachineType::Int8()) { |
(...skipping 12 matching lines...) Expand all Loading... |
2726 } | 2731 } |
2727 | 2732 |
2728 AddressingMode addressing_mode = kMode_MRR; | 2733 AddressingMode addressing_mode = kMode_MRR; |
2729 InstructionOperand inputs[3]; | 2734 InstructionOperand inputs[3]; |
2730 size_t input_count = 0; | 2735 size_t input_count = 0; |
2731 inputs[input_count++] = g.UseUniqueRegister(base); | 2736 inputs[input_count++] = g.UseUniqueRegister(base); |
2732 inputs[input_count++] = g.UseUniqueRegister(index); | 2737 inputs[input_count++] = g.UseUniqueRegister(index); |
2733 inputs[input_count++] = g.UseUniqueRegister(value); | 2738 inputs[input_count++] = g.UseUniqueRegister(value); |
2734 InstructionOperand outputs[1]; | 2739 InstructionOperand outputs[1]; |
2735 outputs[0] = g.UseUniqueRegister(node); | 2740 outputs[0] = g.UseUniqueRegister(node); |
2736 InstructionOperand temp[2]; | 2741 InstructionOperand temps[] = {g.TempRegister()}; |
2737 temp[0] = g.TempRegister(); | |
2738 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); | 2742 InstructionCode code = opcode | AddressingModeField::encode(addressing_mode); |
2739 Emit(code, 1, outputs, input_count, inputs, 1, temp); | 2743 Emit(code, 1, outputs, input_count, inputs, arraysize(temps), temps); |
2740 } | 2744 } |
2741 | 2745 |
2742 void InstructionSelector::VisitAtomicCompareExchange(Node* node) { | 2746 void InstructionSelector::VisitAtomicCompareExchange(Node* node) { |
2743 Arm64OperandGenerator g(this); | 2747 Arm64OperandGenerator g(this); |
2744 Node* base = node->InputAt(0); | 2748 Node* base = node->InputAt(0); |
2745 Node* index = node->InputAt(1); | 2749 Node* index = node->InputAt(1); |
2746 Node* old_value = node->InputAt(2); | 2750 Node* old_value = node->InputAt(2); |
2747 Node* new_value = node->InputAt(3); | 2751 Node* new_value = node->InputAt(3); |
2748 ArchOpcode opcode = kArchNop; | 2752 ArchOpcode opcode = kArchNop; |
2749 MachineType type = AtomicCompareExchangeRepresentationOf(node->op()); | 2753 MachineType type = AtomicCompareExchangeRepresentationOf(node->op()); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2800 // static | 2804 // static |
2801 MachineOperatorBuilder::AlignmentRequirements | 2805 MachineOperatorBuilder::AlignmentRequirements |
2802 InstructionSelector::AlignmentRequirements() { | 2806 InstructionSelector::AlignmentRequirements() { |
2803 return MachineOperatorBuilder::AlignmentRequirements:: | 2807 return MachineOperatorBuilder::AlignmentRequirements:: |
2804 FullUnalignedAccessSupport(); | 2808 FullUnalignedAccessSupport(); |
2805 } | 2809 } |
2806 | 2810 |
2807 } // namespace compiler | 2811 } // namespace compiler |
2808 } // namespace internal | 2812 } // namespace internal |
2809 } // namespace v8 | 2813 } // namespace v8 |
OLD | NEW |