| 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/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 822 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   833       case IrOpcode::kNumberShiftRightLogical: { |   833       case IrOpcode::kNumberShiftRightLogical: { | 
|   834         VisitBinop(node, UseInfo::TruncatingWord32(), |   834         VisitBinop(node, UseInfo::TruncatingWord32(), | 
|   835                    UseInfo::TruncatingWord32(), kMachUint32); |   835                    UseInfo::TruncatingWord32(), kMachUint32); | 
|   836         if (lower()) lowering->DoShift(node, lowering->machine()->Word32Shr()); |   836         if (lower()) lowering->DoShift(node, lowering->machine()->Word32Shr()); | 
|   837         break; |   837         break; | 
|   838       } |   838       } | 
|   839       case IrOpcode::kNumberToInt32: { |   839       case IrOpcode::kNumberToInt32: { | 
|   840         MachineTypeUnion use_rep = use & kRepMask; |   840         MachineTypeUnion use_rep = use & kRepMask; | 
|   841         Node* input = node->InputAt(0); |   841         Node* input = node->InputAt(0); | 
|   842         Type* in_upper = NodeProperties::GetType(input); |   842         Type* in_upper = NodeProperties::GetType(input); | 
|   843         MachineTypeUnion in = GetInfo(input)->output; |  | 
|   844         if (in_upper->Is(Type::Signed32())) { |   843         if (in_upper->Is(Type::Signed32())) { | 
|   845           // If the input has type int32, pass through representation. |   844           // If the input has type int32, pass through representation. | 
|   846           VisitUnop(node, UseInfoFromRepresentation(use_rep), |   845           VisitUnop(node, UseInfoFromRepresentation(use_rep), | 
|   847                     kTypeInt32 | use_rep); |   846                     kTypeInt32 | use_rep); | 
|   848           if (lower()) DeferReplacement(node, node->InputAt(0)); |   847           if (lower()) DeferReplacement(node, node->InputAt(0)); | 
|   849         } else if ((in & kTypeMask) == kTypeUint32 || |   848         } else { | 
|   850                    in_upper->Is(Type::Unsigned32())) { |  | 
|   851           // Just change representation if necessary. |   849           // Just change representation if necessary. | 
|   852           VisitUnop(node, UseInfo::TruncatingWord32(), kTypeInt32 | kRepWord32); |   850           VisitUnop(node, UseInfo::TruncatingWord32(), kMachInt32); | 
|   853           if (lower()) DeferReplacement(node, node->InputAt(0)); |   851           if (lower()) DeferReplacement(node, node->InputAt(0)); | 
|   854         } else if ((in & kTypeMask) == kTypeInt32 || |  | 
|   855                    (in & kRepMask) == kRepWord32) { |  | 
|   856           // Just change representation if necessary. |  | 
|   857           VisitUnop(node, UseInfo::TruncatingWord32(), kTypeInt32 | kRepWord32); |  | 
|   858           if (lower()) DeferReplacement(node, node->InputAt(0)); |  | 
|   859         } else { |  | 
|   860           // Require the input in float64 format and perform truncation. |  | 
|   861           // TODO(turbofan): avoid a truncation with a smi check. |  | 
|   862           VisitUnop(node, UseInfo::Float64TruncatingToWord32(), |  | 
|   863                     kTypeInt32 | kRepWord32); |  | 
|   864           if (lower()) { |  | 
|   865             NodeProperties::ChangeOp( |  | 
|   866                 node, lowering->machine()->TruncateFloat64ToInt32( |  | 
|   867                           TruncationMode::kJavaScript)); |  | 
|   868           } |  | 
|   869         } |   852         } | 
|   870         break; |   853         break; | 
|   871       } |   854       } | 
|   872       case IrOpcode::kNumberToUint32: { |   855       case IrOpcode::kNumberToUint32: { | 
|   873         MachineTypeUnion use_rep = use & kRepMask; |   856         MachineTypeUnion use_rep = use & kRepMask; | 
|   874         Node* input = node->InputAt(0); |   857         Node* input = node->InputAt(0); | 
|   875         Type* in_upper = NodeProperties::GetType(input); |   858         Type* in_upper = NodeProperties::GetType(input); | 
|   876         MachineTypeUnion in = GetInfo(input)->output; |  | 
|   877         if (in_upper->Is(Type::Unsigned32())) { |   859         if (in_upper->Is(Type::Unsigned32())) { | 
|   878           // If the input has type uint32, pass through representation. |   860           // If the input has type uint32, pass through representation. | 
|   879           VisitUnop(node, UseInfoFromRepresentation(use_rep), |   861           VisitUnop(node, UseInfoFromRepresentation(use_rep), | 
|   880                     kTypeUint32 | use_rep); |   862                     kTypeUint32 | use_rep); | 
|   881           if (lower()) DeferReplacement(node, node->InputAt(0)); |   863           if (lower()) DeferReplacement(node, node->InputAt(0)); | 
|   882         } else if ((in & kTypeMask) == kTypeInt32 || |   864         } else { | 
|   883                    in_upper->Is(Type::Signed32())) { |  | 
|   884           // Just change representation if necessary. |   865           // Just change representation if necessary. | 
|   885           VisitUnop(node, UseInfo::TruncatingWord32(), |   866           VisitUnop(node, UseInfo::TruncatingWord32(), kMachUint32); | 
|   886                     kTypeUint32 | kRepWord32); |  | 
|   887           if (lower()) DeferReplacement(node, node->InputAt(0)); |   867           if (lower()) DeferReplacement(node, node->InputAt(0)); | 
|   888         } else if ((in & kTypeMask) == kTypeUint32 || |  | 
|   889                    (in & kRepMask) == kRepWord32) { |  | 
|   890           // Just change representation if necessary. |  | 
|   891           VisitUnop(node, UseInfo::TruncatingWord32(), |  | 
|   892                     kTypeUint32 | kRepWord32); |  | 
|   893           if (lower()) DeferReplacement(node, node->InputAt(0)); |  | 
|   894         } else { |  | 
|   895           // Require the input in float64 format and perform truncation. |  | 
|   896           // TODO(turbofan): avoid a truncation with a smi check. |  | 
|   897           VisitUnop(node, UseInfo::Float64TruncatingToWord32(), |  | 
|   898                     kTypeUint32 | kRepWord32); |  | 
|   899           if (lower()) { |  | 
|   900             NodeProperties::ChangeOp( |  | 
|   901                 node, lowering->machine()->TruncateFloat64ToInt32( |  | 
|   902                           TruncationMode::kJavaScript)); |  | 
|   903           } |  | 
|   904         } |   868         } | 
|   905         break; |   869         break; | 
|   906       } |   870       } | 
|   907       case IrOpcode::kNumberIsHoleNaN: { |   871       case IrOpcode::kNumberIsHoleNaN: { | 
|   908         VisitUnop(node, UseInfo::Float64(), kMachBool); |   872         VisitUnop(node, UseInfo::Float64(), kMachBool); | 
|   909         if (lower()) { |   873         if (lower()) { | 
|   910           // NumberIsHoleNaN(x) => Word32Equal(Float64ExtractLowWord32(x), |   874           // NumberIsHoleNaN(x) => Word32Equal(Float64ExtractLowWord32(x), | 
|   911           //                                   #HoleNaNLower32) |   875           //                                   #HoleNaNLower32) | 
|   912           node->ReplaceInput(0, |   876           node->ReplaceInput(0, | 
|   913                              jsgraph_->graph()->NewNode( |   877                              jsgraph_->graph()->NewNode( | 
| (...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1705   ReplaceEffectUses(node, comparison); |  1669   ReplaceEffectUses(node, comparison); | 
|  1706   node->ReplaceInput(0, comparison); |  1670   node->ReplaceInput(0, comparison); | 
|  1707   node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); |  1671   node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | 
|  1708   node->TrimInputCount(2); |  1672   node->TrimInputCount(2); | 
|  1709   NodeProperties::ChangeOp(node, machine()->IntLessThanOrEqual()); |  1673   NodeProperties::ChangeOp(node, machine()->IntLessThanOrEqual()); | 
|  1710 } |  1674 } | 
|  1711  |  1675  | 
|  1712 }  // namespace compiler |  1676 }  // namespace compiler | 
|  1713 }  // namespace internal |  1677 }  // namespace internal | 
|  1714 }  // namespace v8 |  1678 }  // namespace v8 | 
| OLD | NEW |