| Index: src/compiler/int64-lowering.cc
|
| diff --git a/src/compiler/int64-lowering.cc b/src/compiler/int64-lowering.cc
|
| index 403d4c961cfc3ebf6668c674138bda1cd1ea6546..7a358cfbf51dbf2a5a087dc1b01bc8fa240d9f9d 100644
|
| --- a/src/compiler/int64-lowering.cc
|
| +++ b/src/compiler/int64-lowering.cc
|
| @@ -126,6 +126,38 @@ void Int64Lowering::LowerNode(Node* node) {
|
| }
|
| break;
|
| }
|
| + case IrOpcode::kUnalignedLoad: {
|
| + UnalignedLoadRepresentation load_rep =
|
| + UnalignedLoadRepresentationOf(node->op());
|
| +
|
| + if (load_rep.representation() == MachineRepresentation::kWord64) {
|
| + Node* base = node->InputAt(0);
|
| + Node* index = node->InputAt(1);
|
| + Node* index_high =
|
| + graph()->NewNode(machine()->Int32Add(), index,
|
| + graph()->NewNode(common()->Int32Constant(4)));
|
| +
|
| + const Operator* load_op =
|
| + machine()->UnalignedLoad(MachineType::Int32()).op();
|
| + Node* high_node;
|
| + if (node->InputCount() > 2) {
|
| + Node* effect_high = node->InputAt(2);
|
| + Node* control_high = node->InputAt(3);
|
| + high_node = graph()->NewNode(load_op, base, index_high, effect_high,
|
| + control_high);
|
| + // change the effect change from old_node --> old_effect to
|
| + // old_node --> high_node --> old_effect.
|
| + node->ReplaceInput(2, high_node);
|
| + } else {
|
| + high_node = graph()->NewNode(load_op, base, index_high);
|
| + }
|
| + NodeProperties::ChangeOp(node, load_op);
|
| + ReplaceNode(node, node, high_node);
|
| + } else {
|
| + DefaultLowering(node);
|
| + }
|
| + break;
|
| + }
|
| case IrOpcode::kStore: {
|
| StoreRepresentation store_rep = StoreRepresentationOf(node->op());
|
| if (store_rep.representation() == MachineRepresentation::kWord64) {
|
| @@ -170,6 +202,46 @@ void Int64Lowering::LowerNode(Node* node) {
|
| }
|
| break;
|
| }
|
| + case IrOpcode::kUnalignedStore: {
|
| + UnalignedStoreRepresentation store_rep =
|
| + UnalignedStoreRepresentationOf(node->op());
|
| + if (store_rep == MachineRepresentation::kWord64) {
|
| + Node* base = node->InputAt(0);
|
| + Node* index = node->InputAt(1);
|
| + Node* index_high =
|
| + graph()->NewNode(machine()->Int32Add(), index,
|
| + graph()->NewNode(common()->Int32Constant(4)));
|
| +
|
| + Node* value = node->InputAt(2);
|
| + DCHECK(HasReplacementLow(value));
|
| + DCHECK(HasReplacementHigh(value));
|
| +
|
| + const Operator* store_op =
|
| + machine()->UnalignedStore(MachineRepresentation::kWord32).op();
|
| +
|
| + Node* high_node;
|
| + if (node->InputCount() > 3) {
|
| + Node* effect_high = node->InputAt(3);
|
| + Node* control_high = node->InputAt(4);
|
| + high_node = graph()->NewNode(store_op, base, index_high,
|
| + GetReplacementHigh(value), effect_high,
|
| + control_high);
|
| + node->ReplaceInput(3, high_node);
|
| +
|
| + } else {
|
| + high_node = graph()->NewNode(store_op, base, index_high,
|
| + GetReplacementHigh(value));
|
| + }
|
| +
|
| + node->ReplaceInput(2, GetReplacementLow(value));
|
| + NodeProperties::ChangeOp(node, store_op);
|
| + ReplaceNode(node, node, high_node);
|
| + } else {
|
| + DefaultLowering(node);
|
| + }
|
| + break;
|
| + }
|
| +
|
| case IrOpcode::kStart: {
|
| int parameter_count = GetParameterCountAfterLowering(signature());
|
| // Only exchange the node if the parameter count actually changed.
|
|
|