| 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/diamond.h" | 5 #include "src/compiler/diamond.h" |
| 6 #include "src/compiler/js-builtin-reducer.h" | 6 #include "src/compiler/js-builtin-reducer.h" |
| 7 #include "src/compiler/js-graph.h" | 7 #include "src/compiler/js-graph.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/compiler/node-properties.h" | 9 #include "src/compiler/node-properties.h" |
| 10 #include "src/types.h" | 10 #include "src/types.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 | 93 |
| 94 private: | 94 private: |
| 95 Node* node_; | 95 Node* node_; |
| 96 }; | 96 }; |
| 97 | 97 |
| 98 | 98 |
| 99 JSBuiltinReducer::JSBuiltinReducer(JSGraph* jsgraph) | 99 JSBuiltinReducer::JSBuiltinReducer(JSGraph* jsgraph) |
| 100 : jsgraph_(jsgraph), simplified_(jsgraph->zone()) {} | 100 : jsgraph_(jsgraph), simplified_(jsgraph->zone()) {} |
| 101 | 101 |
| 102 | 102 |
| 103 // ECMA-262, section 15.8.2.1. | |
| 104 Reduction JSBuiltinReducer::ReduceMathAbs(Node* node) { | |
| 105 JSCallReduction r(node); | |
| 106 if (r.InputsMatchOne(Type::Unsigned32())) { | |
| 107 // Math.abs(a:uint32) -> a | |
| 108 return Replace(r.left()); | |
| 109 } | |
| 110 if (r.InputsMatchOne(Type::Number())) { | |
| 111 // Math.abs(a:number) -> (a > 0 ? a : 0 - a) | |
| 112 Node* const value = r.left(); | |
| 113 Node* const zero = jsgraph()->ZeroConstant(); | |
| 114 return Replace(graph()->NewNode( | |
| 115 common()->Select(kMachNone), | |
| 116 graph()->NewNode(simplified()->NumberLessThan(), zero, value), value, | |
| 117 graph()->NewNode(simplified()->NumberSubtract(), zero, value))); | |
| 118 } | |
| 119 return NoChange(); | |
| 120 } | |
| 121 | |
| 122 | |
| 123 // ECMA-262, section 15.8.2.17. | |
| 124 Reduction JSBuiltinReducer::ReduceMathSqrt(Node* node) { | |
| 125 JSCallReduction r(node); | |
| 126 if (r.InputsMatchOne(Type::Number())) { | |
| 127 // Math.sqrt(a:number) -> Float64Sqrt(a) | |
| 128 Node* value = graph()->NewNode(machine()->Float64Sqrt(), r.left()); | |
| 129 return Replace(value); | |
| 130 } | |
| 131 return NoChange(); | |
| 132 } | |
| 133 | |
| 134 | |
| 135 // ECMA-262, section 15.8.2.11. | 103 // ECMA-262, section 15.8.2.11. |
| 136 Reduction JSBuiltinReducer::ReduceMathMax(Node* node) { | 104 Reduction JSBuiltinReducer::ReduceMathMax(Node* node) { |
| 137 JSCallReduction r(node); | 105 JSCallReduction r(node); |
| 138 if (r.InputsMatchZero()) { | 106 if (r.InputsMatchZero()) { |
| 139 // Math.max() -> -Infinity | 107 // Math.max() -> -Infinity |
| 140 return Replace(jsgraph()->Constant(-V8_INFINITY)); | 108 return Replace(jsgraph()->Constant(-V8_INFINITY)); |
| 141 } | 109 } |
| 142 if (r.InputsMatchOne(Type::Number())) { | 110 if (r.InputsMatchOne(Type::Number())) { |
| 143 // Math.max(a:number) -> a | 111 // Math.max(a:number) -> a |
| 144 return Replace(r.left()); | 112 return Replace(r.left()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 return NoChange(); | 151 return NoChange(); |
| 184 } | 152 } |
| 185 | 153 |
| 186 | 154 |
| 187 Reduction JSBuiltinReducer::Reduce(Node* node) { | 155 Reduction JSBuiltinReducer::Reduce(Node* node) { |
| 188 JSCallReduction r(node); | 156 JSCallReduction r(node); |
| 189 | 157 |
| 190 // Dispatch according to the BuiltinFunctionId if present. | 158 // Dispatch according to the BuiltinFunctionId if present. |
| 191 if (!r.HasBuiltinFunctionId()) return NoChange(); | 159 if (!r.HasBuiltinFunctionId()) return NoChange(); |
| 192 switch (r.GetBuiltinFunctionId()) { | 160 switch (r.GetBuiltinFunctionId()) { |
| 193 case kMathAbs: | |
| 194 return ReplaceWithPureReduction(node, ReduceMathAbs(node)); | |
| 195 case kMathSqrt: | |
| 196 return ReplaceWithPureReduction(node, ReduceMathSqrt(node)); | |
| 197 case kMathMax: | 161 case kMathMax: |
| 198 return ReplaceWithPureReduction(node, ReduceMathMax(node)); | 162 return ReplaceWithPureReduction(node, ReduceMathMax(node)); |
| 199 case kMathImul: | 163 case kMathImul: |
| 200 return ReplaceWithPureReduction(node, ReduceMathImul(node)); | 164 return ReplaceWithPureReduction(node, ReduceMathImul(node)); |
| 201 case kMathFround: | 165 case kMathFround: |
| 202 return ReplaceWithPureReduction(node, ReduceMathFround(node)); | 166 return ReplaceWithPureReduction(node, ReduceMathFround(node)); |
| 203 default: | 167 default: |
| 204 break; | 168 break; |
| 205 } | 169 } |
| 206 return NoChange(); | 170 return NoChange(); |
| 207 } | 171 } |
| 208 | 172 |
| 209 | 173 |
| 210 Graph* JSBuiltinReducer::graph() const { return jsgraph()->graph(); } | 174 Graph* JSBuiltinReducer::graph() const { return jsgraph()->graph(); } |
| 211 | 175 |
| 212 | 176 |
| 213 CommonOperatorBuilder* JSBuiltinReducer::common() const { | 177 CommonOperatorBuilder* JSBuiltinReducer::common() const { |
| 214 return jsgraph()->common(); | 178 return jsgraph()->common(); |
| 215 } | 179 } |
| 216 | 180 |
| 217 | 181 |
| 218 MachineOperatorBuilder* JSBuiltinReducer::machine() const { | 182 MachineOperatorBuilder* JSBuiltinReducer::machine() const { |
| 219 return jsgraph()->machine(); | 183 return jsgraph()->machine(); |
| 220 } | 184 } |
| 221 | 185 |
| 222 } // namespace compiler | 186 } // namespace compiler |
| 223 } // namespace internal | 187 } // namespace internal |
| 224 } // namespace v8 | 188 } // namespace v8 |
| OLD | NEW |