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

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

Issue 2244373002: s390: Allow larger Operands/Displacements/Offsets in s390 (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 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
« no previous file with comments | « src/compiler/s390/instruction-codes-s390.h ('k') | src/s390/assembler-s390.h » ('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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/base/adapters.h" 5 #include "src/base/adapters.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 #include "src/s390/frames-s390.h" 9 #include "src/s390/frames-s390.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 namespace compiler { 13 namespace compiler {
14 14
15 enum ImmediateMode { 15 enum ImmediateMode {
16 kInt16Imm,
17 kInt16Imm_Unsigned,
18 kInt16Imm_Negate,
19 kInt16Imm_4ByteAligned,
20 kShift32Imm, 16 kShift32Imm,
21 kShift64Imm, 17 kShift64Imm,
18 kInt32Imm,
19 kInt32Imm_Negate,
20 kUint32Imm,
21 kInt20Imm,
22 kNoImmediate 22 kNoImmediate
23 }; 23 };
24 24
25 // Adds S390-specific methods for generating operands. 25 // Adds S390-specific methods for generating operands.
26 class S390OperandGenerator final : public OperandGenerator { 26 class S390OperandGenerator final : public OperandGenerator {
27 public: 27 public:
28 explicit S390OperandGenerator(InstructionSelector* selector) 28 explicit S390OperandGenerator(InstructionSelector* selector)
29 : OperandGenerator(selector) {} 29 : OperandGenerator(selector) {}
30 30
31 InstructionOperand UseOperand(Node* node, ImmediateMode mode) { 31 InstructionOperand UseOperand(Node* node, ImmediateMode mode) {
32 if (CanBeImmediate(node, mode)) { 32 if (CanBeImmediate(node, mode)) {
33 return UseImmediate(node); 33 return UseImmediate(node);
34 } 34 }
35 return UseRegister(node); 35 return UseRegister(node);
36 } 36 }
37 37
38 bool CanBeImmediate(Node* node, ImmediateMode mode) { 38 bool CanBeImmediate(Node* node, ImmediateMode mode) {
39 int64_t value; 39 int64_t value;
40 if (node->opcode() == IrOpcode::kInt32Constant) 40 if (node->opcode() == IrOpcode::kInt32Constant)
41 value = OpParameter<int32_t>(node); 41 value = OpParameter<int32_t>(node);
42 else if (node->opcode() == IrOpcode::kInt64Constant) 42 else if (node->opcode() == IrOpcode::kInt64Constant)
43 value = OpParameter<int64_t>(node); 43 value = OpParameter<int64_t>(node);
44 else 44 else
45 return false; 45 return false;
46 return CanBeImmediate(value, mode); 46 return CanBeImmediate(value, mode);
47 } 47 }
48 48
49 bool CanBeImmediate(int64_t value, ImmediateMode mode) { 49 bool CanBeImmediate(int64_t value, ImmediateMode mode) {
50 switch (mode) { 50 switch (mode) {
51 case kInt16Imm:
52 return is_int16(value);
53 case kInt16Imm_Unsigned:
54 return is_uint16(value);
55 case kInt16Imm_Negate:
56 return is_int16(-value);
57 case kInt16Imm_4ByteAligned:
58 return is_int16(value) && !(value & 3);
59 case kShift32Imm: 51 case kShift32Imm:
60 return 0 <= value && value < 32; 52 return 0 <= value && value < 32;
61 case kShift64Imm: 53 case kShift64Imm:
62 return 0 <= value && value < 64; 54 return 0 <= value && value < 64;
55 case kInt32Imm:
56 return is_int32(value);
57 case kInt32Imm_Negate:
58 return is_int32(-value);
59 case kUint32Imm:
60 return is_uint32(value);
61 case kInt20Imm:
62 return is_int20(value);
63 case kNoImmediate: 63 case kNoImmediate:
64 return false; 64 return false;
65 } 65 }
66 return false; 66 return false;
67 } 67 }
68
69 AddressingMode GenerateMemoryOperandInputs(Node* index, Node* base,
70 Node* displacement,
71 DisplacementMode displacement_mode,
72 InstructionOperand inputs[],
73 size_t* input_count) {
74 AddressingMode mode = kMode_MRI;
75 if (base != nullptr) {
76 inputs[(*input_count)++] = UseRegister(base);
77 if (index != nullptr) {
78 inputs[(*input_count)++] = UseRegister(index);
79 if (displacement != nullptr) {
80 inputs[(*input_count)++] = displacement_mode
81 ? UseNegatedImmediate(displacement)
82 : UseImmediate(displacement);
83 mode = kMode_MRRI;
84 } else {
85 mode = kMode_MRR;
86 }
87 } else {
88 if (displacement == nullptr) {
89 mode = kMode_MR;
90 } else {
91 inputs[(*input_count)++] = displacement_mode == kNegativeDisplacement
92 ? UseNegatedImmediate(displacement)
93 : UseImmediate(displacement);
94 mode = kMode_MRI;
95 }
96 }
97 } else {
98 DCHECK_NOT_NULL(index);
99 inputs[(*input_count)++] = UseRegister(index);
100 if (displacement != nullptr) {
101 inputs[(*input_count)++] = displacement_mode == kNegativeDisplacement
102 ? UseNegatedImmediate(displacement)
103 : UseImmediate(displacement);
104 mode = kMode_MRI;
105 } else {
106 mode = kMode_MR;
107 }
108 }
109 return mode;
110 }
111
112 AddressingMode GetEffectiveAddressMemoryOperand(Node* operand,
113 InstructionOperand inputs[],
114 size_t* input_count) {
115 #if V8_TARGET_ARCH_S390X
116 BaseWithIndexAndDisplacement64Matcher m(operand,
117 AddressOption::kAllowInputSwap);
118 #else
119 BaseWithIndexAndDisplacement32Matcher m(operand,
120 AddressOption::kAllowInputSwap);
121 #endif
122 DCHECK(m.matches());
123 if ((m.displacement() == nullptr ||
124 CanBeImmediate(m.displacement(), kInt20Imm))) {
125 DCHECK(m.scale() == 0);
126 return GenerateMemoryOperandInputs(m.index(), m.base(), m.displacement(),
127 m.displacement_mode(), inputs,
128 input_count);
129 } else {
130 inputs[(*input_count)++] = UseRegister(operand->InputAt(0));
131 inputs[(*input_count)++] = UseRegister(operand->InputAt(1));
132 return kMode_MRR;
133 }
134 }
68 }; 135 };
69 136
70 namespace { 137 namespace {
71 138
72 void VisitRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) { 139 void VisitRR(InstructionSelector* selector, ArchOpcode opcode, Node* node) {
73 S390OperandGenerator g(selector); 140 S390OperandGenerator g(selector);
74 selector->Emit(opcode, g.DefineAsRegister(node), 141 selector->Emit(opcode, g.DefineAsRegister(node),
75 g.UseRegister(node->InputAt(0))); 142 g.UseRegister(node->InputAt(0)));
76 } 143 }
77 144
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 ImmediateMode operand_mode) { 227 ImmediateMode operand_mode) {
161 FlagsContinuation cont; 228 FlagsContinuation cont;
162 VisitBinop<Matcher>(selector, node, opcode, operand_mode, &cont); 229 VisitBinop<Matcher>(selector, node, opcode, operand_mode, &cont);
163 } 230 }
164 231
165 } // namespace 232 } // namespace
166 233
167 void InstructionSelector::VisitLoad(Node* node) { 234 void InstructionSelector::VisitLoad(Node* node) {
168 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); 235 LoadRepresentation load_rep = LoadRepresentationOf(node->op());
169 S390OperandGenerator g(this); 236 S390OperandGenerator g(this);
170 Node* base = node->InputAt(0);
171 Node* offset = node->InputAt(1);
172 ArchOpcode opcode = kArchNop; 237 ArchOpcode opcode = kArchNop;
173 ImmediateMode mode = kInt16Imm;
174 switch (load_rep.representation()) { 238 switch (load_rep.representation()) {
175 case MachineRepresentation::kFloat32: 239 case MachineRepresentation::kFloat32:
176 opcode = kS390_LoadFloat32; 240 opcode = kS390_LoadFloat32;
177 break; 241 break;
178 case MachineRepresentation::kFloat64: 242 case MachineRepresentation::kFloat64:
179 opcode = kS390_LoadDouble; 243 opcode = kS390_LoadDouble;
180 break; 244 break;
181 case MachineRepresentation::kBit: // Fall through. 245 case MachineRepresentation::kBit: // Fall through.
182 case MachineRepresentation::kWord8: 246 case MachineRepresentation::kWord8:
183 opcode = load_rep.IsSigned() ? kS390_LoadWordS8 : kS390_LoadWordU8; 247 opcode = load_rep.IsSigned() ? kS390_LoadWordS8 : kS390_LoadWordU8;
184 break; 248 break;
185 case MachineRepresentation::kWord16: 249 case MachineRepresentation::kWord16:
186 opcode = load_rep.IsSigned() ? kS390_LoadWordS16 : kS390_LoadWordU16; 250 opcode = load_rep.IsSigned() ? kS390_LoadWordS16 : kS390_LoadWordU16;
187 break; 251 break;
188 #if !V8_TARGET_ARCH_S390X 252 #if !V8_TARGET_ARCH_S390X
189 case MachineRepresentation::kTagged: // Fall through. 253 case MachineRepresentation::kTagged: // Fall through.
190 #endif 254 #endif
191 case MachineRepresentation::kWord32: 255 case MachineRepresentation::kWord32:
192 opcode = kS390_LoadWordU32; 256 opcode = kS390_LoadWordU32;
193 break; 257 break;
194 #if V8_TARGET_ARCH_S390X 258 #if V8_TARGET_ARCH_S390X
195 case MachineRepresentation::kTagged: // Fall through. 259 case MachineRepresentation::kTagged: // Fall through.
196 case MachineRepresentation::kWord64: 260 case MachineRepresentation::kWord64:
197 opcode = kS390_LoadWord64; 261 opcode = kS390_LoadWord64;
198 mode = kInt16Imm_4ByteAligned;
199 break; 262 break;
200 #else 263 #else
201 case MachineRepresentation::kWord64: // Fall through. 264 case MachineRepresentation::kWord64: // Fall through.
202 #endif 265 #endif
203 case MachineRepresentation::kSimd128: // Fall through. 266 case MachineRepresentation::kSimd128: // Fall through.
204 case MachineRepresentation::kNone: 267 case MachineRepresentation::kNone:
205 UNREACHABLE(); 268 UNREACHABLE();
206 return; 269 return;
207 } 270 }
208 if (g.CanBeImmediate(offset, mode)) { 271 InstructionOperand outputs[1];
209 Emit(opcode | AddressingModeField::encode(kMode_MRI), 272 outputs[0] = g.DefineAsRegister(node);
210 g.DefineAsRegister(node), g.UseRegister(base), g.UseImmediate(offset)); 273 InstructionOperand inputs[3];
211 } else if (g.CanBeImmediate(base, mode)) { 274 size_t input_count = 0;
212 Emit(opcode | AddressingModeField::encode(kMode_MRI), 275 AddressingMode mode =
213 g.DefineAsRegister(node), g.UseRegister(offset), g.UseImmediate(base)); 276 g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count);
214 } else { 277 InstructionCode code = opcode | AddressingModeField::encode(mode);
215 Emit(opcode | AddressingModeField::encode(kMode_MRR), 278 Emit(code, 1, outputs, input_count, inputs);
216 g.DefineAsRegister(node), g.UseRegister(base), g.UseRegister(offset));
217 }
218 } 279 }
219 280
220 void InstructionSelector::VisitStore(Node* node) { 281 void InstructionSelector::VisitStore(Node* node) {
221 S390OperandGenerator g(this); 282 S390OperandGenerator g(this);
222 Node* base = node->InputAt(0); 283 Node* base = node->InputAt(0);
223 Node* offset = node->InputAt(1); 284 Node* offset = node->InputAt(1);
224 Node* value = node->InputAt(2); 285 Node* value = node->InputAt(2);
225 286
226 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); 287 StoreRepresentation store_rep = StoreRepresentationOf(node->op());
227 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); 288 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
228 MachineRepresentation rep = store_rep.representation(); 289 MachineRepresentation rep = store_rep.representation();
229 290
230 if (write_barrier_kind != kNoWriteBarrier) { 291 if (write_barrier_kind != kNoWriteBarrier) {
231 DCHECK_EQ(MachineRepresentation::kTagged, rep); 292 DCHECK_EQ(MachineRepresentation::kTagged, rep);
232 AddressingMode addressing_mode; 293 AddressingMode addressing_mode;
233 InstructionOperand inputs[3]; 294 InstructionOperand inputs[3];
234 size_t input_count = 0; 295 size_t input_count = 0;
235 inputs[input_count++] = g.UseUniqueRegister(base); 296 inputs[input_count++] = g.UseUniqueRegister(base);
236 // OutOfLineRecordWrite uses the offset in an 'AddP' instruction as well as 297 // OutOfLineRecordWrite uses the offset in an 'AddP' instruction as well as
237 // for the store itself, so we must check compatibility with both. 298 // for the store itself, so we must check compatibility with both.
238 if (g.CanBeImmediate(offset, kInt16Imm) 299 if (g.CanBeImmediate(offset, kInt20Imm)) {
239 #if V8_TARGET_ARCH_S390X
240 && g.CanBeImmediate(offset, kInt16Imm_4ByteAligned)
241 #endif
242 ) {
243 inputs[input_count++] = g.UseImmediate(offset); 300 inputs[input_count++] = g.UseImmediate(offset);
244 addressing_mode = kMode_MRI; 301 addressing_mode = kMode_MRI;
245 } else { 302 } else {
246 inputs[input_count++] = g.UseUniqueRegister(offset); 303 inputs[input_count++] = g.UseUniqueRegister(offset);
247 addressing_mode = kMode_MRR; 304 addressing_mode = kMode_MRR;
248 } 305 }
249 inputs[input_count++] = g.UseUniqueRegister(value); 306 inputs[input_count++] = g.UseUniqueRegister(value);
250 RecordWriteMode record_write_mode = RecordWriteMode::kValueIsAny; 307 RecordWriteMode record_write_mode = RecordWriteMode::kValueIsAny;
251 switch (write_barrier_kind) { 308 switch (write_barrier_kind) {
252 case kNoWriteBarrier: 309 case kNoWriteBarrier:
(...skipping 10 matching lines...) Expand all
263 break; 320 break;
264 } 321 }
265 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()}; 322 InstructionOperand temps[] = {g.TempRegister(), g.TempRegister()};
266 size_t const temp_count = arraysize(temps); 323 size_t const temp_count = arraysize(temps);
267 InstructionCode code = kArchStoreWithWriteBarrier; 324 InstructionCode code = kArchStoreWithWriteBarrier;
268 code |= AddressingModeField::encode(addressing_mode); 325 code |= AddressingModeField::encode(addressing_mode);
269 code |= MiscField::encode(static_cast<int>(record_write_mode)); 326 code |= MiscField::encode(static_cast<int>(record_write_mode));
270 Emit(code, 0, nullptr, input_count, inputs, temp_count, temps); 327 Emit(code, 0, nullptr, input_count, inputs, temp_count, temps);
271 } else { 328 } else {
272 ArchOpcode opcode = kArchNop; 329 ArchOpcode opcode = kArchNop;
273 ImmediateMode mode = kInt16Imm;
274 NodeMatcher m(value); 330 NodeMatcher m(value);
275 switch (rep) { 331 switch (rep) {
276 case MachineRepresentation::kFloat32: 332 case MachineRepresentation::kFloat32:
277 opcode = kS390_StoreFloat32; 333 opcode = kS390_StoreFloat32;
278 break; 334 break;
279 case MachineRepresentation::kFloat64: 335 case MachineRepresentation::kFloat64:
280 opcode = kS390_StoreDouble; 336 opcode = kS390_StoreDouble;
281 break; 337 break;
282 case MachineRepresentation::kBit: // Fall through. 338 case MachineRepresentation::kBit: // Fall through.
283 case MachineRepresentation::kWord8: 339 case MachineRepresentation::kWord8:
284 opcode = kS390_StoreWord8; 340 opcode = kS390_StoreWord8;
285 break; 341 break;
286 case MachineRepresentation::kWord16: 342 case MachineRepresentation::kWord16:
287 opcode = kS390_StoreWord16; 343 opcode = kS390_StoreWord16;
288 break; 344 break;
289 #if !V8_TARGET_ARCH_S390X 345 #if !V8_TARGET_ARCH_S390X
290 case MachineRepresentation::kTagged: // Fall through. 346 case MachineRepresentation::kTagged: // Fall through.
291 #endif 347 #endif
292 case MachineRepresentation::kWord32: 348 case MachineRepresentation::kWord32:
293 opcode = kS390_StoreWord32; 349 opcode = kS390_StoreWord32;
294 if (m.IsWord32ReverseBytes()) { 350 if (m.IsWord32ReverseBytes()) {
295 opcode = kS390_StoreReverse32; 351 opcode = kS390_StoreReverse32;
296 value = value->InputAt(0); 352 value = value->InputAt(0);
297 } 353 }
298 break; 354 break;
299 #if V8_TARGET_ARCH_S390X 355 #if V8_TARGET_ARCH_S390X
300 case MachineRepresentation::kTagged: // Fall through. 356 case MachineRepresentation::kTagged: // Fall through.
301 case MachineRepresentation::kWord64: 357 case MachineRepresentation::kWord64:
302 opcode = kS390_StoreWord64; 358 opcode = kS390_StoreWord64;
303 mode = kInt16Imm_4ByteAligned;
304 if (m.IsWord64ReverseBytes()) { 359 if (m.IsWord64ReverseBytes()) {
305 opcode = kS390_StoreReverse64; 360 opcode = kS390_StoreReverse64;
306 value = value->InputAt(0); 361 value = value->InputAt(0);
307 } 362 }
308 break; 363 break;
309 #else 364 #else
310 case MachineRepresentation::kWord64: // Fall through. 365 case MachineRepresentation::kWord64: // Fall through.
311 #endif 366 #endif
312 case MachineRepresentation::kSimd128: // Fall through. 367 case MachineRepresentation::kSimd128: // Fall through.
313 case MachineRepresentation::kNone: 368 case MachineRepresentation::kNone:
314 UNREACHABLE(); 369 UNREACHABLE();
315 return; 370 return;
316 } 371 }
317 if (g.CanBeImmediate(offset, mode)) { 372 InstructionOperand inputs[4];
318 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), 373 size_t input_count = 0;
319 g.UseRegister(base), g.UseImmediate(offset), g.UseRegister(value)); 374 AddressingMode addressing_mode =
320 } else if (g.CanBeImmediate(base, mode)) { 375 g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count);
321 Emit(opcode | AddressingModeField::encode(kMode_MRI), g.NoOutput(), 376 InstructionCode code =
322 g.UseRegister(offset), g.UseImmediate(base), g.UseRegister(value)); 377 opcode | AddressingModeField::encode(addressing_mode);
323 } else { 378 InstructionOperand value_operand = g.UseRegister(value);
324 Emit(opcode | AddressingModeField::encode(kMode_MRR), g.NoOutput(), 379 inputs[input_count++] = value_operand;
325 g.UseRegister(base), g.UseRegister(offset), g.UseRegister(value)); 380 Emit(code, 0, static_cast<InstructionOperand*>(nullptr), input_count,
326 } 381 inputs);
327 } 382 }
328 } 383 }
329 384
330 // Architecture supports unaligned access, therefore VisitLoad is used instead 385 // Architecture supports unaligned access, therefore VisitLoad is used instead
331 void InstructionSelector::VisitUnalignedLoad(Node* node) { UNREACHABLE(); } 386 void InstructionSelector::VisitUnalignedLoad(Node* node) { UNREACHABLE(); }
332 387
333 // Architecture supports unaligned access, therefore VisitStore is used instead 388 // Architecture supports unaligned access, therefore VisitStore is used instead
334 void InstructionSelector::VisitUnalignedStore(Node* node) { UNREACHABLE(); } 389 void InstructionSelector::VisitUnalignedStore(Node* node) { UNREACHABLE(); }
335 390
336 void InstructionSelector::VisitCheckedLoad(Node* node) { 391 void InstructionSelector::VisitCheckedLoad(Node* node) {
(...skipping 30 matching lines...) Expand all
367 case MachineRepresentation::kWord64: // Fall through. 422 case MachineRepresentation::kWord64: // Fall through.
368 #endif 423 #endif
369 case MachineRepresentation::kSimd128: // Fall through. 424 case MachineRepresentation::kSimd128: // Fall through.
370 case MachineRepresentation::kNone: 425 case MachineRepresentation::kNone:
371 UNREACHABLE(); 426 UNREACHABLE();
372 return; 427 return;
373 } 428 }
374 AddressingMode addressingMode = kMode_MRR; 429 AddressingMode addressingMode = kMode_MRR;
375 Emit(opcode | AddressingModeField::encode(addressingMode), 430 Emit(opcode | AddressingModeField::encode(addressingMode),
376 g.DefineAsRegister(node), g.UseRegister(base), g.UseRegister(offset), 431 g.DefineAsRegister(node), g.UseRegister(base), g.UseRegister(offset),
377 g.UseOperand(length, kInt16Imm_Unsigned)); 432 g.UseOperand(length, kUint32Imm));
378 } 433 }
379 434
380 void InstructionSelector::VisitCheckedStore(Node* node) { 435 void InstructionSelector::VisitCheckedStore(Node* node) {
381 MachineRepresentation rep = CheckedStoreRepresentationOf(node->op()); 436 MachineRepresentation rep = CheckedStoreRepresentationOf(node->op());
382 S390OperandGenerator g(this); 437 S390OperandGenerator g(this);
383 Node* const base = node->InputAt(0); 438 Node* const base = node->InputAt(0);
384 Node* const offset = node->InputAt(1); 439 Node* const offset = node->InputAt(1);
385 Node* const length = node->InputAt(2); 440 Node* const length = node->InputAt(2);
386 Node* const value = node->InputAt(3); 441 Node* const value = node->InputAt(3);
387 ArchOpcode opcode = kArchNop; 442 ArchOpcode opcode = kArchNop;
(...skipping 24 matching lines...) Expand all
412 case MachineRepresentation::kWord64: // Fall through. 467 case MachineRepresentation::kWord64: // Fall through.
413 #endif 468 #endif
414 case MachineRepresentation::kSimd128: // Fall through. 469 case MachineRepresentation::kSimd128: // Fall through.
415 case MachineRepresentation::kNone: 470 case MachineRepresentation::kNone:
416 UNREACHABLE(); 471 UNREACHABLE();
417 return; 472 return;
418 } 473 }
419 AddressingMode addressingMode = kMode_MRR; 474 AddressingMode addressingMode = kMode_MRR;
420 Emit(opcode | AddressingModeField::encode(addressingMode), g.NoOutput(), 475 Emit(opcode | AddressingModeField::encode(addressingMode), g.NoOutput(),
421 g.UseRegister(base), g.UseRegister(offset), 476 g.UseRegister(base), g.UseRegister(offset),
422 g.UseOperand(length, kInt16Imm_Unsigned), g.UseRegister(value)); 477 g.UseOperand(length, kUint32Imm), g.UseRegister(value));
423 } 478 }
424 479
425 static inline bool IsContiguousMask32(uint32_t value, int* mb, int* me) { 480 static inline bool IsContiguousMask32(uint32_t value, int* mb, int* me) {
426 int mask_width = base::bits::CountPopulation32(value); 481 int mask_width = base::bits::CountPopulation32(value);
427 int mask_msb = base::bits::CountLeadingZeros32(value); 482 int mask_msb = base::bits::CountLeadingZeros32(value);
428 int mask_lsb = base::bits::CountTrailingZeros32(value); 483 int mask_lsb = base::bits::CountTrailingZeros32(value);
429 if ((mask_width == 0) || (mask_msb + mask_width + mask_lsb != 32)) 484 if ((mask_width == 0) || (mask_msb + mask_width + mask_lsb != 32))
430 return false; 485 return false;
431 *mb = mask_lsb + mask_width - 1; 486 *mb = mask_lsb + mask_width - 1;
432 *me = mask_lsb; 487 *me = mask_lsb;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 } 525 }
471 } 526 }
472 } 527 }
473 if (mb >= me) { 528 if (mb >= me) {
474 Emit(kS390_RotLeftAndMask32, g.DefineAsRegister(node), 529 Emit(kS390_RotLeftAndMask32, g.DefineAsRegister(node),
475 g.UseRegister(left), g.TempImmediate(sh), g.TempImmediate(mb), 530 g.UseRegister(left), g.TempImmediate(sh), g.TempImmediate(mb),
476 g.TempImmediate(me)); 531 g.TempImmediate(me));
477 return; 532 return;
478 } 533 }
479 } 534 }
480 VisitBinop<Int32BinopMatcher>(this, node, kS390_And32, kInt16Imm_Unsigned); 535 VisitBinop<Int32BinopMatcher>(this, node, kS390_And32, kUint32Imm);
481 } 536 }
482 537
483 #if V8_TARGET_ARCH_S390X 538 #if V8_TARGET_ARCH_S390X
484 void InstructionSelector::VisitWord64And(Node* node) { 539 void InstructionSelector::VisitWord64And(Node* node) {
485 S390OperandGenerator g(this); 540 S390OperandGenerator g(this);
486 Int64BinopMatcher m(node); 541 Int64BinopMatcher m(node);
487 int mb = 0; 542 int mb = 0;
488 int me = 0; 543 int me = 0;
489 if (m.right().HasValue() && IsContiguousMask64(m.right().Value(), &mb, &me)) { 544 if (m.right().HasValue() && IsContiguousMask64(m.right().Value(), &mb, &me)) {
490 int sh = 0; 545 int sh = 0;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 opcode = kS390_RotLeftAndClear64; 577 opcode = kS390_RotLeftAndClear64;
523 mask = mb; 578 mask = mb;
524 } 579 }
525 if (match) { 580 if (match) {
526 Emit(opcode, g.DefineAsRegister(node), g.UseRegister(left), 581 Emit(opcode, g.DefineAsRegister(node), g.UseRegister(left),
527 g.TempImmediate(sh), g.TempImmediate(mask)); 582 g.TempImmediate(sh), g.TempImmediate(mask));
528 return; 583 return;
529 } 584 }
530 } 585 }
531 } 586 }
532 VisitBinop<Int64BinopMatcher>(this, node, kS390_And64, kInt16Imm_Unsigned); 587 VisitBinop<Int64BinopMatcher>(this, node, kS390_And64, kUint32Imm);
533 } 588 }
534 #endif 589 #endif
535 590
536 void InstructionSelector::VisitWord32Or(Node* node) { 591 void InstructionSelector::VisitWord32Or(Node* node) {
537 Int32BinopMatcher m(node); 592 Int32BinopMatcher m(node);
538 VisitBinop<Int32BinopMatcher>(this, node, kS390_Or32, kInt16Imm_Unsigned); 593 VisitBinop<Int32BinopMatcher>(this, node, kS390_Or32, kUint32Imm);
539 } 594 }
540 595
541 #if V8_TARGET_ARCH_S390X 596 #if V8_TARGET_ARCH_S390X
542 void InstructionSelector::VisitWord64Or(Node* node) { 597 void InstructionSelector::VisitWord64Or(Node* node) {
543 Int64BinopMatcher m(node); 598 Int64BinopMatcher m(node);
544 VisitBinop<Int64BinopMatcher>(this, node, kS390_Or64, kInt16Imm_Unsigned); 599 VisitBinop<Int64BinopMatcher>(this, node, kS390_Or64, kUint32Imm);
545 } 600 }
546 #endif 601 #endif
547 602
548 void InstructionSelector::VisitWord32Xor(Node* node) { 603 void InstructionSelector::VisitWord32Xor(Node* node) {
549 S390OperandGenerator g(this); 604 S390OperandGenerator g(this);
550 Int32BinopMatcher m(node); 605 Int32BinopMatcher m(node);
551 if (m.right().Is(-1)) { 606 if (m.right().Is(-1)) {
552 Emit(kS390_Not32, g.DefineAsRegister(node), g.UseRegister(m.left().node())); 607 Emit(kS390_Not32, g.DefineAsRegister(node), g.UseRegister(m.left().node()));
553 } else { 608 } else {
554 VisitBinop<Int32BinopMatcher>(this, node, kS390_Xor32, kInt16Imm_Unsigned); 609 VisitBinop<Int32BinopMatcher>(this, node, kS390_Xor32, kUint32Imm);
555 } 610 }
556 } 611 }
557 612
558 #if V8_TARGET_ARCH_S390X 613 #if V8_TARGET_ARCH_S390X
559 void InstructionSelector::VisitWord64Xor(Node* node) { 614 void InstructionSelector::VisitWord64Xor(Node* node) {
560 S390OperandGenerator g(this); 615 S390OperandGenerator g(this);
561 Int64BinopMatcher m(node); 616 Int64BinopMatcher m(node);
562 if (m.right().Is(-1)) { 617 if (m.right().Is(-1)) {
563 Emit(kS390_Not64, g.DefineAsRegister(node), g.UseRegister(m.left().node())); 618 Emit(kS390_Not64, g.DefineAsRegister(node), g.UseRegister(m.left().node()));
564 } else { 619 } else {
565 VisitBinop<Int64BinopMatcher>(this, node, kS390_Xor64, kInt16Imm_Unsigned); 620 VisitBinop<Int64BinopMatcher>(this, node, kS390_Xor64, kUint32Imm);
566 } 621 }
567 } 622 }
568 #endif 623 #endif
569 624
570 void InstructionSelector::VisitWord32Shl(Node* node) { 625 void InstructionSelector::VisitWord32Shl(Node* node) {
571 S390OperandGenerator g(this); 626 S390OperandGenerator g(this);
572 Int32BinopMatcher m(node); 627 Int32BinopMatcher m(node);
573 if (m.left().IsWord32And() && m.right().IsInRange(0, 31)) { 628 if (m.left().IsWord32And() && m.right().IsInRange(0, 31)) {
574 Int32BinopMatcher mleft(m.left().node()); 629 Int32BinopMatcher mleft(m.left().node());
575 int sh = m.right().Value(); 630 int sh = m.right().Value();
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 g.DefineAsRegister(node), g.UseRegister(base), 922 g.DefineAsRegister(node), g.UseRegister(base),
868 g.UseRegister(offset)); 923 g.UseRegister(offset));
869 return; 924 return;
870 } 925 }
871 } 926 }
872 Emit(kS390_LoadReverse32RR, g.DefineAsRegister(node), 927 Emit(kS390_LoadReverse32RR, g.DefineAsRegister(node),
873 g.UseRegister(node->InputAt(0))); 928 g.UseRegister(node->InputAt(0)));
874 } 929 }
875 930
876 void InstructionSelector::VisitInt32Add(Node* node) { 931 void InstructionSelector::VisitInt32Add(Node* node) {
877 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt16Imm); 932 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt32Imm);
878 } 933 }
879 934
880 #if V8_TARGET_ARCH_S390X 935 #if V8_TARGET_ARCH_S390X
881 void InstructionSelector::VisitInt64Add(Node* node) { 936 void InstructionSelector::VisitInt64Add(Node* node) {
882 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt16Imm); 937 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt32Imm);
883 } 938 }
884 #endif 939 #endif
885 940
886 void InstructionSelector::VisitInt32Sub(Node* node) { 941 void InstructionSelector::VisitInt32Sub(Node* node) {
887 S390OperandGenerator g(this); 942 S390OperandGenerator g(this);
888 Int32BinopMatcher m(node); 943 Int32BinopMatcher m(node);
889 if (m.left().Is(0)) { 944 if (m.left().Is(0)) {
890 Emit(kS390_Neg32, g.DefineAsRegister(node), 945 Emit(kS390_Neg32, g.DefineAsRegister(node),
891 g.UseRegister(m.right().node())); 946 g.UseRegister(m.right().node()));
892 } else { 947 } else {
893 VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32, kInt16Imm_Negate); 948 VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32, kInt32Imm_Negate);
894 } 949 }
895 } 950 }
896 951
897 #if V8_TARGET_ARCH_S390X 952 #if V8_TARGET_ARCH_S390X
898 void InstructionSelector::VisitInt64Sub(Node* node) { 953 void InstructionSelector::VisitInt64Sub(Node* node) {
899 S390OperandGenerator g(this); 954 S390OperandGenerator g(this);
900 Int64BinopMatcher m(node); 955 Int64BinopMatcher m(node);
901 if (m.left().Is(0)) { 956 if (m.left().Is(0)) {
902 Emit(kS390_Neg64, g.DefineAsRegister(node), 957 Emit(kS390_Neg64, g.DefineAsRegister(node),
903 g.UseRegister(m.right().node())); 958 g.UseRegister(m.right().node()));
904 } else { 959 } else {
905 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64, kInt16Imm_Negate); 960 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64, kInt32Imm_Negate);
906 } 961 }
907 } 962 }
908 #endif 963 #endif
909 964
910 namespace { 965 namespace {
911 966
912 void VisitCompare(InstructionSelector* selector, InstructionCode opcode, 967 void VisitCompare(InstructionSelector* selector, InstructionCode opcode,
913 InstructionOperand left, InstructionOperand right, 968 InstructionOperand left, InstructionOperand right,
914 FlagsContinuation* cont); 969 FlagsContinuation* cont);
915 void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node, 970 void EmitInt32MulWithOverflow(InstructionSelector* selector, Node* node,
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 VisitRR(this, kS390_NegFloat, node); 1302 VisitRR(this, kS390_NegFloat, node);
1248 } 1303 }
1249 1304
1250 void InstructionSelector::VisitFloat64Neg(Node* node) { 1305 void InstructionSelector::VisitFloat64Neg(Node* node) {
1251 VisitRR(this, kS390_NegDouble, node); 1306 VisitRR(this, kS390_NegDouble, node);
1252 } 1307 }
1253 1308
1254 void InstructionSelector::VisitInt32AddWithOverflow(Node* node) { 1309 void InstructionSelector::VisitInt32AddWithOverflow(Node* node) {
1255 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1310 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1256 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1311 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1257 return VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt16Imm, 1312 return VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt32Imm,
1258 &cont); 1313 &cont);
1259 } 1314 }
1260 FlagsContinuation cont; 1315 FlagsContinuation cont;
1261 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt16Imm, &cont); 1316 VisitBinop<Int32BinopMatcher>(this, node, kS390_Add32, kInt32Imm, &cont);
1262 } 1317 }
1263 1318
1264 void InstructionSelector::VisitInt32SubWithOverflow(Node* node) { 1319 void InstructionSelector::VisitInt32SubWithOverflow(Node* node) {
1265 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1320 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1266 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1321 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1267 return VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32, 1322 return VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32,
1268 kInt16Imm_Negate, &cont); 1323 kInt32Imm_Negate, &cont);
1269 } 1324 }
1270 FlagsContinuation cont; 1325 FlagsContinuation cont;
1271 VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32, kInt16Imm_Negate, 1326 VisitBinop<Int32BinopMatcher>(this, node, kS390_Sub32, kInt32Imm_Negate,
1272 &cont); 1327 &cont);
1273 } 1328 }
1274 1329
1275 #if V8_TARGET_ARCH_S390X 1330 #if V8_TARGET_ARCH_S390X
1276 void InstructionSelector::VisitInt64AddWithOverflow(Node* node) { 1331 void InstructionSelector::VisitInt64AddWithOverflow(Node* node) {
1277 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1332 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1278 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1333 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1279 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt16Imm, 1334 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt32Imm,
1280 &cont); 1335 &cont);
1281 } 1336 }
1282 FlagsContinuation cont; 1337 FlagsContinuation cont;
1283 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt16Imm, &cont); 1338 VisitBinop<Int64BinopMatcher>(this, node, kS390_Add64, kInt32Imm, &cont);
1284 } 1339 }
1285 1340
1286 void InstructionSelector::VisitInt64SubWithOverflow(Node* node) { 1341 void InstructionSelector::VisitInt64SubWithOverflow(Node* node) {
1287 if (Node* ovf = NodeProperties::FindProjection(node, 1)) { 1342 if (Node* ovf = NodeProperties::FindProjection(node, 1)) {
1288 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf); 1343 FlagsContinuation cont = FlagsContinuation::ForSet(kOverflow, ovf);
1289 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64, 1344 return VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64,
1290 kInt16Imm_Negate, &cont); 1345 kInt32Imm_Negate, &cont);
1291 } 1346 }
1292 FlagsContinuation cont; 1347 FlagsContinuation cont;
1293 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64, kInt16Imm_Negate, 1348 VisitBinop<Int64BinopMatcher>(this, node, kS390_Sub64, kInt32Imm_Negate,
1294 &cont); 1349 &cont);
1295 } 1350 }
1296 #endif 1351 #endif
1297 1352
1298 static bool CompareLogical(FlagsContinuation* cont) { 1353 static bool CompareLogical(FlagsContinuation* cont) {
1299 switch (cont->condition()) { 1354 switch (cont->condition()) {
1300 case kUnsignedLessThan: 1355 case kUnsignedLessThan:
1301 case kUnsignedGreaterThanOrEqual: 1356 case kUnsignedGreaterThanOrEqual:
1302 case kUnsignedLessThanOrEqual: 1357 case kUnsignedLessThanOrEqual:
1303 case kUnsignedGreaterThan: 1358 case kUnsignedGreaterThan:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 VisitCompare(selector, opcode, g.UseRegister(right), g.UseImmediate(left), 1401 VisitCompare(selector, opcode, g.UseRegister(right), g.UseImmediate(left),
1347 cont); 1402 cont);
1348 } else { 1403 } else {
1349 VisitCompare(selector, opcode, g.UseRegister(left), g.UseRegister(right), 1404 VisitCompare(selector, opcode, g.UseRegister(left), g.UseRegister(right),
1350 cont); 1405 cont);
1351 } 1406 }
1352 } 1407 }
1353 1408
1354 void VisitWord32Compare(InstructionSelector* selector, Node* node, 1409 void VisitWord32Compare(InstructionSelector* selector, Node* node,
1355 FlagsContinuation* cont) { 1410 FlagsContinuation* cont) {
1356 ImmediateMode mode = (CompareLogical(cont) ? kInt16Imm_Unsigned : kInt16Imm); 1411 ImmediateMode mode = (CompareLogical(cont) ? kUint32Imm : kInt32Imm);
1357 VisitWordCompare(selector, node, kS390_Cmp32, cont, false, mode); 1412 VisitWordCompare(selector, node, kS390_Cmp32, cont, false, mode);
1358 } 1413 }
1359 1414
1360 #if V8_TARGET_ARCH_S390X 1415 #if V8_TARGET_ARCH_S390X
1361 void VisitWord64Compare(InstructionSelector* selector, Node* node, 1416 void VisitWord64Compare(InstructionSelector* selector, Node* node,
1362 FlagsContinuation* cont) { 1417 FlagsContinuation* cont) {
1363 ImmediateMode mode = (CompareLogical(cont) ? kInt16Imm_Unsigned : kInt16Imm); 1418 ImmediateMode mode = (CompareLogical(cont) ? kUint32Imm : kUint32Imm);
1364 VisitWordCompare(selector, node, kS390_Cmp64, cont, false, mode); 1419 VisitWordCompare(selector, node, kS390_Cmp64, cont, false, mode);
1365 } 1420 }
1366 #endif 1421 #endif
1367 1422
1368 // Shared routine for multiple float32 compare operations. 1423 // Shared routine for multiple float32 compare operations.
1369 void VisitFloat32Compare(InstructionSelector* selector, Node* node, 1424 void VisitFloat32Compare(InstructionSelector* selector, Node* node,
1370 FlagsContinuation* cont) { 1425 FlagsContinuation* cont) {
1371 S390OperandGenerator g(selector); 1426 S390OperandGenerator g(selector);
1372 Node* left = node->InputAt(0); 1427 Node* left = node->InputAt(0);
1373 Node* right = node->InputAt(1); 1428 Node* right = node->InputAt(1);
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
1460 // <Operation> is either nullptr, which means there's no use of the 1515 // <Operation> is either nullptr, which means there's no use of the
1461 // actual value, or was already defined, which means it is scheduled 1516 // actual value, or was already defined, which means it is scheduled
1462 // *AFTER* this branch). 1517 // *AFTER* this branch).
1463 Node* const node = value->InputAt(0); 1518 Node* const node = value->InputAt(0);
1464 Node* const result = NodeProperties::FindProjection(node, 0); 1519 Node* const result = NodeProperties::FindProjection(node, 0);
1465 if (result == nullptr || selector->IsDefined(result)) { 1520 if (result == nullptr || selector->IsDefined(result)) {
1466 switch (node->opcode()) { 1521 switch (node->opcode()) {
1467 case IrOpcode::kInt32AddWithOverflow: 1522 case IrOpcode::kInt32AddWithOverflow:
1468 cont->OverwriteAndNegateIfEqual(kOverflow); 1523 cont->OverwriteAndNegateIfEqual(kOverflow);
1469 return VisitBinop<Int32BinopMatcher>( 1524 return VisitBinop<Int32BinopMatcher>(
1470 selector, node, kS390_Add32, kInt16Imm, cont); 1525 selector, node, kS390_Add32, kInt32Imm, cont);
1471 case IrOpcode::kInt32SubWithOverflow: 1526 case IrOpcode::kInt32SubWithOverflow:
1472 cont->OverwriteAndNegateIfEqual(kOverflow); 1527 cont->OverwriteAndNegateIfEqual(kOverflow);
1473 return VisitBinop<Int32BinopMatcher>( 1528 return VisitBinop<Int32BinopMatcher>(
1474 selector, node, kS390_Sub32, kInt16Imm_Negate, cont); 1529 selector, node, kS390_Sub32, kInt32Imm_Negate, cont);
1475 case IrOpcode::kInt32MulWithOverflow: 1530 case IrOpcode::kInt32MulWithOverflow:
1476 cont->OverwriteAndNegateIfEqual(kNotEqual); 1531 cont->OverwriteAndNegateIfEqual(kNotEqual);
1477 return EmitInt32MulWithOverflow(selector, node, cont); 1532 return EmitInt32MulWithOverflow(selector, node, cont);
1478 #if V8_TARGET_ARCH_S390X 1533 #if V8_TARGET_ARCH_S390X
1479 case IrOpcode::kInt64AddWithOverflow: 1534 case IrOpcode::kInt64AddWithOverflow:
1480 cont->OverwriteAndNegateIfEqual(kOverflow); 1535 cont->OverwriteAndNegateIfEqual(kOverflow);
1481 return VisitBinop<Int64BinopMatcher>( 1536 return VisitBinop<Int64BinopMatcher>(
1482 selector, node, kS390_Add64, kInt16Imm, cont); 1537 selector, node, kS390_Add64, kInt32Imm, cont);
1483 case IrOpcode::kInt64SubWithOverflow: 1538 case IrOpcode::kInt64SubWithOverflow:
1484 cont->OverwriteAndNegateIfEqual(kOverflow); 1539 cont->OverwriteAndNegateIfEqual(kOverflow);
1485 return VisitBinop<Int64BinopMatcher>( 1540 return VisitBinop<Int64BinopMatcher>(
1486 selector, node, kS390_Sub64, kInt16Imm_Negate, cont); 1541 selector, node, kS390_Sub64, kInt32Imm_Negate, cont);
1487 #endif 1542 #endif
1488 default: 1543 default:
1489 break; 1544 break;
1490 } 1545 }
1491 } 1546 }
1492 } 1547 }
1493 break; 1548 break;
1494 case IrOpcode::kInt32Sub: 1549 case IrOpcode::kInt32Sub:
1495 return VisitWord32Compare(selector, value, cont); 1550 return VisitWord32Compare(selector, value, cont);
1496 case IrOpcode::kWord32And: 1551 case IrOpcode::kWord32And:
1497 return VisitWordCompare(selector, value, kS390_Tst32, cont, true, 1552 return VisitWordCompare(selector, value, kS390_Tst32, cont, true,
1498 kInt16Imm_Unsigned); 1553 kUint32Imm);
1499 // TODO(mbrandy): Handle? 1554 // TODO(mbrandy): Handle?
1500 // case IrOpcode::kInt32Add: 1555 // case IrOpcode::kInt32Add:
1501 // case IrOpcode::kWord32Or: 1556 // case IrOpcode::kWord32Or:
1502 // case IrOpcode::kWord32Xor: 1557 // case IrOpcode::kWord32Xor:
1503 // case IrOpcode::kWord32Sar: 1558 // case IrOpcode::kWord32Sar:
1504 // case IrOpcode::kWord32Shl: 1559 // case IrOpcode::kWord32Shl:
1505 // case IrOpcode::kWord32Shr: 1560 // case IrOpcode::kWord32Shr:
1506 // case IrOpcode::kWord32Ror: 1561 // case IrOpcode::kWord32Ror:
1507 #if V8_TARGET_ARCH_S390X 1562 #if V8_TARGET_ARCH_S390X
1508 case IrOpcode::kInt64Sub: 1563 case IrOpcode::kInt64Sub:
1509 return VisitWord64Compare(selector, value, cont); 1564 return VisitWord64Compare(selector, value, cont);
1510 case IrOpcode::kWord64And: 1565 case IrOpcode::kWord64And:
1511 return VisitWordCompare(selector, value, kS390_Tst64, cont, true, 1566 return VisitWordCompare(selector, value, kS390_Tst64, cont, true,
1512 kInt16Imm_Unsigned); 1567 kUint32Imm);
1513 // TODO(mbrandy): Handle? 1568 // TODO(mbrandy): Handle?
1514 // case IrOpcode::kInt64Add: 1569 // case IrOpcode::kInt64Add:
1515 // case IrOpcode::kWord64Or: 1570 // case IrOpcode::kWord64Or:
1516 // case IrOpcode::kWord64Xor: 1571 // case IrOpcode::kWord64Xor:
1517 // case IrOpcode::kWord64Sar: 1572 // case IrOpcode::kWord64Sar:
1518 // case IrOpcode::kWord64Shl: 1573 // case IrOpcode::kWord64Shl:
1519 // case IrOpcode::kWord64Shr: 1574 // case IrOpcode::kWord64Shr:
1520 // case IrOpcode::kWord64Ror: 1575 // case IrOpcode::kWord64Ror:
1521 #endif 1576 #endif
1522 default: 1577 default:
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
1854 // static 1909 // static
1855 MachineOperatorBuilder::AlignmentRequirements 1910 MachineOperatorBuilder::AlignmentRequirements
1856 InstructionSelector::AlignmentRequirements() { 1911 InstructionSelector::AlignmentRequirements() {
1857 return MachineOperatorBuilder::AlignmentRequirements:: 1912 return MachineOperatorBuilder::AlignmentRequirements::
1858 FullUnalignedAccessSupport(); 1913 FullUnalignedAccessSupport();
1859 } 1914 }
1860 1915
1861 } // namespace compiler 1916 } // namespace compiler
1862 } // namespace internal 1917 } // namespace internal
1863 } // namespace v8 1918 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/s390/instruction-codes-s390.h ('k') | src/s390/assembler-s390.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698