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/generic-node-inl.h" | 5 #include "src/compiler/generic-node-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 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 inputs[(*input_count)++] = g->UseImmediate(constant); | 381 inputs[(*input_count)++] = g->UseImmediate(constant); |
382 static const AddressingMode kMRnI_modes[] = {kMode_MR1I, kMode_MR2I, | 382 static const AddressingMode kMRnI_modes[] = {kMode_MR1I, kMode_MR2I, |
383 kMode_MR4I, kMode_MR8I}; | 383 kMode_MR4I, kMode_MR8I}; |
384 mode = kMRnI_modes[scale_exponent]; | 384 mode = kMRnI_modes[scale_exponent]; |
385 } else { | 385 } else { |
386 static const AddressingMode kMRn_modes[] = {kMode_MR1, kMode_MR2, | 386 static const AddressingMode kMRn_modes[] = {kMode_MR1, kMode_MR2, |
387 kMode_MR4, kMode_MR8}; | 387 kMode_MR4, kMode_MR8}; |
388 mode = kMRn_modes[scale_exponent]; | 388 mode = kMRn_modes[scale_exponent]; |
389 } | 389 } |
390 } else { | 390 } else { |
391 DCHECK(constant != NULL); | 391 if (constant == NULL) { |
392 inputs[(*input_count)++] = g->UseImmediate(constant); | 392 mode = kMode_MR; |
393 mode = kMode_MRI; | 393 } else { |
| 394 inputs[(*input_count)++] = g->UseImmediate(constant); |
| 395 mode = kMode_MRI; |
| 396 } |
394 } | 397 } |
395 } else { | 398 } else { |
396 DCHECK(scaled != NULL); | 399 DCHECK(scaled != NULL); |
397 DCHECK(scale_exponent >= 0 && scale_exponent <= 3); | 400 DCHECK(scale_exponent >= 0 && scale_exponent <= 3); |
398 inputs[(*input_count)++] = g->UseRegister(scaled); | 401 inputs[(*input_count)++] = g->UseRegister(scaled); |
399 if (constant != NULL) { | 402 if (constant != NULL) { |
400 inputs[(*input_count)++] = g->UseImmediate(constant); | 403 inputs[(*input_count)++] = g->UseImmediate(constant); |
401 static const AddressingMode kMnI_modes[] = {kMode_M1I, kMode_M2I, | 404 static const AddressingMode kMnI_modes[] = {kMode_M1I, kMode_M2I, |
402 kMode_M4I, kMode_M8I}; | 405 kMode_M4I, kMode_M8I}; |
403 mode = kMnI_modes[scale_exponent]; | 406 mode = kMnI_modes[scale_exponent]; |
404 } else { | 407 } else { |
405 static const AddressingMode kMn_modes[] = {kMode_M1, kMode_M2, kMode_M4, | 408 static const AddressingMode kMn_modes[] = {kMode_M1, kMode_M2, kMode_M4, |
406 kMode_M8}; | 409 kMode_M8}; |
407 mode = kMn_modes[scale_exponent]; | 410 mode = kMn_modes[scale_exponent]; |
408 } | 411 } |
409 } | 412 } |
410 return mode; | 413 return mode; |
411 } | 414 } |
412 | 415 |
413 } // namespace | 416 } // namespace |
414 | 417 |
415 | 418 |
416 void InstructionSelector::VisitInt32Add(Node* node) { | 419 void InstructionSelector::VisitInt32Add(Node* node) { |
417 // Try to match the Add to a leal pattern | 420 // Try to match the Add to a leal pattern |
418 ScaledWithOffsetMatcher m(node); | 421 ScaledWithOffset32Matcher m(node); |
419 X64OperandGenerator g(this); | 422 X64OperandGenerator g(this); |
420 if (m.matches() && (m.constant() == NULL || g.CanBeImmediate(m.constant()))) { | 423 if (m.matches() && (m.constant() == NULL || g.CanBeImmediate(m.constant()))) { |
421 InstructionOperand* inputs[4]; | 424 InstructionOperand* inputs[4]; |
422 size_t input_count = 0; | 425 size_t input_count = 0; |
423 | 426 |
424 AddressingMode mode = GenerateMemoryOperandInputs( | 427 AddressingMode mode = GenerateMemoryOperandInputs( |
425 &g, m.scaled(), m.scale_exponent(), m.offset(), m.constant(), inputs, | 428 &g, m.scaled(), m.scale_exponent(), m.offset(), m.constant(), inputs, |
426 &input_count); | 429 &input_count); |
427 | 430 |
428 DCHECK_NE(0, static_cast<int>(input_count)); | 431 DCHECK_NE(0, static_cast<int>(input_count)); |
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1154 if (CpuFeatures::IsSupported(SSE4_1)) { | 1157 if (CpuFeatures::IsSupported(SSE4_1)) { |
1155 return MachineOperatorBuilder::kFloat64Floor | | 1158 return MachineOperatorBuilder::kFloat64Floor | |
1156 MachineOperatorBuilder::kFloat64Ceil | | 1159 MachineOperatorBuilder::kFloat64Ceil | |
1157 MachineOperatorBuilder::kFloat64RoundTruncate; | 1160 MachineOperatorBuilder::kFloat64RoundTruncate; |
1158 } | 1161 } |
1159 return MachineOperatorBuilder::kNoFlags; | 1162 return MachineOperatorBuilder::kNoFlags; |
1160 } | 1163 } |
1161 } // namespace compiler | 1164 } // namespace compiler |
1162 } // namespace internal | 1165 } // namespace internal |
1163 } // namespace v8 | 1166 } // namespace v8 |
OLD | NEW |