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

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: Address code review remarks. Remove skipped tests 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 int Int64Lowering::GetLowerWordOffset() {
titzer 2016/06/22 16:03:09 Can you go all the way and make these simple stati
ivica.bogosavljevic 2016/06/23 10:56:54 Acknowledged.
117 #if defined(V8_TARGET_LITTLE_ENDIAN)
118 return 0;
119 #elif defined(V8_TARGET_BIG_ENDIAN)
120 return 4;
121 #endif
122 }
123
124 int Int64Lowering::GetHigherWordOffset() {
125 #if defined(V8_TARGET_LITTLE_ENDIAN)
126 return 4;
127 #elif defined(V8_TARGET_BIG_ENDIAN)
128 return 0;
129 #endif
130 }
131
103 void Int64Lowering::LowerNode(Node* node) { 132 void Int64Lowering::LowerNode(Node* node) {
104 switch (node->opcode()) { 133 switch (node->opcode()) {
105 case IrOpcode::kInt64Constant: { 134 case IrOpcode::kInt64Constant: {
106 int64_t value = OpParameter<int64_t>(node); 135 int64_t value = OpParameter<int64_t>(node);
107 Node* low_node = graph()->NewNode( 136 Node* low_node = graph()->NewNode(
108 common()->Int32Constant(static_cast<int32_t>(value & 0xFFFFFFFF))); 137 common()->Int32Constant(static_cast<int32_t>(value & 0xFFFFFFFF)));
109 Node* high_node = graph()->NewNode( 138 Node* high_node = graph()->NewNode(
110 common()->Int32Constant(static_cast<int32_t>(value >> 32))); 139 common()->Int32Constant(static_cast<int32_t>(value >> 32)));
111 ReplaceNode(node, low_node, high_node); 140 ReplaceNode(node, low_node, high_node);
112 break; 141 break;
113 } 142 }
114 case IrOpcode::kLoad: { 143 case IrOpcode::kLoad: {
115 LoadRepresentation load_rep = LoadRepresentationOf(node->op()); 144 LoadRepresentation load_rep = LoadRepresentationOf(node->op());
116 145
117 if (load_rep.representation() == MachineRepresentation::kWord64) { 146 if (load_rep.representation() == MachineRepresentation::kWord64) {
118 Node* base = node->InputAt(0); 147 Node* base = node->InputAt(0);
119 Node* index = node->InputAt(1); 148 Node* index = node->InputAt(1);
120 Node* index_high = 149 Node* index_low;
121 graph()->NewNode(machine()->Int32Add(), index, 150 Node* index_high;
122 graph()->NewNode(common()->Int32Constant(4))); 151 GetIndexNodes(index, index_low, index_high);
123
124 const Operator* load_op = machine()->Load(MachineType::Int32()); 152 const Operator* load_op = machine()->Load(MachineType::Int32());
125 Node* high_node; 153 Node* high_node;
126 if (node->InputCount() > 2) { 154 if (node->InputCount() > 2) {
127 Node* effect_high = node->InputAt(2); 155 Node* effect_high = node->InputAt(2);
128 Node* control_high = node->InputAt(3); 156 Node* control_high = node->InputAt(3);
129 high_node = graph()->NewNode(load_op, base, index_high, effect_high, 157 high_node = graph()->NewNode(load_op, base, index_high, effect_high,
130 control_high); 158 control_high);
131 // change the effect change from old_node --> old_effect to 159 // change the effect change from old_node --> old_effect to
132 // old_node --> high_node --> old_effect. 160 // old_node --> high_node --> old_effect.
133 node->ReplaceInput(2, high_node); 161 node->ReplaceInput(2, high_node);
134 } else { 162 } else {
135 high_node = graph()->NewNode(load_op, base, index_high); 163 high_node = graph()->NewNode(load_op, base, index_high);
136 } 164 }
165 node->ReplaceInput(1, index_low);
137 NodeProperties::ChangeOp(node, load_op); 166 NodeProperties::ChangeOp(node, load_op);
138 ReplaceNode(node, node, high_node); 167 ReplaceNode(node, node, high_node);
139 } else { 168 } else {
140 DefaultLowering(node); 169 DefaultLowering(node);
141 } 170 }
142 break; 171 break;
143 } 172 }
144 case IrOpcode::kStore: { 173 case IrOpcode::kStore: {
145 StoreRepresentation store_rep = StoreRepresentationOf(node->op()); 174 StoreRepresentation store_rep = StoreRepresentationOf(node->op());
146 if (store_rep.representation() == MachineRepresentation::kWord64) { 175 if (store_rep.representation() == MachineRepresentation::kWord64) {
147 // We change the original store node to store the low word, and create 176 // 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 177 // 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 178 // 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. 179 // edge of the original store is redirected to the new store.
151 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind(); 180 WriteBarrierKind write_barrier_kind = store_rep.write_barrier_kind();
152 181
153 Node* base = node->InputAt(0); 182 Node* base = node->InputAt(0);
154 Node* index = node->InputAt(1); 183 Node* index = node->InputAt(1);
155 Node* index_high = 184 Node* index_low;
156 graph()->NewNode(machine()->Int32Add(), index, 185 Node* index_high;
157 graph()->NewNode(common()->Int32Constant(4))); 186 GetIndexNodes(index, index_low, index_high);
158
159 Node* value = node->InputAt(2); 187 Node* value = node->InputAt(2);
160 DCHECK(HasReplacementLow(value)); 188 DCHECK(HasReplacementLow(value));
161 DCHECK(HasReplacementHigh(value)); 189 DCHECK(HasReplacementHigh(value));
162 190
163 const Operator* store_op = machine()->Store(StoreRepresentation( 191 const Operator* store_op = machine()->Store(StoreRepresentation(
164 MachineRepresentation::kWord32, write_barrier_kind)); 192 MachineRepresentation::kWord32, write_barrier_kind));
165 193
166 Node* high_node; 194 Node* high_node;
167 if (node->InputCount() > 3) { 195 if (node->InputCount() > 3) {
168 Node* effect_high = node->InputAt(3); 196 Node* effect_high = node->InputAt(3);
169 Node* control_high = node->InputAt(4); 197 Node* control_high = node->InputAt(4);
170 high_node = graph()->NewNode(store_op, base, index_high, 198 high_node = graph()->NewNode(store_op, base, index_high,
171 GetReplacementHigh(value), effect_high, 199 GetReplacementHigh(value), effect_high,
172 control_high); 200 control_high);
173 node->ReplaceInput(3, high_node); 201 node->ReplaceInput(3, high_node);
174 202
175 } else { 203 } else {
176 high_node = graph()->NewNode(store_op, base, index_high, 204 high_node = graph()->NewNode(store_op, base, index_high,
177 GetReplacementHigh(value)); 205 GetReplacementHigh(value));
178 } 206 }
179 207
208 node->ReplaceInput(1, index_low);
180 node->ReplaceInput(2, GetReplacementLow(value)); 209 node->ReplaceInput(2, GetReplacementLow(value));
181 NodeProperties::ChangeOp(node, store_op); 210 NodeProperties::ChangeOp(node, store_op);
182 ReplaceNode(node, node, high_node); 211 ReplaceNode(node, node, high_node);
183 } else { 212 } else {
184 if (HasReplacementLow(node->InputAt(2))) { 213 if (HasReplacementLow(node->InputAt(2))) {
185 node->ReplaceInput(2, GetReplacementLow(node->InputAt(2))); 214 node->ReplaceInput(2, GetReplacementLow(node->InputAt(2)));
186 } 215 }
187 } 216 }
188 break; 217 break;
189 } 218 }
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 case IrOpcode::kBitcastInt64ToFloat64: { 513 case IrOpcode::kBitcastInt64ToFloat64: {
485 DCHECK(node->InputCount() == 1); 514 DCHECK(node->InputCount() == 1);
486 Node* input = node->InputAt(0); 515 Node* input = node->InputAt(0);
487 Node* stack_slot = graph()->NewNode( 516 Node* stack_slot = graph()->NewNode(
488 machine()->StackSlot(MachineRepresentation::kWord64)); 517 machine()->StackSlot(MachineRepresentation::kWord64));
489 518
490 Node* store_high_word = graph()->NewNode( 519 Node* store_high_word = graph()->NewNode(
491 machine()->Store( 520 machine()->Store(
492 StoreRepresentation(MachineRepresentation::kWord32, 521 StoreRepresentation(MachineRepresentation::kWord32,
493 WriteBarrierKind::kNoWriteBarrier)), 522 WriteBarrierKind::kNoWriteBarrier)),
494 stack_slot, graph()->NewNode(common()->Int32Constant(4)), 523 stack_slot,
524 graph()->NewNode(common()->Int32Constant(GetHigherWordOffset())),
495 GetReplacementHigh(input), graph()->start(), graph()->start()); 525 GetReplacementHigh(input), graph()->start(), graph()->start());
496 526
497 Node* store_low_word = graph()->NewNode( 527 Node* store_low_word = graph()->NewNode(
498 machine()->Store( 528 machine()->Store(
499 StoreRepresentation(MachineRepresentation::kWord32, 529 StoreRepresentation(MachineRepresentation::kWord32,
500 WriteBarrierKind::kNoWriteBarrier)), 530 WriteBarrierKind::kNoWriteBarrier)),
501 stack_slot, graph()->NewNode(common()->Int32Constant(0)), 531 stack_slot,
532 graph()->NewNode(common()->Int32Constant(GetLowerWordOffset())),
502 GetReplacementLow(input), store_high_word, graph()->start()); 533 GetReplacementLow(input), store_high_word, graph()->start());
503 534
504 Node* load = 535 Node* load =
505 graph()->NewNode(machine()->Load(MachineType::Float64()), stack_slot, 536 graph()->NewNode(machine()->Load(MachineType::Float64()), stack_slot,
506 graph()->NewNode(common()->Int32Constant(0)), 537 graph()->NewNode(common()->Int32Constant(0)),
507 store_low_word, graph()->start()); 538 store_low_word, graph()->start());
508 539
509 ReplaceNode(node, load, nullptr); 540 ReplaceNode(node, load, nullptr);
510 break; 541 break;
511 } 542 }
512 case IrOpcode::kBitcastFloat64ToInt64: { 543 case IrOpcode::kBitcastFloat64ToInt64: {
513 DCHECK(node->InputCount() == 1); 544 DCHECK(node->InputCount() == 1);
514 Node* input = node->InputAt(0); 545 Node* input = node->InputAt(0);
515 if (HasReplacementLow(input)) { 546 if (HasReplacementLow(input)) {
516 input = GetReplacementLow(input); 547 input = GetReplacementLow(input);
517 } 548 }
518 Node* stack_slot = graph()->NewNode( 549 Node* stack_slot = graph()->NewNode(
519 machine()->StackSlot(MachineRepresentation::kWord64)); 550 machine()->StackSlot(MachineRepresentation::kWord64));
520 Node* store = graph()->NewNode( 551 Node* store = graph()->NewNode(
521 machine()->Store( 552 machine()->Store(
522 StoreRepresentation(MachineRepresentation::kFloat64, 553 StoreRepresentation(MachineRepresentation::kFloat64,
523 WriteBarrierKind::kNoWriteBarrier)), 554 WriteBarrierKind::kNoWriteBarrier)),
524 stack_slot, graph()->NewNode(common()->Int32Constant(0)), input, 555 stack_slot, graph()->NewNode(common()->Int32Constant(0)), input,
525 graph()->start(), graph()->start()); 556 graph()->start(), graph()->start());
526 557
527 Node* high_node = 558 Node* high_node = graph()->NewNode(
528 graph()->NewNode(machine()->Load(MachineType::Int32()), stack_slot, 559 machine()->Load(MachineType::Int32()), stack_slot,
529 graph()->NewNode(common()->Int32Constant(4)), store, 560 graph()->NewNode(common()->Int32Constant(GetHigherWordOffset())),
530 graph()->start()); 561 store, graph()->start());
531 562
532 Node* low_node = 563 Node* low_node = graph()->NewNode(
533 graph()->NewNode(machine()->Load(MachineType::Int32()), stack_slot, 564 machine()->Load(MachineType::Int32()), stack_slot,
534 graph()->NewNode(common()->Int32Constant(0)), store, 565 graph()->NewNode(common()->Int32Constant(GetLowerWordOffset())),
535 graph()->start()); 566 store, graph()->start());
536 ReplaceNode(node, low_node, high_node); 567 ReplaceNode(node, low_node, high_node);
537 break; 568 break;
538 } 569 }
539 case IrOpcode::kWord64Ror: { 570 case IrOpcode::kWord64Ror: {
540 DCHECK(node->InputCount() == 2); 571 DCHECK(node->InputCount() == 2);
541 Node* input = node->InputAt(0); 572 Node* input = node->InputAt(0);
542 Node* shift = HasReplacementLow(node->InputAt(1)) 573 Node* shift = HasReplacementLow(node->InputAt(1))
543 ? GetReplacementLow(node->InputAt(1)) 574 ? GetReplacementLow(node->InputAt(1))
544 : node->InputAt(1); 575 : node->InputAt(1);
545 Int32Matcher m(shift); 576 Int32Matcher m(shift);
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 common()->Phi(MachineRepresentation::kWord32, value_count), 831 common()->Phi(MachineRepresentation::kWord32, value_count),
801 value_count + 1, inputs_low, false), 832 value_count + 1, inputs_low, false),
802 graph()->NewNode( 833 graph()->NewNode(
803 common()->Phi(MachineRepresentation::kWord32, value_count), 834 common()->Phi(MachineRepresentation::kWord32, value_count),
804 value_count + 1, inputs_high, false)); 835 value_count + 1, inputs_high, false));
805 } 836 }
806 } 837 }
807 } // namespace compiler 838 } // namespace compiler
808 } // namespace internal 839 } // namespace internal
809 } // namespace v8 840 } // 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