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

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

Issue 2602893002: [turbofan] Elide no-op adds in x64 index addressing modes (Closed)
Patch Set: Created 3 years, 11 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 | « no previous file | no next file » | 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 <algorithm> 5 #include <algorithm>
6 6
7 #include "src/base/adapters.h" 7 #include "src/base/adapters.h"
8 #include "src/compiler/instruction-selector-impl.h" 8 #include "src/compiler/instruction-selector-impl.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/node-properties.h" 10 #include "src/compiler/node-properties.h"
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 } 75 }
76 return false; 76 return false;
77 } 77 }
78 78
79 AddressingMode GenerateMemoryOperandInputs(Node* index, int scale_exponent, 79 AddressingMode GenerateMemoryOperandInputs(Node* index, int scale_exponent,
80 Node* base, Node* displacement, 80 Node* base, Node* displacement,
81 DisplacementMode displacement_mode, 81 DisplacementMode displacement_mode,
82 InstructionOperand inputs[], 82 InstructionOperand inputs[],
83 size_t* input_count) { 83 size_t* input_count) {
84 AddressingMode mode = kMode_MRI; 84 AddressingMode mode = kMode_MRI;
85 if (base != nullptr && (index != nullptr || displacement != nullptr)) {
86 if (base->opcode() == IrOpcode::kInt32Constant &&
87 OpParameter<int32_t>(base) == 0) {
88 base = nullptr;
89 } else if (base->opcode() == IrOpcode::kInt64Constant &&
90 OpParameter<int64_t>(base) == 0) {
91 base = nullptr;
92 }
93 }
85 if (base != nullptr) { 94 if (base != nullptr) {
86 inputs[(*input_count)++] = UseRegister(base); 95 inputs[(*input_count)++] = UseRegister(base);
87 if (index != nullptr) { 96 if (index != nullptr) {
88 DCHECK(scale_exponent >= 0 && scale_exponent <= 3); 97 DCHECK(scale_exponent >= 0 && scale_exponent <= 3);
89 inputs[(*input_count)++] = UseRegister(index); 98 inputs[(*input_count)++] = UseRegister(index);
90 if (displacement != nullptr) { 99 if (displacement != nullptr) {
91 inputs[(*input_count)++] = displacement_mode 100 inputs[(*input_count)++] = displacement_mode
92 ? UseNegatedImmediate(displacement) 101 ? UseNegatedImmediate(displacement)
93 : UseImmediate(displacement); 102 : UseImmediate(displacement);
94 static const AddressingMode kMRnI_modes[] = {kMode_MR1I, kMode_MR2I, 103 static const AddressingMode kMRnI_modes[] = {kMode_MR1I, kMode_MR2I,
95 kMode_MR4I, kMode_MR8I}; 104 kMode_MR4I, kMode_MR8I};
96 mode = kMRnI_modes[scale_exponent]; 105 mode = kMRnI_modes[scale_exponent];
97 } else { 106 } else {
98 static const AddressingMode kMRn_modes[] = {kMode_MR1, kMode_MR2, 107 static const AddressingMode kMRn_modes[] = {kMode_MR1, kMode_MR2,
99 kMode_MR4, kMode_MR8}; 108 kMode_MR4, kMode_MR8};
100 mode = kMRn_modes[scale_exponent]; 109 mode = kMRn_modes[scale_exponent];
101 } 110 }
102 } else { 111 } else {
103 if (displacement == nullptr) { 112 if (displacement == nullptr) {
104 mode = kMode_MR; 113 mode = kMode_MR;
105 } else { 114 } else {
106 inputs[(*input_count)++] = displacement_mode == kNegativeDisplacement 115 inputs[(*input_count)++] = displacement_mode == kNegativeDisplacement
107 ? UseNegatedImmediate(displacement) 116 ? UseNegatedImmediate(displacement)
108 : UseImmediate(displacement); 117 : UseImmediate(displacement);
109 mode = kMode_MRI; 118 mode = kMode_MRI;
110 } 119 }
111 } 120 }
112 } else { 121 } else {
113 DCHECK_NOT_NULL(index);
114 DCHECK(scale_exponent >= 0 && scale_exponent <= 3); 122 DCHECK(scale_exponent >= 0 && scale_exponent <= 3);
115 inputs[(*input_count)++] = UseRegister(index);
116 if (displacement != nullptr) { 123 if (displacement != nullptr) {
117 inputs[(*input_count)++] = displacement_mode == kNegativeDisplacement 124 if (index == nullptr) {
118 ? UseNegatedImmediate(displacement) 125 inputs[(*input_count)++] = UseRegister(displacement);
119 : UseImmediate(displacement); 126 mode = kMode_MR;
120 static const AddressingMode kMnI_modes[] = {kMode_MRI, kMode_M2I, 127 } else {
121 kMode_M4I, kMode_M8I}; 128 inputs[(*input_count)++] = UseRegister(index);
122 mode = kMnI_modes[scale_exponent]; 129 inputs[(*input_count)++] = displacement_mode == kNegativeDisplacement
130 ? UseNegatedImmediate(displacement)
131 : UseImmediate(displacement);
132 static const AddressingMode kMnI_modes[] = {kMode_MRI, kMode_M2I,
133 kMode_M4I, kMode_M8I};
134 mode = kMnI_modes[scale_exponent];
135 }
123 } else { 136 } else {
137 inputs[(*input_count)++] = UseRegister(index);
124 static const AddressingMode kMn_modes[] = {kMode_MR, kMode_MR1, 138 static const AddressingMode kMn_modes[] = {kMode_MR, kMode_MR1,
125 kMode_M4, kMode_M8}; 139 kMode_M4, kMode_M8};
126 mode = kMn_modes[scale_exponent]; 140 mode = kMn_modes[scale_exponent];
127 if (mode == kMode_MR1) { 141 if (mode == kMode_MR1) {
128 // [%r1 + %r1*1] has a smaller encoding than [%r1*2+0] 142 // [%r1 + %r1*1] has a smaller encoding than [%r1*2+0]
129 inputs[(*input_count)++] = UseRegister(index); 143 inputs[(*input_count)++] = UseRegister(index);
130 } 144 }
131 } 145 }
132 } 146 }
133 return mode; 147 return mode;
(...skipping 2333 matching lines...) Expand 10 before | Expand all | Expand 10 after
2467 // static 2481 // static
2468 MachineOperatorBuilder::AlignmentRequirements 2482 MachineOperatorBuilder::AlignmentRequirements
2469 InstructionSelector::AlignmentRequirements() { 2483 InstructionSelector::AlignmentRequirements() {
2470 return MachineOperatorBuilder::AlignmentRequirements:: 2484 return MachineOperatorBuilder::AlignmentRequirements::
2471 FullUnalignedAccessSupport(); 2485 FullUnalignedAccessSupport();
2472 } 2486 }
2473 2487
2474 } // namespace compiler 2488 } // namespace compiler
2475 } // namespace internal 2489 } // namespace internal
2476 } // namespace v8 2490 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698