| 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 125 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 136 // Shared routine for multiple binary operations. | 136 // Shared routine for multiple binary operations. | 
| 137 static void VisitBinop(InstructionSelector* selector, Node* node, | 137 static void VisitBinop(InstructionSelector* selector, Node* node, | 
| 138                        ArchOpcode opcode, ImmediateMode operand_mode) { | 138                        ArchOpcode opcode, ImmediateMode operand_mode) { | 
| 139   FlagsContinuation cont; | 139   FlagsContinuation cont; | 
| 140   VisitBinop(selector, node, opcode, operand_mode, &cont); | 140   VisitBinop(selector, node, opcode, operand_mode, &cont); | 
| 141 } | 141 } | 
| 142 | 142 | 
| 143 | 143 | 
| 144 void InstructionSelector::VisitLoad(Node* node) { | 144 void InstructionSelector::VisitLoad(Node* node) { | 
| 145   MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); | 145   MachineType rep = RepresentationOf(OpParameter<MachineType>(node)); | 
|  | 146   MachineType typ = TypeOf(OpParameter<MachineType>(node)); | 
| 146   Arm64OperandGenerator g(this); | 147   Arm64OperandGenerator g(this); | 
| 147   Node* base = node->InputAt(0); | 148   Node* base = node->InputAt(0); | 
| 148   Node* index = node->InputAt(1); | 149   Node* index = node->InputAt(1); | 
| 149 | 150 | 
| 150   InstructionOperand* result = rep == kRepFloat64 | 151   InstructionOperand* result = rep == kRepFloat64 | 
| 151                                    ? g.DefineAsDoubleRegister(node) | 152                                    ? g.DefineAsDoubleRegister(node) | 
| 152                                    : g.DefineAsRegister(node); | 153                                    : g.DefineAsRegister(node); | 
| 153 | 154 | 
| 154   ArchOpcode opcode; | 155   ArchOpcode opcode; | 
| 155   // TODO(titzer): signed/unsigned small loads | 156   // TODO(titzer): signed/unsigned small loads | 
| 156   switch (rep) { | 157   switch (rep) { | 
| 157     case kRepFloat64: | 158     case kRepFloat64: | 
| 158       opcode = kArm64Float64Load; | 159       opcode = kArm64LdrD; | 
| 159       break; | 160       break; | 
| 160     case kRepBit:  // Fall through. | 161     case kRepBit:  // Fall through. | 
| 161     case kRepWord8: | 162     case kRepWord8: | 
| 162       opcode = kArm64LoadWord8; | 163       opcode = typ == kTypeInt32 ? kArm64Ldrsb : kArm64Ldrb; | 
| 163       break; | 164       break; | 
| 164     case kRepWord16: | 165     case kRepWord16: | 
| 165       opcode = kArm64LoadWord16; | 166       opcode = typ == kTypeInt32 ? kArm64Ldrsh : kArm64Ldrh; | 
| 166       break; | 167       break; | 
| 167     case kRepWord32: | 168     case kRepWord32: | 
| 168       opcode = kArm64LoadWord32; | 169       opcode = kArm64LdrW; | 
| 169       break; | 170       break; | 
| 170     case kRepTagged:  // Fall through. | 171     case kRepTagged:  // Fall through. | 
| 171     case kRepWord64: | 172     case kRepWord64: | 
| 172       opcode = kArm64LoadWord64; | 173       opcode = kArm64Ldr; | 
| 173       break; | 174       break; | 
| 174     default: | 175     default: | 
| 175       UNREACHABLE(); | 176       UNREACHABLE(); | 
| 176       return; | 177       return; | 
| 177   } | 178   } | 
| 178   if (g.CanBeImmediate(index, kLoadStoreImm)) { | 179   if (g.CanBeImmediate(index, kLoadStoreImm)) { | 
| 179     Emit(opcode | AddressingModeField::encode(kMode_MRI), result, | 180     Emit(opcode | AddressingModeField::encode(kMode_MRI), result, | 
| 180          g.UseRegister(base), g.UseImmediate(index)); | 181          g.UseRegister(base), g.UseImmediate(index)); | 
| 181   } else if (g.CanBeImmediate(base, kLoadStoreImm)) { |  | 
| 182     Emit(opcode | AddressingModeField::encode(kMode_MRI), result, |  | 
| 183          g.UseRegister(index), g.UseImmediate(base)); |  | 
| 184   } else { | 182   } else { | 
| 185     Emit(opcode | AddressingModeField::encode(kMode_MRR), result, | 183     Emit(opcode | AddressingModeField::encode(kMode_MRR), result, | 
| 186          g.UseRegister(base), g.UseRegister(index)); | 184          g.UseRegister(base), g.UseRegister(index)); | 
| 187   } | 185   } | 
| 188 } | 186 } | 
| 189 | 187 | 
| 190 | 188 | 
| 191 void InstructionSelector::VisitStore(Node* node) { | 189 void InstructionSelector::VisitStore(Node* node) { | 
| 192   Arm64OperandGenerator g(this); | 190   Arm64OperandGenerator g(this); | 
| 193   Node* base = node->InputAt(0); | 191   Node* base = node->InputAt(0); | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 210   DCHECK_EQ(kNoWriteBarrier, store_rep.write_barrier_kind); | 208   DCHECK_EQ(kNoWriteBarrier, store_rep.write_barrier_kind); | 
| 211   InstructionOperand* val; | 209   InstructionOperand* val; | 
| 212   if (rep == kRepFloat64) { | 210   if (rep == kRepFloat64) { | 
| 213     val = g.UseDoubleRegister(value); | 211     val = g.UseDoubleRegister(value); | 
| 214   } else { | 212   } else { | 
| 215     val = g.UseRegister(value); | 213     val = g.UseRegister(value); | 
| 216   } | 214   } | 
| 217   ArchOpcode opcode; | 215   ArchOpcode opcode; | 
| 218   switch (rep) { | 216   switch (rep) { | 
| 219     case kRepFloat64: | 217     case kRepFloat64: | 
| 220       opcode = kArm64Float64Store; | 218       opcode = kArm64StrD; | 
| 221       break; | 219       break; | 
| 222     case kRepBit:  // Fall through. | 220     case kRepBit:  // Fall through. | 
| 223     case kRepWord8: | 221     case kRepWord8: | 
| 224       opcode = kArm64StoreWord8; | 222       opcode = kArm64Strb; | 
| 225       break; | 223       break; | 
| 226     case kRepWord16: | 224     case kRepWord16: | 
| 227       opcode = kArm64StoreWord16; | 225       opcode = kArm64Strh; | 
| 228       break; | 226       break; | 
| 229     case kRepWord32: | 227     case kRepWord32: | 
| 230       opcode = kArm64StoreWord32; | 228       opcode = kArm64StrW; | 
| 231       break; | 229       break; | 
| 232     case kRepTagged:  // Fall through. | 230     case kRepTagged:  // Fall through. | 
| 233     case kRepWord64: | 231     case kRepWord64: | 
| 234       opcode = kArm64StoreWord64; | 232       opcode = kArm64Str; | 
| 235       break; | 233       break; | 
| 236     default: | 234     default: | 
| 237       UNREACHABLE(); | 235       UNREACHABLE(); | 
| 238       return; | 236       return; | 
| 239   } | 237   } | 
| 240   if (g.CanBeImmediate(index, kLoadStoreImm)) { | 238   if (g.CanBeImmediate(index, kLoadStoreImm)) { | 
| 241     Emit(opcode | AddressingModeField::encode(kMode_MRI), NULL, | 239     Emit(opcode | AddressingModeField::encode(kMode_MRI), NULL, | 
| 242          g.UseRegister(base), g.UseImmediate(index), val); | 240          g.UseRegister(base), g.UseImmediate(index), val); | 
| 243   } else if (g.CanBeImmediate(base, kLoadStoreImm)) { |  | 
| 244     Emit(opcode | AddressingModeField::encode(kMode_MRI), NULL, |  | 
| 245          g.UseRegister(index), g.UseImmediate(base), val); |  | 
| 246   } else { | 241   } else { | 
| 247     Emit(opcode | AddressingModeField::encode(kMode_MRR), NULL, | 242     Emit(opcode | AddressingModeField::encode(kMode_MRR), NULL, | 
| 248          g.UseRegister(base), g.UseRegister(index), val); | 243          g.UseRegister(base), g.UseRegister(index), val); | 
| 249   } | 244   } | 
| 250 } | 245 } | 
| 251 | 246 | 
| 252 | 247 | 
| 253 void InstructionSelector::VisitWord32And(Node* node) { | 248 void InstructionSelector::VisitWord32And(Node* node) { | 
| 254   VisitBinop(this, node, kArm64And32, kLogical32Imm); | 249   VisitBinop(this, node, kArm64And32, kLogical32Imm); | 
| 255 } | 250 } | 
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 678   // Caller clean up of stack for C-style calls. | 673   // Caller clean up of stack for C-style calls. | 
| 679   if (is_c_frame && aligned_push_count > 0) { | 674   if (is_c_frame && aligned_push_count > 0) { | 
| 680     DCHECK(deoptimization == NULL && continuation == NULL); | 675     DCHECK(deoptimization == NULL && continuation == NULL); | 
| 681     Emit(kArm64Drop | MiscField::encode(aligned_push_count), NULL); | 676     Emit(kArm64Drop | MiscField::encode(aligned_push_count), NULL); | 
| 682   } | 677   } | 
| 683 } | 678 } | 
| 684 | 679 | 
| 685 }  // namespace compiler | 680 }  // namespace compiler | 
| 686 }  // namespace internal | 681 }  // namespace internal | 
| 687 }  // namespace v8 | 682 }  // namespace v8 | 
| OLD | NEW | 
|---|