| 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 | 7 |
| 8 namespace v8 { | 8 namespace v8 { |
| 9 namespace internal { | 9 namespace internal { |
| 10 namespace compiler { | 10 namespace compiler { |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 | 129 |
| 130 // Shared routine for multiple binary operations. | 130 // Shared routine for multiple binary operations. |
| 131 static void VisitBinop(InstructionSelector* selector, Node* node, | 131 static void VisitBinop(InstructionSelector* selector, Node* node, |
| 132 ArchOpcode opcode, ImmediateMode operand_mode) { | 132 ArchOpcode opcode, ImmediateMode operand_mode) { |
| 133 FlagsContinuation cont; | 133 FlagsContinuation cont; |
| 134 VisitBinop(selector, node, opcode, operand_mode, &cont); | 134 VisitBinop(selector, node, opcode, operand_mode, &cont); |
| 135 } | 135 } |
| 136 | 136 |
| 137 | 137 |
| 138 void InstructionSelector::VisitLoad(Node* node) { | 138 void InstructionSelector::VisitLoad(Node* node) { |
| 139 MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); | 139 MachineType rep = RepresentationOf(OpParameter<LoadRepresentation>(node)); |
| 140 MachineType typ = TypeOf(OpParameter<MachineType>(node)); | 140 MachineType typ = TypeOf(OpParameter<LoadRepresentation>(node)); |
| 141 Arm64OperandGenerator g(this); | 141 Arm64OperandGenerator g(this); |
| 142 Node* base = node->InputAt(0); | 142 Node* base = node->InputAt(0); |
| 143 Node* index = node->InputAt(1); | 143 Node* index = node->InputAt(1); |
| 144 ArchOpcode opcode; | 144 ArchOpcode opcode; |
| 145 switch (rep) { | 145 switch (rep) { |
| 146 case kRepFloat32: | 146 case kRepFloat32: |
| 147 opcode = kArm64LdrS; | 147 opcode = kArm64LdrS; |
| 148 break; | 148 break; |
| 149 case kRepFloat64: | 149 case kRepFloat64: |
| 150 opcode = kArm64LdrD; | 150 opcode = kArm64LdrD; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 177 } | 177 } |
| 178 | 178 |
| 179 | 179 |
| 180 void InstructionSelector::VisitStore(Node* node) { | 180 void InstructionSelector::VisitStore(Node* node) { |
| 181 Arm64OperandGenerator g(this); | 181 Arm64OperandGenerator g(this); |
| 182 Node* base = node->InputAt(0); | 182 Node* base = node->InputAt(0); |
| 183 Node* index = node->InputAt(1); | 183 Node* index = node->InputAt(1); |
| 184 Node* value = node->InputAt(2); | 184 Node* value = node->InputAt(2); |
| 185 | 185 |
| 186 StoreRepresentation store_rep = OpParameter<StoreRepresentation>(node); | 186 StoreRepresentation store_rep = OpParameter<StoreRepresentation>(node); |
| 187 MachineType rep = RepresentationOf(store_rep.machine_type); | 187 MachineType rep = RepresentationOf(store_rep.machine_type()); |
| 188 if (store_rep.write_barrier_kind == kFullWriteBarrier) { | 188 if (store_rep.write_barrier_kind() == kFullWriteBarrier) { |
| 189 DCHECK(rep == kRepTagged); | 189 DCHECK(rep == kRepTagged); |
| 190 // TODO(dcarney): refactor RecordWrite function to take temp registers | 190 // TODO(dcarney): refactor RecordWrite function to take temp registers |
| 191 // and pass them here instead of using fixed regs | 191 // and pass them here instead of using fixed regs |
| 192 // TODO(dcarney): handle immediate indices. | 192 // TODO(dcarney): handle immediate indices. |
| 193 InstructionOperand* temps[] = {g.TempRegister(x11), g.TempRegister(x12)}; | 193 InstructionOperand* temps[] = {g.TempRegister(x11), g.TempRegister(x12)}; |
| 194 Emit(kArm64StoreWriteBarrier, NULL, g.UseFixed(base, x10), | 194 Emit(kArm64StoreWriteBarrier, NULL, g.UseFixed(base, x10), |
| 195 g.UseFixed(index, x11), g.UseFixed(value, x12), arraysize(temps), | 195 g.UseFixed(index, x11), g.UseFixed(value, x12), arraysize(temps), |
| 196 temps); | 196 temps); |
| 197 return; | 197 return; |
| 198 } | 198 } |
| 199 DCHECK_EQ(kNoWriteBarrier, store_rep.write_barrier_kind); | 199 DCHECK_EQ(kNoWriteBarrier, store_rep.write_barrier_kind()); |
| 200 ArchOpcode opcode; | 200 ArchOpcode opcode; |
| 201 switch (rep) { | 201 switch (rep) { |
| 202 case kRepFloat32: | 202 case kRepFloat32: |
| 203 opcode = kArm64StrS; | 203 opcode = kArm64StrS; |
| 204 break; | 204 break; |
| 205 case kRepFloat64: | 205 case kRepFloat64: |
| 206 opcode = kArm64StrD; | 206 opcode = kArm64StrD; |
| 207 break; | 207 break; |
| 208 case kRepBit: // Fall through. | 208 case kRepBit: // Fall through. |
| 209 case kRepWord8: | 209 case kRepWord8: |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 // Caller clean up of stack for C-style calls. | 661 // Caller clean up of stack for C-style calls. |
| 662 if (is_c_frame && aligned_push_count > 0) { | 662 if (is_c_frame && aligned_push_count > 0) { |
| 663 DCHECK(deoptimization == NULL && continuation == NULL); | 663 DCHECK(deoptimization == NULL && continuation == NULL); |
| 664 Emit(kArchDrop | MiscField::encode(aligned_push_count), NULL); | 664 Emit(kArchDrop | MiscField::encode(aligned_push_count), NULL); |
| 665 } | 665 } |
| 666 } | 666 } |
| 667 | 667 |
| 668 } // namespace compiler | 668 } // namespace compiler |
| 669 } // namespace internal | 669 } // namespace internal |
| 670 } // namespace v8 | 670 } // namespace v8 |
| OLD | NEW |