Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(676)

Side by Side Diff: src/compiler/arm64/instruction-selector-arm64.cc

Issue 505713002: [turbofan] Add backend support for signed loads. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix x64. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/compiler/arm64/instruction-codes-arm64.h ('k') | src/compiler/ia32/code-generator-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/compiler/arm64/instruction-codes-arm64.h ('k') | src/compiler/ia32/code-generator-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698