Chromium Code Reviews| 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/int64-lowering.h" | 5 #include "src/compiler/int64-lowering.h" |
| 6 #include "src/compiler/common-operator.h" | 6 #include "src/compiler/common-operator.h" |
| 7 #include "src/compiler/diamond.h" | 7 #include "src/compiler/diamond.h" |
| 8 #include "src/compiler/graph.h" | 8 #include "src/compiler/graph.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 119 } else { | 119 } else { |
| 120 high_node = graph()->NewNode(load_op, base, index_high); | 120 high_node = graph()->NewNode(load_op, base, index_high); |
| 121 } | 121 } |
| 122 NodeProperties::ChangeOp(node, load_op); | 122 NodeProperties::ChangeOp(node, load_op); |
| 123 ReplaceNode(node, node, high_node); | 123 ReplaceNode(node, node, high_node); |
| 124 } else { | 124 } else { |
| 125 DefaultLowering(node); | 125 DefaultLowering(node); |
| 126 } | 126 } |
| 127 break; | 127 break; |
| 128 } | 128 } |
| 129 case IrOpcode::kUnalignedLoad: { | |
|
titzer
2016/03/29 08:42:48
Can you factor out the common code between load/un
| |
| 130 UnalignedLoadRepresentation load_rep = | |
| 131 UnalignedLoadRepresentationOf(node->op()); | |
| 132 | |
| 133 if (load_rep.representation() == MachineRepresentation::kWord64) { | |
| 134 Node* base = node->InputAt(0); | |
| 135 Node* index = node->InputAt(1); | |
| 136 Node* index_high = | |
| 137 graph()->NewNode(machine()->Int32Add(), index, | |
| 138 graph()->NewNode(common()->Int32Constant(4))); | |
| 139 | |
| 140 const Operator* load_op = | |
| 141 machine()->UnalignedLoad(MachineType::Int32()).op(); | |
| 142 Node* high_node; | |
| 143 if (node->InputCount() > 2) { | |
| 144 Node* effect_high = node->InputAt(2); | |
| 145 Node* control_high = node->InputAt(3); | |
| 146 high_node = graph()->NewNode(load_op, base, index_high, effect_high, | |
| 147 control_high); | |
| 148 // change the effect change from old_node --> old_effect to | |
| 149 // old_node --> high_node --> old_effect. | |
| 150 node->ReplaceInput(2, high_node); | |
| 151 } else { | |
| 152 high_node = graph()->NewNode(load_op, base, index_high); | |
| 153 } | |
| 154 NodeProperties::ChangeOp(node, load_op); | |
| 155 ReplaceNode(node, node, high_node); | |
| 156 } else { | |
| 157 DefaultLowering(node); | |
| 158 } | |
| 159 break; | |
| 160 } | |
| 129 case IrOpcode::kStore: { | 161 case IrOpcode::kStore: { |
| 130 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); | 162 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); |
| 131 if (store_rep.representation() == MachineRepresentation::kWord64) { | 163 if (store_rep.representation() == MachineRepresentation::kWord64) { |
| 132 // We change the original store node to store the low word, and create | 164 // We change the original store node to store the low word, and create |
| 133 // a new store node to store the high word. The effect and control edges | 165 // a new store node to store the high word. The effect and control edges |
| 134 // are copied from the original store to the new store node, the effect | 166 // are copied from the original store to the new store node, the effect |
| 135 // edge of the original store is redirected to the new store. | 167 // edge of the original store is redirected to the new store. |
| 136 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); | 168 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); |
| 137 | 169 |
| 138 Node* base = node->InputAt(0); | 170 Node* base = node->InputAt(0); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 163 } | 195 } |
| 164 | 196 |
| 165 node->ReplaceInput(2, GetReplacementLow(value)); | 197 node->ReplaceInput(2, GetReplacementLow(value)); |
| 166 NodeProperties::ChangeOp(node, store_op); | 198 NodeProperties::ChangeOp(node, store_op); |
| 167 ReplaceNode(node, node, high_node); | 199 ReplaceNode(node, node, high_node); |
| 168 } else { | 200 } else { |
| 169 DefaultLowering(node); | 201 DefaultLowering(node); |
| 170 } | 202 } |
| 171 break; | 203 break; |
| 172 } | 204 } |
| 205 case IrOpcode::kUnalignedStore: { | |
| 206 UnalignedStoreRepresentation store_rep = | |
| 207 UnalignedStoreRepresentationOf(node->op()); | |
| 208 if (store_rep == MachineRepresentation::kWord64) { | |
| 209 Node* base = node->InputAt(0); | |
| 210 Node* index = node->InputAt(1); | |
| 211 Node* index_high = | |
| 212 graph()->NewNode(machine()->Int32Add(), index, | |
| 213 graph()->NewNode(common()->Int32Constant(4))); | |
| 214 | |
| 215 Node* value = node->InputAt(2); | |
| 216 DCHECK(HasReplacementLow(value)); | |
| 217 DCHECK(HasReplacementHigh(value)); | |
| 218 | |
| 219 const Operator* store_op = | |
| 220 machine()->UnalignedStore(MachineRepresentation::kWord32).op(); | |
| 221 | |
| 222 Node* high_node; | |
| 223 if (node->InputCount() > 3) { | |
| 224 Node* effect_high = node->InputAt(3); | |
| 225 Node* control_high = node->InputAt(4); | |
| 226 high_node = graph()->NewNode(store_op, base, index_high, | |
| 227 GetReplacementHigh(value), effect_high, | |
| 228 control_high); | |
| 229 node->ReplaceInput(3, high_node); | |
| 230 | |
| 231 } else { | |
| 232 high_node = graph()->NewNode(store_op, base, index_high, | |
| 233 GetReplacementHigh(value)); | |
| 234 } | |
| 235 | |
| 236 node->ReplaceInput(2, GetReplacementLow(value)); | |
| 237 NodeProperties::ChangeOp(node, store_op); | |
| 238 ReplaceNode(node, node, high_node); | |
| 239 } else { | |
| 240 DefaultLowering(node); | |
| 241 } | |
| 242 break; | |
| 243 } | |
| 244 | |
| 173 case IrOpcode::kStart: { | 245 case IrOpcode::kStart: { |
| 174 int parameter_count = GetParameterCountAfterLowering(signature()); | 246 int parameter_count = GetParameterCountAfterLowering(signature()); |
| 175 // Only exchange the node if the parameter count actually changed. | 247 // Only exchange the node if the parameter count actually changed. |
| 176 if (parameter_count != signature()->parameter_count()) { | 248 if (parameter_count != signature()->parameter_count()) { |
| 177 int delta = | 249 int delta = |
| 178 parameter_count - static_cast<int>(signature()->parameter_count()); | 250 parameter_count - static_cast<int>(signature()->parameter_count()); |
| 179 int new_output_count = node->op()->ValueOutputCount() + delta; | 251 int new_output_count = node->op()->ValueOutputCount() + delta; |
| 180 NodeProperties::ChangeOp(node, common()->Start(new_output_count)); | 252 NodeProperties::ChangeOp(node, common()->Start(new_output_count)); |
| 181 } | 253 } |
| 182 break; | 254 break; |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 639 } | 711 } |
| 640 | 712 |
| 641 Node* Int64Lowering::GetReplacementHigh(Node* node) { | 713 Node* Int64Lowering::GetReplacementHigh(Node* node) { |
| 642 Node* result = replacements_[node->id()].high; | 714 Node* result = replacements_[node->id()].high; |
| 643 DCHECK(result); | 715 DCHECK(result); |
| 644 return result; | 716 return result; |
| 645 } | 717 } |
| 646 } // namespace compiler | 718 } // namespace compiler |
| 647 } // namespace internal | 719 } // namespace internal |
| 648 } // namespace v8 | 720 } // namespace v8 |
| OLD | NEW |