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

Side by Side Diff: src/compiler/int64-lowering.cc

Issue 2080213004: Fix int64 lowering on big-endian architectures. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Use constants instead of get methods Created 4 years, 6 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/int64-lowering.h ('k') | test/mjsunit/mjsunit.status » ('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 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 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 Signature<MachineRepresentation>* signature) { 93 Signature<MachineRepresentation>* signature) {
94 int result = static_cast<int>(signature->return_count()); 94 int result = static_cast<int>(signature->return_count());
95 for (int i = 0; i < static_cast<int>(signature->return_count()); i++) { 95 for (int i = 0; i < static_cast<int>(signature->return_count()); i++) {
96 if (signature->GetReturn(i) == MachineRepresentation::kWord64) { 96 if (signature->GetReturn(i) == MachineRepresentation::kWord64) {
97 result++; 97 result++;
98 } 98 }
99 } 99 }
100 return result; 100 return result;
101 } 101 }
102 102
103 void Int64Lowering::GetIndexNodes(Node* index, Node*& index_low,
104 Node*& index_high) {
105 #if defined(V8_TARGET_LITTLE_ENDIAN)
106 index_low = index;
107 index_high = graph()->NewNode(machine()->Int32Add(), index,
108 graph()->NewNode(common()->Int32Constant(4)));
109 #elif defined(V8_TARGET_BIG_ENDIAN)
110 index_low = graph()->NewNode(machine()->Int32Add(), index,
111 graph()->NewNode(common()->Int32Constant(4)));
112 index_high = index;
113 #endif
114 }
115
116 #if defined(V8_TARGET_LITTLE_ENDIAN)
117 const int Int64Lowering::kLowerWordOffset = 0;
118 const int Int64Lowering::kHigherWordOffset = 4;
119 #elif defined(V8_TARGET_BIG_ENDIAN)
120 const int Int64Lowering::kLowerWordOffset = 4;
121 const int Int64Lowering::kHigherWordOffset = 0;
122 #endif
123
103 void Int64Lowering::LowerNode(Node* node) { 124 void Int64Lowering::LowerNode(Node* node) {
104 switch (node->opcode()) { 125 switch (node->opcode()) {
105 case IrOpcode::kInt64Constant: { 126 case IrOpcode::kInt64Constant: {
106 int64_t value = OpParameter<int64_t>(node); 127 int64_t value = OpParameter<int64_t>(node);
107 Node* low_node = graph()->NewNode( 128 Node* low_node = graph()->NewNode(
108 common()->Int32Constant(static_cast<int32_t>(value & 0xFFFFFFFF))); 129 common()->Int32Constant(static_cast<int32_t>(value & 0xFFFFFFFF)));
109 Node* high_node = graph()->NewNode( 130 Node* high_node = graph()->NewNode(
110 common()->Int32Constant(static_cast<int32_t>(value >> 32))); 131 common()->Int32Constant(static_cast<int32_t>(value >> 32)));
111 ReplaceNode(node, low_node, high_node); 132 ReplaceNode(node, low_node, high_node);
112 break; 133 break;
113 } 134 }
114 case IrOpcode::kLoad: { 135 case IrOpcode::kLoad: {
115 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); 136 LoadRepresentation load_rep = LoadRepresentationOf(node->op());
116 137
117 if (load_rep.representation() == MachineRepresentation::kWord64) { 138 if (load_rep.representation() == MachineRepresentation::kWord64) {
118 Node* base = node->InputAt(0); 139 Node* base = node->InputAt(0);
119 Node* index = node->InputAt(1); 140 Node* index = node->InputAt(1);
120 Node* index_high = 141 Node* index_low;
121 graph()->NewNode(machine()->Int32Add(), index, 142 Node* index_high;
122 graph()->NewNode(common()->Int32Constant(4))); 143 GetIndexNodes(index, index_low, index_high);
123
124 const Operator* load_op = machine()->Load(MachineType::Int32()); 144 const Operator* load_op = machine()->Load(MachineType::Int32());
125 Node* high_node; 145 Node* high_node;
126 if (node->InputCount() > 2) { 146 if (node->InputCount() > 2) {
127 Node* effect_high = node->InputAt(2); 147 Node* effect_high = node->InputAt(2);
128 Node* control_high = node->InputAt(3); 148 Node* control_high = node->InputAt(3);
129 high_node = graph()->NewNode(load_op, base, index_high, effect_high, 149 high_node = graph()->NewNode(load_op, base, index_high, effect_high,
130 control_high); 150 control_high);
131 // change the effect change from old_node --> old_effect to 151 // change the effect change from old_node --> old_effect to
132 // old_node --> high_node --> old_effect. 152 // old_node --> high_node --> old_effect.
133 node->ReplaceInput(2, high_node); 153 node->ReplaceInput(2, high_node);
134 } else { 154 } else {
135 high_node = graph()->NewNode(load_op, base, index_high); 155 high_node = graph()->NewNode(load_op, base, index_high);
136 } 156 }
157 node->ReplaceInput(1, index_low);
137 NodeProperties::ChangeOp(node, load_op); 158 NodeProperties::ChangeOp(node, load_op);
138 ReplaceNode(node, node, high_node); 159 ReplaceNode(node, node, high_node);
139 } else { 160 } else {
140 DefaultLowering(node); 161 DefaultLowering(node);
141 } 162 }
142 break; 163 break;
143 } 164 }
144 case IrOpcode::kStore: { 165 case IrOpcode::kStore: {
145 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); 166 StoreRepresentation store_rep = StoreRepresentationOf(node->op());
146 if (store_rep.representation() == MachineRepresentation::kWord64) { 167 if (store_rep.representation() == MachineRepresentation::kWord64) {
147 // We change the original store node to store the low word, and create 168 // We change the original store node to store the low word, and create
148 // a new store node to store the high word. The effect and control edges 169 // a new store node to store the high word. The effect and control edges
149 // are copied from the original store to the new store node, the effect 170 // are copied from the original store to the new store node, the effect
150 // edge of the original store is redirected to the new store. 171 // edge of the original store is redirected to the new store.
151 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); 172 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
152 173
153 Node* base = node->InputAt(0); 174 Node* base = node->InputAt(0);
154 Node* index = node->InputAt(1); 175 Node* index = node->InputAt(1);
155 Node* index_high = 176 Node* index_low;
156 graph()->NewNode(machine()->Int32Add(), index, 177 Node* index_high;
157 graph()->NewNode(common()->Int32Constant(4))); 178 GetIndexNodes(index, index_low, index_high);
158
159 Node* value = node->InputAt(2); 179 Node* value = node->InputAt(2);
160 DCHECK(HasReplacementLow(value)); 180 DCHECK(HasReplacementLow(value));
161 DCHECK(HasReplacementHigh(value)); 181 DCHECK(HasReplacementHigh(value));
162 182
163 const Operator* store_op = machine()->Store(StoreRepresentation( 183 const Operator* store_op = machine()->Store(StoreRepresentation(
164 MachineRepresentation::kWord32, write_barrier_kind)); 184 MachineRepresentation::kWord32, write_barrier_kind));
165 185
166 Node* high_node; 186 Node* high_node;
167 if (node->InputCount() > 3) { 187 if (node->InputCount() > 3) {
168 Node* effect_high = node->InputAt(3); 188 Node* effect_high = node->InputAt(3);
169 Node* control_high = node->InputAt(4); 189 Node* control_high = node->InputAt(4);
170 high_node = graph()->NewNode(store_op, base, index_high, 190 high_node = graph()->NewNode(store_op, base, index_high,
171 GetReplacementHigh(value), effect_high, 191 GetReplacementHigh(value), effect_high,
172 control_high); 192 control_high);
173 node->ReplaceInput(3, high_node); 193 node->ReplaceInput(3, high_node);
174 194
175 } else { 195 } else {
176 high_node = graph()->NewNode(store_op, base, index_high, 196 high_node = graph()->NewNode(store_op, base, index_high,
177 GetReplacementHigh(value)); 197 GetReplacementHigh(value));
178 } 198 }
179 199
200 node->ReplaceInput(1, index_low);
180 node->ReplaceInput(2, GetReplacementLow(value)); 201 node->ReplaceInput(2, GetReplacementLow(value));
181 NodeProperties::ChangeOp(node, store_op); 202 NodeProperties::ChangeOp(node, store_op);
182 ReplaceNode(node, node, high_node); 203 ReplaceNode(node, node, high_node);
183 } else { 204 } else {
184 if (HasReplacementLow(node->InputAt(2))) { 205 if (HasReplacementLow(node->InputAt(2))) {
185 node->ReplaceInput(2, GetReplacementLow(node->InputAt(2))); 206 node->ReplaceInput(2, GetReplacementLow(node->InputAt(2)));
186 } 207 }
187 } 208 }
188 break; 209 break;
189 } 210 }
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 case IrOpcode::kBitcastInt64ToFloat64: { 505 case IrOpcode::kBitcastInt64ToFloat64: {
485 DCHECK(node->InputCount() == 1); 506 DCHECK(node->InputCount() == 1);
486 Node* input = node->InputAt(0); 507 Node* input = node->InputAt(0);
487 Node* stack_slot = graph()->NewNode( 508 Node* stack_slot = graph()->NewNode(
488 machine()->StackSlot(MachineRepresentation::kWord64)); 509 machine()->StackSlot(MachineRepresentation::kWord64));
489 510
490 Node* store_high_word = graph()->NewNode( 511 Node* store_high_word = graph()->NewNode(
491 machine()->Store( 512 machine()->Store(
492 StoreRepresentation(MachineRepresentation::kWord32, 513 StoreRepresentation(MachineRepresentation::kWord32,
493 WriteBarrierKind::kNoWriteBarrier)), 514 WriteBarrierKind::kNoWriteBarrier)),
494 stack_slot, graph()->NewNode(common()->Int32Constant(4)), 515 stack_slot,
516 graph()->NewNode(common()->Int32Constant(kHigherWordOffset)),
495 GetReplacementHigh(input), graph()->start(), graph()->start()); 517 GetReplacementHigh(input), graph()->start(), graph()->start());
496 518
497 Node* store_low_word = graph()->NewNode( 519 Node* store_low_word = graph()->NewNode(
498 machine()->Store( 520 machine()->Store(
499 StoreRepresentation(MachineRepresentation::kWord32, 521 StoreRepresentation(MachineRepresentation::kWord32,
500 WriteBarrierKind::kNoWriteBarrier)), 522 WriteBarrierKind::kNoWriteBarrier)),
501 stack_slot, graph()->NewNode(common()->Int32Constant(0)), 523 stack_slot,
524 graph()->NewNode(common()->Int32Constant(kLowerWordOffset)),
502 GetReplacementLow(input), store_high_word, graph()->start()); 525 GetReplacementLow(input), store_high_word, graph()->start());
503 526
504 Node* load = 527 Node* load =
505 graph()->NewNode(machine()->Load(MachineType::Float64()), stack_slot, 528 graph()->NewNode(machine()->Load(MachineType::Float64()), stack_slot,
506 graph()->NewNode(common()->Int32Constant(0)), 529 graph()->NewNode(common()->Int32Constant(0)),
507 store_low_word, graph()->start()); 530 store_low_word, graph()->start());
508 531
509 ReplaceNode(node, load, nullptr); 532 ReplaceNode(node, load, nullptr);
510 break; 533 break;
511 } 534 }
512 case IrOpcode::kBitcastFloat64ToInt64: { 535 case IrOpcode::kBitcastFloat64ToInt64: {
513 DCHECK(node->InputCount() == 1); 536 DCHECK(node->InputCount() == 1);
514 Node* input = node->InputAt(0); 537 Node* input = node->InputAt(0);
515 if (HasReplacementLow(input)) { 538 if (HasReplacementLow(input)) {
516 input = GetReplacementLow(input); 539 input = GetReplacementLow(input);
517 } 540 }
518 Node* stack_slot = graph()->NewNode( 541 Node* stack_slot = graph()->NewNode(
519 machine()->StackSlot(MachineRepresentation::kWord64)); 542 machine()->StackSlot(MachineRepresentation::kWord64));
520 Node* store = graph()->NewNode( 543 Node* store = graph()->NewNode(
521 machine()->Store( 544 machine()->Store(
522 StoreRepresentation(MachineRepresentation::kFloat64, 545 StoreRepresentation(MachineRepresentation::kFloat64,
523 WriteBarrierKind::kNoWriteBarrier)), 546 WriteBarrierKind::kNoWriteBarrier)),
524 stack_slot, graph()->NewNode(common()->Int32Constant(0)), input, 547 stack_slot, graph()->NewNode(common()->Int32Constant(0)), input,
525 graph()->start(), graph()->start()); 548 graph()->start(), graph()->start());
526 549
527 Node* high_node = 550 Node* high_node = graph()->NewNode(
528 graph()->NewNode(machine()->Load(MachineType::Int32()), stack_slot, 551 machine()->Load(MachineType::Int32()), stack_slot,
529 graph()->NewNode(common()->Int32Constant(4)), store, 552 graph()->NewNode(common()->Int32Constant(kHigherWordOffset)), store,
530 graph()->start()); 553 graph()->start());
531 554
532 Node* low_node = 555 Node* low_node = graph()->NewNode(
533 graph()->NewNode(machine()->Load(MachineType::Int32()), stack_slot, 556 machine()->Load(MachineType::Int32()), stack_slot,
534 graph()->NewNode(common()->Int32Constant(0)), store, 557 graph()->NewNode(common()->Int32Constant(kLowerWordOffset)), store,
535 graph()->start()); 558 graph()->start());
536 ReplaceNode(node, low_node, high_node); 559 ReplaceNode(node, low_node, high_node);
537 break; 560 break;
538 } 561 }
539 case IrOpcode::kWord64Ror: { 562 case IrOpcode::kWord64Ror: {
540 DCHECK(node->InputCount() == 2); 563 DCHECK(node->InputCount() == 2);
541 Node* input = node->InputAt(0); 564 Node* input = node->InputAt(0);
542 Node* shift = HasReplacementLow(node->InputAt(1)) 565 Node* shift = HasReplacementLow(node->InputAt(1))
543 ? GetReplacementLow(node->InputAt(1)) 566 ? GetReplacementLow(node->InputAt(1))
544 : node->InputAt(1); 567 : node->InputAt(1);
545 Int32Matcher m(shift); 568 Int32Matcher m(shift);
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 common()->Phi(MachineRepresentation::kWord32, value_count), 823 common()->Phi(MachineRepresentation::kWord32, value_count),
801 value_count + 1, inputs_low, false), 824 value_count + 1, inputs_low, false),
802 graph()->NewNode( 825 graph()->NewNode(
803 common()->Phi(MachineRepresentation::kWord32, value_count), 826 common()->Phi(MachineRepresentation::kWord32, value_count),
804 value_count + 1, inputs_high, false)); 827 value_count + 1, inputs_high, false));
805 } 828 }
806 } 829 }
807 } // namespace compiler 830 } // namespace compiler
808 } // namespace internal 831 } // namespace internal
809 } // namespace v8 832 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/int64-lowering.h ('k') | test/mjsunit/mjsunit.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698