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

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

Issue 1884713003: [turbofan] Change number operations to handle Undefined as well. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Tweaks Created 4 years, 8 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
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/simplified-lowering.h" 5 #include "src/compiler/simplified-lowering.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 : preferred_(preferred), truncation_(truncation) {} 77 : preferred_(preferred), truncation_(truncation) {}
78 static UseInfo TruncatingWord32() { 78 static UseInfo TruncatingWord32() {
79 return UseInfo(MachineRepresentation::kWord32, Truncation::Word32()); 79 return UseInfo(MachineRepresentation::kWord32, Truncation::Word32());
80 } 80 }
81 static UseInfo TruncatingWord64() { 81 static UseInfo TruncatingWord64() {
82 return UseInfo(MachineRepresentation::kWord64, Truncation::Word64()); 82 return UseInfo(MachineRepresentation::kWord64, Truncation::Word64());
83 } 83 }
84 static UseInfo Bool() { 84 static UseInfo Bool() {
85 return UseInfo(MachineRepresentation::kBit, Truncation::Bool()); 85 return UseInfo(MachineRepresentation::kBit, Truncation::Bool());
86 } 86 }
87 static UseInfo Float32() { 87 static UseInfo TruncatingFloat32() {
88 return UseInfo(MachineRepresentation::kFloat32, Truncation::Float32()); 88 return UseInfo(MachineRepresentation::kFloat32, Truncation::Float32());
89 } 89 }
90 static UseInfo Float64() { 90 static UseInfo TruncatingFloat64() {
91 return UseInfo(MachineRepresentation::kFloat64, Truncation::Float64()); 91 return UseInfo(MachineRepresentation::kFloat64, Truncation::Float64());
92 } 92 }
93 static UseInfo PointerInt() { 93 static UseInfo PointerInt() {
94 return kPointerSize == 4 ? TruncatingWord32() : TruncatingWord64(); 94 return kPointerSize == 4 ? TruncatingWord32() : TruncatingWord64();
95 } 95 }
96 static UseInfo AnyTagged() { 96 static UseInfo AnyTagged() {
97 return UseInfo(MachineRepresentation::kTagged, Truncation::Any()); 97 return UseInfo(MachineRepresentation::kTagged, Truncation::Any());
98 } 98 }
99 99
100 // Undetermined representation. 100 // Undetermined representation.
(...skipping 14 matching lines...) Expand all
115 MachineRepresentation preferred_; 115 MachineRepresentation preferred_;
116 Truncation truncation_; 116 Truncation truncation_;
117 }; 117 };
118 118
119 119
120 UseInfo TruncatingUseInfoFromRepresentation(MachineRepresentation rep) { 120 UseInfo TruncatingUseInfoFromRepresentation(MachineRepresentation rep) {
121 switch (rep) { 121 switch (rep) {
122 case MachineRepresentation::kTagged: 122 case MachineRepresentation::kTagged:
123 return UseInfo::AnyTagged(); 123 return UseInfo::AnyTagged();
124 case MachineRepresentation::kFloat64: 124 case MachineRepresentation::kFloat64:
125 return UseInfo::Float64(); 125 return UseInfo::TruncatingFloat64();
126 case MachineRepresentation::kFloat32: 126 case MachineRepresentation::kFloat32:
127 return UseInfo::Float32(); 127 return UseInfo::TruncatingFloat32();
128 case MachineRepresentation::kWord64: 128 case MachineRepresentation::kWord64:
129 return UseInfo::TruncatingWord64(); 129 return UseInfo::TruncatingWord64();
130 case MachineRepresentation::kWord8: 130 case MachineRepresentation::kWord8:
131 case MachineRepresentation::kWord16: 131 case MachineRepresentation::kWord16:
132 case MachineRepresentation::kWord32: 132 case MachineRepresentation::kWord32:
133 return UseInfo::TruncatingWord32(); 133 return UseInfo::TruncatingWord32();
134 case MachineRepresentation::kBit: 134 case MachineRepresentation::kBit:
135 return UseInfo::Bool(); 135 return UseInfo::Bool();
136 case MachineRepresentation::kSimd128: // Fall through. 136 case MachineRepresentation::kSimd128: // Fall through.
137 case MachineRepresentation::kNone: 137 case MachineRepresentation::kNone:
138 break; 138 break;
139 } 139 }
140 UNREACHABLE(); 140 UNREACHABLE();
141 return UseInfo::None(); 141 return UseInfo::None();
142 } 142 }
143 143
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 } 504 }
505 505
506 // Helper for leaf nodes. 506 // Helper for leaf nodes.
507 void VisitLeaf(Node* node, MachineRepresentation output) { 507 void VisitLeaf(Node* node, MachineRepresentation output) {
508 DCHECK_EQ(0, node->InputCount()); 508 DCHECK_EQ(0, node->InputCount());
509 SetOutput(node, output); 509 SetOutput(node, output);
510 } 510 }
511 511
512 // Helpers for specific types of binops. 512 // Helpers for specific types of binops.
513 void VisitFloat64Binop(Node* node) { 513 void VisitFloat64Binop(Node* node) {
514 VisitBinop(node, UseInfo::Float64(), MachineRepresentation::kFloat64); 514 VisitBinop(node, UseInfo::TruncatingFloat64(),
515 MachineRepresentation::kFloat64);
515 } 516 }
516 void VisitInt32Binop(Node* node) { 517 void VisitInt32Binop(Node* node) {
517 VisitBinop(node, UseInfo::TruncatingWord32(), 518 VisitBinop(node, UseInfo::TruncatingWord32(),
518 MachineRepresentation::kWord32); 519 MachineRepresentation::kWord32);
519 } 520 }
520 void VisitWord32TruncatingBinop(Node* node) { 521 void VisitWord32TruncatingBinop(Node* node) {
521 VisitBinop(node, UseInfo::TruncatingWord32(), 522 VisitBinop(node, UseInfo::TruncatingWord32(),
522 MachineRepresentation::kWord32); 523 MachineRepresentation::kWord32);
523 } 524 }
524 void VisitUint32Binop(Node* node) { 525 void VisitUint32Binop(Node* node) {
525 VisitBinop(node, UseInfo::TruncatingWord32(), 526 VisitBinop(node, UseInfo::TruncatingWord32(),
526 MachineRepresentation::kWord32); 527 MachineRepresentation::kWord32);
527 } 528 }
528 void VisitInt64Binop(Node* node) { 529 void VisitInt64Binop(Node* node) {
529 VisitBinop(node, UseInfo::TruncatingWord64(), 530 VisitBinop(node, UseInfo::TruncatingWord64(),
530 MachineRepresentation::kWord64); 531 MachineRepresentation::kWord64);
531 } 532 }
532 void VisitUint64Binop(Node* node) { 533 void VisitUint64Binop(Node* node) {
533 VisitBinop(node, UseInfo::TruncatingWord64(), 534 VisitBinop(node, UseInfo::TruncatingWord64(),
534 MachineRepresentation::kWord64); 535 MachineRepresentation::kWord64);
535 } 536 }
536 void VisitFloat64Cmp(Node* node) { 537 void VisitFloat64Cmp(Node* node) {
537 VisitBinop(node, UseInfo::Float64(), MachineRepresentation::kBit); 538 VisitBinop(node, UseInfo::TruncatingFloat64(), MachineRepresentation::kBit);
538 } 539 }
539 void VisitInt32Cmp(Node* node) { 540 void VisitInt32Cmp(Node* node) {
540 VisitBinop(node, UseInfo::TruncatingWord32(), MachineRepresentation::kBit); 541 VisitBinop(node, UseInfo::TruncatingWord32(), MachineRepresentation::kBit);
541 } 542 }
542 void VisitUint32Cmp(Node* node) { 543 void VisitUint32Cmp(Node* node) {
543 VisitBinop(node, UseInfo::TruncatingWord32(), MachineRepresentation::kBit); 544 VisitBinop(node, UseInfo::TruncatingWord32(), MachineRepresentation::kBit);
544 } 545 }
545 void VisitInt64Cmp(Node* node) { 546 void VisitInt64Cmp(Node* node) {
546 VisitBinop(node, UseInfo::TruncatingWord64(), MachineRepresentation::kBit); 547 VisitBinop(node, UseInfo::TruncatingWord64(), MachineRepresentation::kBit);
547 } 548 }
548 void VisitUint64Cmp(Node* node) { 549 void VisitUint64Cmp(Node* node) {
549 VisitBinop(node, UseInfo::TruncatingWord64(), MachineRepresentation::kBit); 550 VisitBinop(node, UseInfo::TruncatingWord64(), MachineRepresentation::kBit);
550 } 551 }
551 552
552 // Infer representation for phi-like nodes. 553 // Infer representation for phi-like nodes.
553 MachineRepresentation GetOutputInfoForPhi(Node* node, Truncation use) { 554 MachineRepresentation GetOutputInfoForPhi(Node* node, Truncation use) {
554 // Compute the representation. 555 // Compute the representation.
555 Type* type = GetUpperBound(node); 556 Type* type = GetUpperBound(node);
556 if (type->Is(Type::None())) { 557 if (type->Is(Type::None())) {
557 return MachineRepresentation::kNone; 558 return MachineRepresentation::kNone;
558 } else if (type->Is(Type::Signed32()) || type->Is(Type::Unsigned32())) { 559 } else if (type->Is(Type::Signed32()) || type->Is(Type::Unsigned32())) {
559 return MachineRepresentation::kWord32; 560 return MachineRepresentation::kWord32;
560 } else if (use.TruncatesToWord32()) { 561 } else if (use.TruncatesToWord32()) {
561 return MachineRepresentation::kWord32; 562 return MachineRepresentation::kWord32;
562 } else if (type->Is(Type::Boolean())) { 563 } else if (type->Is(Type::Boolean())) {
563 return MachineRepresentation::kBit; 564 return MachineRepresentation::kBit;
564 } else if (type->Is(Type::Number())) { 565 } else if (type->Is(Type::Number())) {
565 return MachineRepresentation::kFloat64; 566 return MachineRepresentation::kFloat64;
567 } else if (use.TruncatesToFloat64()) {
568 return MachineRepresentation::kFloat64;
566 } else if (type->Is(Type::Internal())) { 569 } else if (type->Is(Type::Internal())) {
567 // We mark (u)int64 as Type::Internal. 570 // We mark (u)int64 as Type::Internal.
568 // TODO(jarin) This is a workaround for our lack of (u)int64 571 // TODO(jarin) This is a workaround for our lack of (u)int64
569 // types. This can be removed once we can represent (u)int64 572 // types. This can be removed once we can represent (u)int64
570 // unambiguously. (At the moment internal objects, such as the hole, 573 // unambiguously. (At the moment internal objects, such as the hole,
571 // are also Type::Internal()). 574 // are also Type::Internal()).
572 bool is_word64 = GetInfo(node->InputAt(0))->representation() == 575 bool is_word64 = GetInfo(node->InputAt(0))->representation() ==
573 MachineRepresentation::kWord64; 576 MachineRepresentation::kWord64;
574 #ifdef DEBUG 577 #ifdef DEBUG
575 // Check that all the inputs agree on being Word64. 578 // Check that all the inputs agree on being Word64.
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 } 965 }
963 break; 966 break;
964 } 967 }
965 case IrOpcode::kNumberClz32: { 968 case IrOpcode::kNumberClz32: {
966 VisitUnop(node, UseInfo::TruncatingWord32(), 969 VisitUnop(node, UseInfo::TruncatingWord32(),
967 MachineRepresentation::kWord32); 970 MachineRepresentation::kWord32);
968 if (lower()) NodeProperties::ChangeOp(node, Uint32Op(node)); 971 if (lower()) NodeProperties::ChangeOp(node, Uint32Op(node));
969 break; 972 break;
970 } 973 }
971 case IrOpcode::kNumberCeil: { 974 case IrOpcode::kNumberCeil: {
972 VisitUnop(node, UseInfo::Float64(), MachineRepresentation::kFloat64); 975 VisitUnop(node, UseInfo::TruncatingFloat64(),
976 MachineRepresentation::kFloat64);
973 if (lower()) DeferReplacement(node, lowering->Float64Ceil(node)); 977 if (lower()) DeferReplacement(node, lowering->Float64Ceil(node));
974 break; 978 break;
975 } 979 }
976 case IrOpcode::kNumberFloor: { 980 case IrOpcode::kNumberFloor: {
977 VisitUnop(node, UseInfo::Float64(), MachineRepresentation::kFloat64); 981 VisitUnop(node, UseInfo::TruncatingFloat64(),
982 MachineRepresentation::kFloat64);
978 if (lower()) DeferReplacement(node, lowering->Float64Floor(node)); 983 if (lower()) DeferReplacement(node, lowering->Float64Floor(node));
979 break; 984 break;
980 } 985 }
981 case IrOpcode::kNumberRound: { 986 case IrOpcode::kNumberRound: {
982 VisitUnop(node, UseInfo::Float64(), MachineRepresentation::kFloat64); 987 VisitUnop(node, UseInfo::TruncatingFloat64(),
988 MachineRepresentation::kFloat64);
983 if (lower()) DeferReplacement(node, lowering->Float64Round(node)); 989 if (lower()) DeferReplacement(node, lowering->Float64Round(node));
984 break; 990 break;
985 } 991 }
986 case IrOpcode::kNumberTrunc: { 992 case IrOpcode::kNumberTrunc: {
987 VisitUnop(node, UseInfo::Float64(), MachineRepresentation::kFloat64); 993 VisitUnop(node, UseInfo::TruncatingFloat64(),
994 MachineRepresentation::kFloat64);
988 if (lower()) DeferReplacement(node, lowering->Float64Trunc(node)); 995 if (lower()) DeferReplacement(node, lowering->Float64Trunc(node));
989 break; 996 break;
990 } 997 }
991 case IrOpcode::kNumberToInt32: { 998 case IrOpcode::kNumberToInt32: {
992 // Just change representation if necessary. 999 // Just change representation if necessary.
993 VisitUnop(node, UseInfo::TruncatingWord32(), 1000 VisitUnop(node, UseInfo::TruncatingWord32(),
994 MachineRepresentation::kWord32); 1001 MachineRepresentation::kWord32);
995 if (lower()) DeferReplacement(node, node->InputAt(0)); 1002 if (lower()) DeferReplacement(node, node->InputAt(0));
996 break; 1003 break;
997 } 1004 }
998 case IrOpcode::kNumberToUint32: { 1005 case IrOpcode::kNumberToUint32: {
999 // Just change representation if necessary. 1006 // Just change representation if necessary.
1000 VisitUnop(node, UseInfo::TruncatingWord32(), 1007 VisitUnop(node, UseInfo::TruncatingWord32(),
1001 MachineRepresentation::kWord32); 1008 MachineRepresentation::kWord32);
1002 if (lower()) DeferReplacement(node, node->InputAt(0)); 1009 if (lower()) DeferReplacement(node, node->InputAt(0));
1003 break; 1010 break;
1004 } 1011 }
1005 case IrOpcode::kNumberIsHoleNaN: { 1012 case IrOpcode::kNumberIsHoleNaN: {
1006 VisitUnop(node, UseInfo::Float64(), MachineRepresentation::kBit); 1013 VisitUnop(node, UseInfo::TruncatingFloat64(),
1014 MachineRepresentation::kBit);
1007 if (lower()) { 1015 if (lower()) {
1008 // NumberIsHoleNaN(x) => Word32Equal(Float64ExtractLowWord32(x), 1016 // NumberIsHoleNaN(x) => Word32Equal(Float64ExtractLowWord32(x),
1009 // #HoleNaNLower32) 1017 // #HoleNaNLower32)
1010 node->ReplaceInput(0, 1018 node->ReplaceInput(0,
1011 jsgraph_->graph()->NewNode( 1019 jsgraph_->graph()->NewNode(
1012 lowering->machine()->Float64ExtractLowWord32(), 1020 lowering->machine()->Float64ExtractLowWord32(),
1013 node->InputAt(0))); 1021 node->InputAt(0)));
1014 node->AppendInput(jsgraph_->zone(), 1022 node->AppendInput(jsgraph_->zone(),
1015 jsgraph_->Int32Constant(kHoleNanLower32)); 1023 jsgraph_->Int32Constant(kHoleNanLower32));
1016 NodeProperties::ChangeOp(node, jsgraph_->machine()->Word32Equal()); 1024 NodeProperties::ChangeOp(node, jsgraph_->machine()->Word32Equal());
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1147 // the load's representation. 1155 // the load's representation.
1148 output = access.machine_type().representation(); 1156 output = access.machine_type().representation();
1149 } else { 1157 } else {
1150 // If undefined is truncated to a number, but the use can 1158 // If undefined is truncated to a number, but the use can
1151 // observe NaN, we need to output at least the float32 1159 // observe NaN, we need to output at least the float32
1152 // representation. 1160 // representation.
1153 if (access.machine_type().representation() == 1161 if (access.machine_type().representation() ==
1154 MachineRepresentation::kFloat32) { 1162 MachineRepresentation::kFloat32) {
1155 output = access.machine_type().representation(); 1163 output = access.machine_type().representation();
1156 } else { 1164 } else {
1157 if (access.machine_type().representation() !=
1158 MachineRepresentation::kFloat64) {
1159 // TODO(bmeurer): See comment on abort_compilation_.
1160 if (lower()) lowering->abort_compilation_ = true;
1161 }
1162 output = MachineRepresentation::kFloat64; 1165 output = MachineRepresentation::kFloat64;
1163 } 1166 }
1164 } 1167 }
1165 } else { 1168 } else {
1166 // TODO(bmeurer): See comment on abort_compilation_.
1167 if (lower()) lowering->abort_compilation_ = true;
1168
1169 // If undefined is not truncated away, we need to have the tagged 1169 // If undefined is not truncated away, we need to have the tagged
1170 // representation. 1170 // representation.
1171 output = MachineRepresentation::kTagged; 1171 output = MachineRepresentation::kTagged;
1172 } 1172 }
1173 SetOutput(node, output); 1173 SetOutput(node, output);
1174 if (lower()) lowering->DoLoadBuffer(node, output, changer_); 1174 if (lower()) lowering->DoLoadBuffer(node, output, changer_);
1175 break; 1175 break;
1176 } 1176 }
1177 case IrOpcode::kStoreBuffer: { 1177 case IrOpcode::kStoreBuffer: {
1178 BufferAccess access = BufferAccessOf(node->op()); 1178 BufferAccess access = BufferAccessOf(node->op());
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
1310 return VisitBinop(node, UseInfo::TruncatingWord64(), 1310 return VisitBinop(node, UseInfo::TruncatingWord64(),
1311 MachineRepresentation::kBit); 1311 MachineRepresentation::kBit);
1312 1312
1313 case IrOpcode::kChangeInt32ToInt64: 1313 case IrOpcode::kChangeInt32ToInt64:
1314 return VisitUnop(node, UseInfo::TruncatingWord32(), 1314 return VisitUnop(node, UseInfo::TruncatingWord32(),
1315 MachineRepresentation::kWord64); 1315 MachineRepresentation::kWord64);
1316 case IrOpcode::kChangeUint32ToUint64: 1316 case IrOpcode::kChangeUint32ToUint64:
1317 return VisitUnop(node, UseInfo::TruncatingWord32(), 1317 return VisitUnop(node, UseInfo::TruncatingWord32(),
1318 MachineRepresentation::kWord64); 1318 MachineRepresentation::kWord64);
1319 case IrOpcode::kTruncateFloat64ToFloat32: 1319 case IrOpcode::kTruncateFloat64ToFloat32:
1320 return VisitUnop(node, UseInfo::Float64(), 1320 return VisitUnop(node, UseInfo::TruncatingFloat64(),
1321 MachineRepresentation::kFloat32); 1321 MachineRepresentation::kFloat32);
1322 case IrOpcode::kTruncateFloat64ToInt32: 1322 case IrOpcode::kTruncateFloat64ToInt32:
1323 return VisitUnop(node, UseInfo::Float64(), 1323 return VisitUnop(node, UseInfo::TruncatingFloat64(),
1324 MachineRepresentation::kWord32); 1324 MachineRepresentation::kWord32);
1325 1325
1326 case IrOpcode::kChangeFloat32ToFloat64: 1326 case IrOpcode::kChangeFloat32ToFloat64:
1327 return VisitUnop(node, UseInfo::Float32(), 1327 UNREACHABLE();
1328 return VisitUnop(node, UseInfo::TruncatingFloat32(),
1328 MachineRepresentation::kFloat64); 1329 MachineRepresentation::kFloat64);
1329 case IrOpcode::kChangeInt32ToFloat64: 1330 case IrOpcode::kChangeInt32ToFloat64:
1330 return VisitUnop(node, UseInfo::TruncatingWord32(), 1331 return VisitUnop(node, UseInfo::TruncatingWord32(),
1331 MachineRepresentation::kFloat64); 1332 MachineRepresentation::kFloat64);
1332 case IrOpcode::kChangeUint32ToFloat64: 1333 case IrOpcode::kChangeUint32ToFloat64:
1333 return VisitUnop(node, UseInfo::TruncatingWord32(), 1334 return VisitUnop(node, UseInfo::TruncatingWord32(),
1334 MachineRepresentation::kFloat64); 1335 MachineRepresentation::kFloat64);
1335 case IrOpcode::kFloat64Add: 1336 case IrOpcode::kFloat64Add:
1336 case IrOpcode::kFloat64Sub: 1337 case IrOpcode::kFloat64Sub:
1337 case IrOpcode::kFloat64Mul: 1338 case IrOpcode::kFloat64Mul:
1338 case IrOpcode::kFloat64Div: 1339 case IrOpcode::kFloat64Div:
1339 case IrOpcode::kFloat64Mod: 1340 case IrOpcode::kFloat64Mod:
1340 case IrOpcode::kFloat64Min: 1341 case IrOpcode::kFloat64Min:
1341 return VisitFloat64Binop(node); 1342 return VisitFloat64Binop(node);
1342 case IrOpcode::kFloat64Abs: 1343 case IrOpcode::kFloat64Abs:
1343 case IrOpcode::kFloat64Sqrt: 1344 case IrOpcode::kFloat64Sqrt:
1344 case IrOpcode::kFloat64RoundDown: 1345 case IrOpcode::kFloat64RoundDown:
1345 case IrOpcode::kFloat64RoundTruncate: 1346 case IrOpcode::kFloat64RoundTruncate:
1346 case IrOpcode::kFloat64RoundTiesAway: 1347 case IrOpcode::kFloat64RoundTiesAway:
1347 case IrOpcode::kFloat64RoundUp: 1348 case IrOpcode::kFloat64RoundUp:
1348 return VisitUnop(node, UseInfo::Float64(), 1349 return VisitUnop(node, UseInfo::TruncatingFloat64(),
1349 MachineRepresentation::kFloat64); 1350 MachineRepresentation::kFloat64);
1350 case IrOpcode::kFloat64Equal: 1351 case IrOpcode::kFloat64Equal:
1351 case IrOpcode::kFloat64LessThan: 1352 case IrOpcode::kFloat64LessThan:
1352 case IrOpcode::kFloat64LessThanOrEqual: 1353 case IrOpcode::kFloat64LessThanOrEqual:
1353 return VisitFloat64Cmp(node); 1354 return VisitFloat64Cmp(node);
1354 case IrOpcode::kFloat64ExtractLowWord32: 1355 case IrOpcode::kFloat64ExtractLowWord32:
1355 case IrOpcode::kFloat64ExtractHighWord32: 1356 case IrOpcode::kFloat64ExtractHighWord32:
1356 return VisitUnop(node, UseInfo::Float64(), 1357 return VisitUnop(node, UseInfo::TruncatingFloat64(),
1357 MachineRepresentation::kWord32); 1358 MachineRepresentation::kWord32);
1358 case IrOpcode::kFloat64InsertLowWord32: 1359 case IrOpcode::kFloat64InsertLowWord32:
1359 case IrOpcode::kFloat64InsertHighWord32: 1360 case IrOpcode::kFloat64InsertHighWord32:
1360 return VisitBinop(node, UseInfo::Float64(), UseInfo::TruncatingWord32(), 1361 return VisitBinop(node, UseInfo::TruncatingFloat64(),
1362 UseInfo::TruncatingWord32(),
1361 MachineRepresentation::kFloat64); 1363 MachineRepresentation::kFloat64);
1362 case IrOpcode::kLoadStackPointer: 1364 case IrOpcode::kLoadStackPointer:
1363 case IrOpcode::kLoadFramePointer: 1365 case IrOpcode::kLoadFramePointer:
1364 case IrOpcode::kLoadParentFramePointer: 1366 case IrOpcode::kLoadParentFramePointer:
1365 return VisitLeaf(node, MachineType::PointerRepresentation()); 1367 return VisitLeaf(node, MachineType::PointerRepresentation());
1366 case IrOpcode::kStateValues: 1368 case IrOpcode::kStateValues:
1367 VisitStateValues(node); 1369 VisitStateValues(node);
1368 break; 1370 break;
1369 1371
1370 // The following opcodes are not produced before representation 1372 // The following opcodes are not produced before representation
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 ? graph()->NewNode(machine()->ChangeUint32ToUint64(), offset) 1496 ? graph()->NewNode(machine()->ChangeUint32ToUint64(), offset)
1495 : offset; 1497 : offset;
1496 1498
1497 Node* check = graph()->NewNode(machine()->Uint32LessThan(), offset, length); 1499 Node* check = graph()->NewNode(machine()->Uint32LessThan(), offset, length);
1498 Node* branch = 1500 Node* branch =
1499 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); 1501 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control);
1500 1502
1501 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 1503 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
1502 Node* etrue = graph()->NewNode(machine()->Load(access_type), buffer, index, 1504 Node* etrue = graph()->NewNode(machine()->Load(access_type), buffer, index,
1503 effect, if_true); 1505 effect, if_true);
1506 Type* element_type =
1507 Type::Intersect(NodeProperties::GetType(node), Type::Number(), zone());
1504 Node* vtrue = changer->GetRepresentationFor( 1508 Node* vtrue = changer->GetRepresentationFor(
1505 etrue, access_type.representation(), NodeProperties::GetType(node), 1509 etrue, access_type.representation(), element_type, output_rep,
1506 output_rep, Truncation::None()); 1510 Truncation::None());
1507 1511
1508 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); 1512 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
1509 Node* efalse = effect; 1513 Node* efalse = effect;
1510 Node* vfalse; 1514 Node* vfalse;
1511 if (output_rep == MachineRepresentation::kTagged) { 1515 if (output_rep == MachineRepresentation::kTagged) {
1512 vfalse = jsgraph()->UndefinedConstant(); 1516 vfalse = jsgraph()->UndefinedConstant();
1513 } else if (output_rep == MachineRepresentation::kFloat64) { 1517 } else if (output_rep == MachineRepresentation::kFloat64) {
1514 vfalse = 1518 vfalse =
1515 jsgraph()->Float64Constant(std::numeric_limits<double>::quiet_NaN()); 1519 jsgraph()->Float64Constant(std::numeric_limits<double>::quiet_NaN());
1516 } else if (output_rep == MachineRepresentation::kFloat32) { 1520 } else if (output_rep == MachineRepresentation::kFloat32) {
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after
2190 if (!rhs_type->Is(type_cache_.kZeroToThirtyOne)) { 2194 if (!rhs_type->Is(type_cache_.kZeroToThirtyOne)) {
2191 node->ReplaceInput(1, graph()->NewNode(machine()->Word32And(), rhs, 2195 node->ReplaceInput(1, graph()->NewNode(machine()->Word32And(), rhs,
2192 jsgraph()->Int32Constant(0x1f))); 2196 jsgraph()->Int32Constant(0x1f)));
2193 } 2197 }
2194 NodeProperties::ChangeOp(node, op); 2198 NodeProperties::ChangeOp(node, op);
2195 } 2199 }
2196 2200
2197 } // namespace compiler 2201 } // namespace compiler
2198 } // namespace internal 2202 } // namespace internal
2199 } // namespace v8 2203 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698