OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 4137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4148 CONVERT_DOUBLE_CHECKED(x, args[0]); | 4148 CONVERT_DOUBLE_CHECKED(x, args[0]); |
4149 | 4149 |
4150 // If the second argument is a smi, it is much faster to call the | 4150 // If the second argument is a smi, it is much faster to call the |
4151 // custom powi() function than the generic pow(). | 4151 // custom powi() function than the generic pow(). |
4152 if (args[1]->IsSmi()) { | 4152 if (args[1]->IsSmi()) { |
4153 int y = Smi::cast(args[1])->value(); | 4153 int y = Smi::cast(args[1])->value(); |
4154 return Heap::AllocateHeapNumber(powi(x, y)); | 4154 return Heap::AllocateHeapNumber(powi(x, y)); |
4155 } | 4155 } |
4156 | 4156 |
4157 CONVERT_DOUBLE_CHECKED(y, args[1]); | 4157 CONVERT_DOUBLE_CHECKED(y, args[1]); |
4158 if (y == 0.5) { | 4158 |
4159 // It's not uncommon to use Math.pow(x, 0.5) to compute the square | 4159 if (!isinf(x)) { |
4160 // root of a number. To speed up such computations, we explictly | 4160 if (y == 0.5) { |
4161 // check for this case and use the sqrt() function which is faster | 4161 // It's not uncommon to use Math.pow(x, 0.5) to compute the |
4162 // than pow(). | 4162 // square root of a number. To speed up such computations, we |
4163 return Heap::AllocateHeapNumber(sqrt(x)); | 4163 // explictly check for this case and use the sqrt() function |
4164 } else if (y == -0.5) { | 4164 // which is faster than pow(). |
4165 // Optimized using Math.pow(x, -0.5) == 1 / Math.pow(x, 0.5). | 4165 return Heap::AllocateHeapNumber(sqrt(x)); |
4166 return Heap::AllocateHeapNumber(1.0 / sqrt(x)); | 4166 } else if (y == -0.5) { |
4167 } else if (y == 0) { | 4167 // Optimized using Math.pow(x, -0.5) == 1 / Math.pow(x, 0.5). |
| 4168 return Heap::AllocateHeapNumber(1.0 / sqrt(x)); |
| 4169 } |
| 4170 } |
| 4171 |
| 4172 if (y == 0) { |
4168 return Smi::FromInt(1); | 4173 return Smi::FromInt(1); |
4169 } else if (isnan(y) || ((x == 1 || x == -1) && isinf(y))) { | 4174 } else if (isnan(y) || ((x == 1 || x == -1) && isinf(y))) { |
4170 return Heap::nan_value(); | 4175 return Heap::nan_value(); |
4171 } else { | 4176 } else { |
4172 return Heap::AllocateHeapNumber(pow(x, y)); | 4177 return Heap::AllocateHeapNumber(pow(x, y)); |
4173 } | 4178 } |
4174 } | 4179 } |
4175 | 4180 |
4176 | 4181 |
4177 static Object* Runtime_Math_round(Arguments args) { | 4182 static Object* Runtime_Math_round(Arguments args) { |
(...skipping 3378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7556 } else { | 7561 } else { |
7557 // Handle last resort GC and make sure to allow future allocations | 7562 // Handle last resort GC and make sure to allow future allocations |
7558 // to grow the heap without causing GCs (if possible). | 7563 // to grow the heap without causing GCs (if possible). |
7559 Counters::gc_last_resort_from_js.Increment(); | 7564 Counters::gc_last_resort_from_js.Increment(); |
7560 Heap::CollectAllGarbage(); | 7565 Heap::CollectAllGarbage(); |
7561 } | 7566 } |
7562 } | 7567 } |
7563 | 7568 |
7564 | 7569 |
7565 } } // namespace v8::internal | 7570 } } // namespace v8::internal |
OLD | NEW |