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/js-builtin-reducer.h" | 5 #include "src/compiler/js-builtin-reducer.h" |
6 #include "src/compiler/js-graph.h" | 6 #include "src/compiler/js-graph.h" |
7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 #include "src/compiler/simplified-operator.h" | 9 #include "src/compiler/simplified-operator.h" |
10 #include "src/objects-inl.h" | 10 #include "src/objects-inl.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 // b:plain-primitive) -> NumberAtan2(ToNumber(a), | 111 // b:plain-primitive) -> NumberAtan2(ToNumber(a), |
112 // ToNumber(b)) | 112 // ToNumber(b)) |
113 Node* left = ToNumber(r.left()); | 113 Node* left = ToNumber(r.left()); |
114 Node* right = ToNumber(r.right()); | 114 Node* right = ToNumber(r.right()); |
115 Node* value = graph()->NewNode(simplified()->NumberAtan2(), left, right); | 115 Node* value = graph()->NewNode(simplified()->NumberAtan2(), left, right); |
116 return Replace(value); | 116 return Replace(value); |
117 } | 117 } |
118 return NoChange(); | 118 return NoChange(); |
119 } | 119 } |
120 | 120 |
| 121 // ES6 section 20.2.2.7 Math.atanh ( x ) |
| 122 Reduction JSBuiltinReducer::ReduceMathAtanh(Node* node) { |
| 123 JSCallReduction r(node); |
| 124 if (r.InputsMatchOne(Type::Number())) { |
| 125 // Math.atanh(a:number) -> NumberAtanh(a) |
| 126 Node* value = graph()->NewNode(simplified()->NumberAtanh(), r.left()); |
| 127 return Replace(value); |
| 128 } |
| 129 return NoChange(); |
| 130 } |
| 131 |
121 // ES6 section 20.2.2.10 Math.ceil ( x ) | 132 // ES6 section 20.2.2.10 Math.ceil ( x ) |
122 Reduction JSBuiltinReducer::ReduceMathCeil(Node* node) { | 133 Reduction JSBuiltinReducer::ReduceMathCeil(Node* node) { |
123 JSCallReduction r(node); | 134 JSCallReduction r(node); |
124 if (r.InputsMatchOne(Type::PlainPrimitive())) { | 135 if (r.InputsMatchOne(Type::PlainPrimitive())) { |
125 // Math.ceil(a:plain-primitive) -> NumberCeil(ToNumber(a)) | 136 // Math.ceil(a:plain-primitive) -> NumberCeil(ToNumber(a)) |
126 Node* input = ToNumber(r.GetJSCallInput(0)); | 137 Node* input = ToNumber(r.GetJSCallInput(0)); |
127 Node* value = graph()->NewNode(simplified()->NumberCeil(), input); | 138 Node* value = graph()->NewNode(simplified()->NumberCeil(), input); |
128 return Replace(value); | 139 return Replace(value); |
129 } | 140 } |
130 return NoChange(); | 141 return NoChange(); |
(...skipping 16 matching lines...) Expand all Loading... |
147 JSCallReduction r(node); | 158 JSCallReduction r(node); |
148 if (r.InputsMatchOne(Type::PlainPrimitive())) { | 159 if (r.InputsMatchOne(Type::PlainPrimitive())) { |
149 // Math.exp(a:plain-primitive) -> NumberExp(ToNumber(a)) | 160 // Math.exp(a:plain-primitive) -> NumberExp(ToNumber(a)) |
150 Node* input = ToNumber(r.GetJSCallInput(0)); | 161 Node* input = ToNumber(r.GetJSCallInput(0)); |
151 Node* value = graph()->NewNode(simplified()->NumberExp(), input); | 162 Node* value = graph()->NewNode(simplified()->NumberExp(), input); |
152 return Replace(value); | 163 return Replace(value); |
153 } | 164 } |
154 return NoChange(); | 165 return NoChange(); |
155 } | 166 } |
156 | 167 |
| 168 // ES6 section 20.2.2.15 Math.expm1 ( x ) |
| 169 Reduction JSBuiltinReducer::ReduceMathExpm1(Node* node) { |
| 170 JSCallReduction r(node); |
| 171 if (r.InputsMatchOne(Type::Number())) { |
| 172 // Math.expm1(a:number) -> NumberExpm1(a) |
| 173 Node* value = graph()->NewNode(simplified()->NumberExpm1(), r.left()); |
| 174 return Replace(value); |
| 175 } |
| 176 return NoChange(); |
| 177 } |
| 178 |
157 // ES6 section 20.2.2.16 Math.floor ( x ) | 179 // ES6 section 20.2.2.16 Math.floor ( x ) |
158 Reduction JSBuiltinReducer::ReduceMathFloor(Node* node) { | 180 Reduction JSBuiltinReducer::ReduceMathFloor(Node* node) { |
159 JSCallReduction r(node); | 181 JSCallReduction r(node); |
160 if (r.InputsMatchOne(Type::PlainPrimitive())) { | 182 if (r.InputsMatchOne(Type::PlainPrimitive())) { |
161 // Math.floor(a:plain-primitive) -> NumberFloor(ToNumber(a)) | 183 // Math.floor(a:plain-primitive) -> NumberFloor(ToNumber(a)) |
162 Node* input = ToNumber(r.GetJSCallInput(0)); | 184 Node* input = ToNumber(r.GetJSCallInput(0)); |
163 Node* value = graph()->NewNode(simplified()->NumberFloor(), input); | 185 Node* value = graph()->NewNode(simplified()->NumberFloor(), input); |
164 return Replace(value); | 186 return Replace(value); |
165 } | 187 } |
166 return NoChange(); | 188 return NoChange(); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 Reduction JSBuiltinReducer::ReduceMathLog10(Node* node) { | 308 Reduction JSBuiltinReducer::ReduceMathLog10(Node* node) { |
287 JSCallReduction r(node); | 309 JSCallReduction r(node); |
288 if (r.InputsMatchOne(Type::Number())) { | 310 if (r.InputsMatchOne(Type::Number())) { |
289 // Math.log10(a:number) -> NumberLog10(a) | 311 // Math.log10(a:number) -> NumberLog10(a) |
290 Node* value = graph()->NewNode(simplified()->NumberLog10(), r.left()); | 312 Node* value = graph()->NewNode(simplified()->NumberLog10(), r.left()); |
291 return Replace(value); | 313 return Replace(value); |
292 } | 314 } |
293 return NoChange(); | 315 return NoChange(); |
294 } | 316 } |
295 | 317 |
| 318 // ES6 section 20.2.2.9 Math.cbrt ( x ) |
| 319 Reduction JSBuiltinReducer::ReduceMathCbrt(Node* node) { |
| 320 JSCallReduction r(node); |
| 321 if (r.InputsMatchOne(Type::Number())) { |
| 322 // Math.cbrt(a:number) -> NumberCbrt(a) |
| 323 Node* value = graph()->NewNode(simplified()->NumberCbrt(), r.left()); |
| 324 return Replace(value); |
| 325 } |
| 326 return NoChange(); |
| 327 } |
| 328 |
296 // ES6 section 20.2.2.28 Math.round ( x ) | 329 // ES6 section 20.2.2.28 Math.round ( x ) |
297 Reduction JSBuiltinReducer::ReduceMathRound(Node* node) { | 330 Reduction JSBuiltinReducer::ReduceMathRound(Node* node) { |
298 JSCallReduction r(node); | 331 JSCallReduction r(node); |
299 if (r.InputsMatchOne(Type::PlainPrimitive())) { | 332 if (r.InputsMatchOne(Type::PlainPrimitive())) { |
300 // Math.round(a:plain-primitive) -> NumberRound(ToNumber(a)) | 333 // Math.round(a:plain-primitive) -> NumberRound(ToNumber(a)) |
301 Node* input = ToNumber(r.GetJSCallInput(0)); | 334 Node* input = ToNumber(r.GetJSCallInput(0)); |
302 Node* value = graph()->NewNode(simplified()->NumberRound(), input); | 335 Node* value = graph()->NewNode(simplified()->NumberRound(), input); |
303 return Replace(value); | 336 return Replace(value); |
304 } | 337 } |
305 return NoChange(); | 338 return NoChange(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 | 380 |
348 // Dispatch according to the BuiltinFunctionId if present. | 381 // Dispatch according to the BuiltinFunctionId if present. |
349 if (!r.HasBuiltinFunctionId()) return NoChange(); | 382 if (!r.HasBuiltinFunctionId()) return NoChange(); |
350 switch (r.GetBuiltinFunctionId()) { | 383 switch (r.GetBuiltinFunctionId()) { |
351 case kMathAtan: | 384 case kMathAtan: |
352 reduction = ReduceMathAtan(node); | 385 reduction = ReduceMathAtan(node); |
353 break; | 386 break; |
354 case kMathAtan2: | 387 case kMathAtan2: |
355 reduction = ReduceMathAtan2(node); | 388 reduction = ReduceMathAtan2(node); |
356 break; | 389 break; |
| 390 case kMathAtanh: |
| 391 reduction = ReduceMathAtanh(node); |
| 392 break; |
357 case kMathClz32: | 393 case kMathClz32: |
358 reduction = ReduceMathClz32(node); | 394 reduction = ReduceMathClz32(node); |
359 break; | 395 break; |
360 case kMathCeil: | 396 case kMathCeil: |
361 reduction = ReduceMathCeil(node); | 397 reduction = ReduceMathCeil(node); |
362 break; | 398 break; |
363 case kMathExp: | 399 case kMathExp: |
364 reduction = ReduceMathExp(node); | 400 reduction = ReduceMathExp(node); |
365 break; | 401 break; |
| 402 case kMathExpm1: |
| 403 reduction = ReduceMathExpm1(node); |
| 404 break; |
366 case kMathFloor: | 405 case kMathFloor: |
367 reduction = ReduceMathFloor(node); | 406 reduction = ReduceMathFloor(node); |
368 break; | 407 break; |
369 case kMathFround: | 408 case kMathFround: |
370 reduction = ReduceMathFround(node); | 409 reduction = ReduceMathFround(node); |
371 break; | 410 break; |
372 case kMathImul: | 411 case kMathImul: |
373 reduction = ReduceMathImul(node); | 412 reduction = ReduceMathImul(node); |
374 break; | 413 break; |
375 case kMathLog: | 414 case kMathLog: |
376 reduction = ReduceMathLog(node); | 415 reduction = ReduceMathLog(node); |
377 break; | 416 break; |
378 case kMathLog1p: | 417 case kMathLog1p: |
379 reduction = ReduceMathLog1p(node); | 418 reduction = ReduceMathLog1p(node); |
380 break; | 419 break; |
381 case kMathLog2: | 420 case kMathLog2: |
382 reduction = ReduceMathLog2(node); | 421 reduction = ReduceMathLog2(node); |
383 break; | 422 break; |
384 case kMathLog10: | 423 case kMathLog10: |
385 reduction = ReduceMathLog10(node); | 424 reduction = ReduceMathLog10(node); |
386 break; | 425 break; |
387 case kMathMax: | 426 case kMathMax: |
388 reduction = ReduceMathMax(node); | 427 reduction = ReduceMathMax(node); |
389 break; | 428 break; |
390 case kMathMin: | 429 case kMathMin: |
391 reduction = ReduceMathMin(node); | 430 reduction = ReduceMathMin(node); |
392 break; | 431 break; |
| 432 case kMathCbrt: |
| 433 reduction = ReduceMathCbrt(node); |
| 434 break; |
393 case kMathRound: | 435 case kMathRound: |
394 reduction = ReduceMathRound(node); | 436 reduction = ReduceMathRound(node); |
395 break; | 437 break; |
396 case kMathSqrt: | 438 case kMathSqrt: |
397 reduction = ReduceMathSqrt(node); | 439 reduction = ReduceMathSqrt(node); |
398 break; | 440 break; |
399 case kMathTrunc: | 441 case kMathTrunc: |
400 reduction = ReduceMathTrunc(node); | 442 reduction = ReduceMathTrunc(node); |
401 break; | 443 break; |
402 case kStringFromCharCode: | 444 case kStringFromCharCode: |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 } | 479 } |
438 | 480 |
439 | 481 |
440 SimplifiedOperatorBuilder* JSBuiltinReducer::simplified() const { | 482 SimplifiedOperatorBuilder* JSBuiltinReducer::simplified() const { |
441 return jsgraph()->simplified(); | 483 return jsgraph()->simplified(); |
442 } | 484 } |
443 | 485 |
444 } // namespace compiler | 486 } // namespace compiler |
445 } // namespace internal | 487 } // namespace internal |
446 } // namespace v8 | 488 } // namespace v8 |
OLD | NEW |