<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[180098] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/180098">180098</a></dd>
<dt>Author</dt> <dd>benjamin@webkit.org</dd>
<dt>Date</dt> <dd>2015-02-13 20:20:21 -0800 (Fri, 13 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add a DFG node for the Pow Intrinsics
https://bugs.webkit.org/show_bug.cgi?id=141540

Patch by Benjamin Poulain &lt;bpoulain@apple.com&gt; on 2015-02-13
Reviewed by Filip Pizlo.

Add a DFG Node for PowIntrinsic. This patch covers the basic cases
need to avoid massive regression. I will iterate over the node to cover
the missing types.

With this patch I get the following progressions on benchmarks:
-LongSpider's math-partial-sums: +5%.
-Kraken's imaging-darkroom: +17%
-AsmBench's cray.c: +6.6%
-CompressionBench: +2.2% globally.

* dfg/DFGAbstractInterpreterInlines.h:
(JSC::DFG::AbstractInterpreter&lt;AbstractStateType&gt;::executeEffects):
Cover a couple of trivial cases:
-If the exponent is zero, the result is always one, regardless of the base.
-If both arguments are constants, compute the result at compile time.

* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleIntrinsic):
* dfg/DFGClobberize.h:
(JSC::DFG::clobberize):
* dfg/DFGDoesGC.cpp:
(JSC::DFG::doesGC):

* dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
We only support 2 basic cases at this time:
-Math.pow(double, int)
-Math.pow(double, double).

I'll cover Math.pow(int, int) in a follow up.

* dfg/DFGNode.h:
(JSC::DFG::Node::convertToArithSqrt):
(JSC::DFG::Node::arithNodeFlags):
* dfg/DFGNodeType.h:
* dfg/DFGPredictionPropagationPhase.cpp:
(JSC::DFG::PredictionPropagationPhase::propagate):
(JSC::DFG::PredictionPropagationPhase::doDoubleVoting):
* dfg/DFGSafeToExecute.h:
(JSC::DFG::safeToExecute):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::compileArithPowIntegerFastPath):
(JSC::DFG::SpeculativeJIT::compileArithPow):
* dfg/DFGSpeculativeJIT.h:
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* dfg/DFGStrengthReductionPhase.cpp:
(JSC::DFG::StrengthReductionPhase::handleNode):
* dfg/DFGValidate.cpp:
(JSC::DFG::Validate::validate):
* ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* ftl/FTLIntrinsicRepository.h:
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::compileNode):
(JSC::FTL::LowerDFGToLLVM::compileArithPow):
* ftl/FTLOutput.h:
(JSC::FTL::Output::doublePow):
(JSC::FTL::Output::doublePowi):
* jit/JITOperations.cpp:
* jit/JITOperations.h:
* runtime/MathObject.cpp:
(JSC::mathProtoFuncPow):
(JSC::isDenormal): Deleted.
(JSC::isEdgeCase): Deleted.
(JSC::mathPow): Deleted.

* tests/stress/math-pow-basics.js: Added.
* tests/stress/math-pow-integer-exponent-fastpath.js: Added.
* tests/stress/math-pow-nan-behaviors.js: Added.
* tests/stress/math-pow-with-constants.js: Added.
Start some basic testing of Math.pow().
Due to the various transform, the value change when the code tiers up,
I covered this by checking for approximate values.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeSpeculatedTypecpp">trunk/Source/JavaScriptCore/bytecode/SpeculatedType.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeSpeculatedTypeh">trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGAbstractInterpreterInlinesh">trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp">trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGClobberizeh">trunk/Source/JavaScriptCore/dfg/DFGClobberize.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGDoesGCcpp">trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGFixupPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeh">trunk/Source/JavaScriptCore/dfg/DFGNode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGNodeTypeh">trunk/Source/JavaScriptCore/dfg/DFGNodeType.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGPredictionPropagationPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSafeToExecuteh">trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJITh">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp">trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGStrengthReductionPhasecpp">trunk/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGValidatecpp">trunk/Source/JavaScriptCore/dfg/DFGValidate.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLCapabilitiescpp">trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLIntrinsicRepositoryh">trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp">trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLOutputh">trunk/Source/JavaScriptCore/ftl/FTLOutput.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITOperationscpp">trunk/Source/JavaScriptCore/jit/JITOperations.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitJITOperationsh">trunk/Source/JavaScriptCore/jit/JITOperations.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreruntimeMathObjectcpp">trunk/Source/JavaScriptCore/runtime/MathObject.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoretestsstressmathpowbasicsjs">trunk/Source/JavaScriptCore/tests/stress/math-pow-basics.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressmathpowintegerexponentfastpathjs">trunk/Source/JavaScriptCore/tests/stress/math-pow-integer-exponent-fastpath.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressmathpownanbehaviorsjs">trunk/Source/JavaScriptCore/tests/stress/math-pow-nan-behaviors.js</a></li>
<li><a href="#trunkSourceJavaScriptCoretestsstressmathpowwithconstantsjs">trunk/Source/JavaScriptCore/tests/stress/math-pow-with-constants.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -1,5 +1,89 @@
</span><span class="cx"> 2015-02-13  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Add a DFG node for the Pow Intrinsics
+        https://bugs.webkit.org/show_bug.cgi?id=141540
+
+        Reviewed by Filip Pizlo.
+
+        Add a DFG Node for PowIntrinsic. This patch covers the basic cases
+        need to avoid massive regression. I will iterate over the node to cover
+        the missing types.
+
+        With this patch I get the following progressions on benchmarks:
+        -LongSpider's math-partial-sums: +5%.
+        -Kraken's imaging-darkroom: +17%
+        -AsmBench's cray.c: +6.6%
+        -CompressionBench: +2.2% globally.
+
+        * dfg/DFGAbstractInterpreterInlines.h:
+        (JSC::DFG::AbstractInterpreter&lt;AbstractStateType&gt;::executeEffects):
+        Cover a couple of trivial cases:
+        -If the exponent is zero, the result is always one, regardless of the base.
+        -If both arguments are constants, compute the result at compile time.
+
+        * dfg/DFGByteCodeParser.cpp:
+        (JSC::DFG::ByteCodeParser::handleIntrinsic):
+        * dfg/DFGClobberize.h:
+        (JSC::DFG::clobberize):
+        * dfg/DFGDoesGC.cpp:
+        (JSC::DFG::doesGC):
+
+        * dfg/DFGFixupPhase.cpp:
+        (JSC::DFG::FixupPhase::fixupNode):
+        We only support 2 basic cases at this time:
+        -Math.pow(double, int)
+        -Math.pow(double, double).
+
+        I'll cover Math.pow(int, int) in a follow up.
+
+        * dfg/DFGNode.h:
+        (JSC::DFG::Node::convertToArithSqrt):
+        (JSC::DFG::Node::arithNodeFlags):
+        * dfg/DFGNodeType.h:
+        * dfg/DFGPredictionPropagationPhase.cpp:
+        (JSC::DFG::PredictionPropagationPhase::propagate):
+        (JSC::DFG::PredictionPropagationPhase::doDoubleVoting):
+        * dfg/DFGSafeToExecute.h:
+        (JSC::DFG::safeToExecute):
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::compileArithPowIntegerFastPath):
+        (JSC::DFG::SpeculativeJIT::compileArithPow):
+        * dfg/DFGSpeculativeJIT.h:
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::compile):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::compile):
+        * dfg/DFGStrengthReductionPhase.cpp:
+        (JSC::DFG::StrengthReductionPhase::handleNode):
+        * dfg/DFGValidate.cpp:
+        (JSC::DFG::Validate::validate):
+        * ftl/FTLCapabilities.cpp:
+        (JSC::FTL::canCompile):
+        * ftl/FTLIntrinsicRepository.h:
+        * ftl/FTLLowerDFGToLLVM.cpp:
+        (JSC::FTL::LowerDFGToLLVM::compileNode):
+        (JSC::FTL::LowerDFGToLLVM::compileArithPow):
+        * ftl/FTLOutput.h:
+        (JSC::FTL::Output::doublePow):
+        (JSC::FTL::Output::doublePowi):
+        * jit/JITOperations.cpp:
+        * jit/JITOperations.h:
+        * runtime/MathObject.cpp:
+        (JSC::mathProtoFuncPow):
+        (JSC::isDenormal): Deleted.
+        (JSC::isEdgeCase): Deleted.
+        (JSC::mathPow): Deleted.
+
+        * tests/stress/math-pow-basics.js: Added.
+        * tests/stress/math-pow-integer-exponent-fastpath.js: Added.
+        * tests/stress/math-pow-nan-behaviors.js: Added.
+        * tests/stress/math-pow-with-constants.js: Added.
+        Start some basic testing of Math.pow().
+        Due to the various transform, the value change when the code tiers up,
+        I covered this by checking for approximate values.
+
+2015-02-13  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
+
</ins><span class="cx">         ArithSqrt should not be conditional on supportsFloatingPointSqrt
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=141546
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeSpeculatedTypecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/SpeculatedType.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/SpeculatedType.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/bytecode/SpeculatedType.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -508,6 +508,15 @@
</span><span class="cx">     return value;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SpeculatedType typeOfDoublePow(SpeculatedType xValue, SpeculatedType yValue)
+{
+    // Math.pow() always return NaN if the exponent is NaN, unlike std::pow().
+    // We always set a pure NaN in that case.
+    if (yValue &amp; SpecDoubleNaN)
+        xValue |= SpecDoublePureNaN;
+    return polluteDouble(xValue);
+}
+
</ins><span class="cx"> SpeculatedType typeOfDoubleBinaryOp(SpeculatedType a, SpeculatedType b)
</span><span class="cx"> {
</span><span class="cx">     return polluteDouble(a | b);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeSpeculatedTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -416,6 +416,7 @@
</span><span class="cx"> SpeculatedType typeOfDoubleNegation(SpeculatedType);
</span><span class="cx"> SpeculatedType typeOfDoubleAbs(SpeculatedType);
</span><span class="cx"> SpeculatedType typeOfDoubleFRound(SpeculatedType);
</span><ins>+SpeculatedType typeOfDoublePow(SpeculatedType, SpeculatedType);
</ins><span class="cx"> 
</span><span class="cx"> // This conservatively models the behavior of arbitrary double operations.
</span><span class="cx"> SpeculatedType typeOfDoubleBinaryOp(SpeculatedType, SpeculatedType);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGAbstractInterpreterInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;DFGAbstractInterpreter.h&quot;
</span><span class="cx"> #include &quot;GetByIdStatus.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><ins>+#include &quot;JITOperations.h&quot;
</ins><span class="cx"> #include &quot;Operations.h&quot;
</span><span class="cx"> #include &quot;PutByIdStatus.h&quot;
</span><span class="cx"> #include &quot;StringObject.h&quot;
</span><span class="lines">@@ -718,6 +719,24 @@
</span><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     }
</span><ins>+
+    case ArithPow: {
+        JSValue childY = forNode(node-&gt;child2()).value();
+        if (childY &amp;&amp; childY.isNumber()) {
+            if (!childY.asNumber()) {
+                setConstant(node, jsDoubleNumber(1));
+                break;
+            }
+
+            JSValue childX = forNode(node-&gt;child1()).value();
+            if (childX &amp;&amp; childX.isNumber()) {
+                setConstant(node, jsDoubleNumber(operationMathPow(childX.asNumber(), childY.asNumber())));
+                break;
+            }
+        }
+        forNode(node).setType(typeOfDoublePow(forNode(node-&gt;child1()).m_type, forNode(node-&gt;child2()).m_type));
+        break;
+    }
</ins><span class="cx">             
</span><span class="cx">     case ArithSqrt: {
</span><span class="cx">         JSValue child = forNode(node-&gt;child1()).value();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGByteCodeParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -1684,6 +1684,18 @@
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    case PowIntrinsic: {
+        if (argumentCountIncludingThis &lt; 3) {
+            // Math.pow() and Math.pow(x) return NaN.
+            set(VirtualRegister(resultOperand), addToGraph(JSConstant, OpInfo(m_constantNaN)));
+            return true;
+        }
+        VirtualRegister xOperand = virtualRegisterForArgument(1, registerOffset);
+        VirtualRegister yOperand = virtualRegisterForArgument(2, registerOffset);
+        set(VirtualRegister(resultOperand), addToGraph(ArithPow, get(xOperand), get(yOperand)));
+        return true;
+    }
</ins><span class="cx">         
</span><span class="cx">     case ArrayPushIntrinsic: {
</span><span class="cx">         if (argumentCountIncludingThis != 2)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGClobberizeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGClobberize.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGClobberize.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGClobberize.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -122,6 +122,7 @@
</span><span class="cx">     case ArithAbs:
</span><span class="cx">     case ArithMin:
</span><span class="cx">     case ArithMax:
</span><ins>+    case ArithPow:
</ins><span class="cx">     case ArithSqrt:
</span><span class="cx">     case ArithFRound:
</span><span class="cx">     case ArithSin:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGDoesGCcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGDoesGC.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -81,6 +81,7 @@
</span><span class="cx">     case ArithAbs:
</span><span class="cx">     case ArithMin:
</span><span class="cx">     case ArithMax:
</span><ins>+    case ArithPow:
</ins><span class="cx">     case ArithSqrt:
</span><span class="cx">     case ArithFRound:
</span><span class="cx">     case ArithSin:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGFixupPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -337,6 +337,19 @@
</span><span class="cx">             node-&gt;setResult(NodeResultDouble);
</span><span class="cx">             break;
</span><span class="cx">         }
</span><ins>+
+        case ArithPow: {
+            node-&gt;setResult(NodeResultDouble);
+            if (node-&gt;child2()-&gt;shouldSpeculateInt32OrBooleanForArithmetic()) {
+                fixDoubleOrBooleanEdge(node-&gt;child1());
+                fixIntOrBooleanEdge(node-&gt;child2());
+                break;
+            }
+
+            fixDoubleOrBooleanEdge(node-&gt;child1());
+            fixDoubleOrBooleanEdge(node-&gt;child2());
+            break;
+        }
</ins><span class="cx">             
</span><span class="cx">         case ArithSqrt:
</span><span class="cx">         case ArithFRound:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNode.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNode.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGNode.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -565,6 +565,13 @@
</span><span class="cx">         ASSERT(m_op == ToPrimitive);
</span><span class="cx">         m_op = ToString;
</span><span class="cx">     }
</span><ins>+
+    void convertToArithSqrt()
+    {
+        ASSERT(m_op == ArithPow);
+        child2() = Edge();
+        m_op = ArithSqrt;
+    }
</ins><span class="cx">     
</span><span class="cx">     JSValue asJSValue()
</span><span class="cx">     {
</span><span class="lines">@@ -775,7 +782,7 @@
</span><span class="cx">     NodeFlags arithNodeFlags()
</span><span class="cx">     {
</span><span class="cx">         NodeFlags result = m_flags &amp; NodeArithFlagsMask;
</span><del>-        if (op() == ArithMul || op() == ArithDiv || op() == ArithMod || op() == ArithNegate || op() == DoubleAsInt32)
</del><ins>+        if (op() == ArithMul || op() == ArithDiv || op() == ArithMod || op() == ArithNegate || op() == ArithPow || op() == DoubleAsInt32)
</ins><span class="cx">             return result;
</span><span class="cx">         return result &amp; ~NodeBytecodeNeedsNegZero;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGNodeTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGNodeType.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGNodeType.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGNodeType.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -134,6 +134,7 @@
</span><span class="cx">     macro(ArithMin, NodeResultNumber) \
</span><span class="cx">     macro(ArithMax, NodeResultNumber) \
</span><span class="cx">     macro(ArithFRound, NodeResultNumber) \
</span><ins>+    macro(ArithPow, NodeResultNumber) \
</ins><span class="cx">     macro(ArithSqrt, NodeResultNumber) \
</span><span class="cx">     macro(ArithSin, NodeResultNumber) \
</span><span class="cx">     macro(ArithCos, NodeResultNumber) \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGPredictionPropagationPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -321,7 +321,8 @@
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx">         }
</span><del>-            
</del><ins>+
+        case ArithPow:
</ins><span class="cx">         case ArithSqrt:
</span><span class="cx">         case ArithFRound:
</span><span class="cx">         case ArithSin:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSafeToExecuteh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGSafeToExecute.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -150,6 +150,7 @@
</span><span class="cx">     case ArithAbs:
</span><span class="cx">     case ArithMin:
</span><span class="cx">     case ArithMax:
</span><ins>+    case ArithPow:
</ins><span class="cx">     case ArithSqrt:
</span><span class="cx">     case ArithFRound:
</span><span class="cx">     case ArithSin:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -3560,6 +3560,92 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// For small positive integers , it is worth doing a tiny inline loop to exponentiate the base.
+// Every register is clobbered by this helper.
+static MacroAssembler::Jump compileArithPowIntegerFastPath(JITCompiler&amp; assembler, FPRReg xOperand, GPRReg yOperand, FPRReg result)
+{
+    MacroAssembler::JumpList skipFastPath;
+    skipFastPath.append(assembler.branch32(MacroAssembler::LessThan, yOperand, MacroAssembler::TrustedImm32(0)));
+    skipFastPath.append(assembler.branch32(MacroAssembler::GreaterThan, yOperand, MacroAssembler::TrustedImm32(1000)));
+
+    static const double oneConstant = 1.0;
+    assembler.loadDouble(MacroAssembler::TrustedImmPtr(&amp;oneConstant), result);
+
+    MacroAssembler::Label startLoop(assembler.label());
+    MacroAssembler::Jump exponentIsEven = assembler.branchTest32(MacroAssembler::Zero, yOperand, MacroAssembler::TrustedImm32(1));
+    assembler.mulDouble(xOperand, result);
+    exponentIsEven.link(&amp;assembler);
+    assembler.mulDouble(xOperand, xOperand);
+    assembler.rshift32(MacroAssembler::TrustedImm32(1), yOperand);
+    assembler.branchTest32(MacroAssembler::NonZero, yOperand).linkTo(startLoop, &amp;assembler);
+
+    MacroAssembler::Jump skipSlowPath = assembler.jump();
+    skipFastPath.link(&amp;assembler);
+
+    return skipSlowPath;
+}
+
+void SpeculativeJIT::compileArithPow(Node* node)
+{
+    if (node-&gt;child2().useKind() == Int32Use) {
+        SpeculateDoubleOperand xOperand(this, node-&gt;child1());
+        SpeculateInt32Operand yOperand(this, node-&gt;child2());
+        FPRReg xOperandfpr = xOperand.fpr();
+        GPRReg yOperandGpr = yOperand.gpr();
+        FPRTemporary yOperandfpr(this);
+
+        flushRegisters();
+
+        FPRResult result(this);
+        FPRReg resultFpr = result.fpr();
+
+        FPRTemporary xOperandCopy(this);
+        FPRReg xOperandCopyFpr = xOperandCopy.fpr();
+        m_jit.moveDouble(xOperandfpr, xOperandCopyFpr);
+
+        GPRTemporary counter(this);
+        GPRReg counterGpr = counter.gpr();
+        m_jit.move(yOperandGpr, counterGpr);
+
+        MacroAssembler::Jump skipFallback = compileArithPowIntegerFastPath(m_jit, xOperandCopyFpr, counterGpr, resultFpr);
+        m_jit.convertInt32ToDouble(yOperandGpr, yOperandfpr.fpr());
+        callOperation(operationMathPow, resultFpr, xOperandfpr, yOperandfpr.fpr());
+
+        skipFallback.link(&amp;m_jit);
+        doubleResult(resultFpr, node);
+        return;
+    }
+
+    SpeculateDoubleOperand xOperand(this, node-&gt;child1());
+    SpeculateDoubleOperand yOperand(this, node-&gt;child2());
+    FPRReg xOperandfpr = xOperand.fpr();
+    FPRReg yOperandfpr = yOperand.fpr();
+
+    flushRegisters();
+
+    FPRResult result(this);
+    FPRReg resultFpr = result.fpr();
+
+    FPRTemporary xOperandCopy(this);
+    FPRReg xOperandCopyFpr = xOperandCopy.fpr();
+
+    FPRTemporary scratch(this);
+    FPRReg scratchFpr = scratch.fpr();
+
+    GPRTemporary yOperandInteger(this);
+    GPRReg yOperandIntegerGpr = yOperandInteger.gpr();
+    MacroAssembler::JumpList failedExponentConversionToInteger;
+    m_jit.branchConvertDoubleToInt32(yOperandfpr, yOperandIntegerGpr, failedExponentConversionToInteger, scratchFpr, false);
+
+    m_jit.moveDouble(xOperandfpr, xOperandCopyFpr);
+    MacroAssembler::Jump skipFallback = compileArithPowIntegerFastPath(m_jit, xOperandCopyFpr, yOperandInteger.gpr(), resultFpr);
+    failedExponentConversionToInteger.link(&amp;m_jit);
+
+    callOperation(operationMathPow, resultFpr, xOperandfpr, yOperandfpr);
+    skipFallback.link(&amp;m_jit);
+    doubleResult(resultFpr, node);
+}
+
</ins><span class="cx"> // Returns true if the compare is fused with a subsequent branch.
</span><span class="cx"> bool SpeculativeJIT::compare(Node* node, MacroAssembler::RelationalCondition condition, MacroAssembler::DoubleCondition doubleCondition, S_JITOperation_EJJ operation)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJITh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -2134,6 +2134,7 @@
</span><span class="cx">     void compileArithMul(Node*);
</span><span class="cx">     void compileArithDiv(Node*);
</span><span class="cx">     void compileArithMod(Node*);
</span><ins>+    void compileArithPow(Node*);
</ins><span class="cx">     void compileArithSqrt(Node*);
</span><span class="cx">     void compileConstantStoragePointer(Node*);
</span><span class="cx">     void compileGetIndexedPropertyStorage(Node*);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -1996,6 +1996,11 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    case ArithPow: {
+        compileArithPow(node);
+        break;
+    }
+
</ins><span class="cx">     case ArithAbs: {
</span><span class="cx">         switch (node-&gt;child1().useKind()) {
</span><span class="cx">         case Int32Use: {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -2241,6 +2241,10 @@
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    case ArithPow:
+        compileArithPow(node);
+        break;
+
</ins><span class="cx">     case ArithSqrt:
</span><span class="cx">         compileArithSqrt(node);
</span><span class="cx">         break;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGStrengthReductionPhasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -132,7 +132,20 @@
</span><span class="cx">                 }
</span><span class="cx">             }
</span><span class="cx">             break;
</span><del>-            
</del><ins>+
+        case ArithPow:
+            if (m_node-&gt;child2()-&gt;isNumberConstant()) {
+                double yOperandValue = m_node-&gt;child2()-&gt;asNumber();
+                if (yOperandValue == 1) {
+                    convertToIdentityOverChild1();
+                } else if (yOperandValue == 0.5) {
+                    m_insertionSet.insertNode(m_nodeIndex, SpecNone, Phantom, m_node-&gt;origin, m_node-&gt;children);
+                    m_node-&gt;convertToArithSqrt();
+                    m_changed = true;
+                }
+            }
+            break;
+
</ins><span class="cx">         case GetArrayLength:
</span><span class="cx">             if (JSArrayBufferView* view = m_graph.tryGetFoldableViewForChild1(m_node))
</span><span class="cx">                 foldTypedArrayPropertyToConstant(view, jsNumber(view-&gt;length()));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGValidatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGValidate.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGValidate.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/dfg/DFGValidate.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -240,6 +240,7 @@
</span><span class="cx">                 case ArithMod:
</span><span class="cx">                 case ArithMin:
</span><span class="cx">                 case ArithMax:
</span><ins>+                case ArithPow:
</ins><span class="cx">                 case CompareLess:
</span><span class="cx">                 case CompareLessEq:
</span><span class="cx">                 case CompareGreater:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLCapabilitiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/ftl/FTLCapabilities.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -89,6 +89,7 @@
</span><span class="cx">     case ArithAbs:
</span><span class="cx">     case ArithSin:
</span><span class="cx">     case ArithCos:
</span><ins>+    case ArithPow:
</ins><span class="cx">     case ArithSqrt:
</span><span class="cx">     case ArithFRound:
</span><span class="cx">     case ArithNegate:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLIntrinsicRepositoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/ftl/FTLIntrinsicRepository.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -40,6 +40,8 @@
</span><span class="cx">     macro(doubleAbs, &quot;llvm.fabs.f64&quot;, functionType(doubleType, doubleType)) \
</span><span class="cx">     macro(doubleSin, &quot;llvm.sin.f64&quot;, functionType(doubleType, doubleType)) \
</span><span class="cx">     macro(doubleCos, &quot;llvm.cos.f64&quot;, functionType(doubleType, doubleType)) \
</span><ins>+    macro(doublePow, &quot;llvm.pow.f64&quot;, functionType(doubleType, doubleType, doubleType)) \
+    macro(doublePowi, &quot;llvm.powi.f64&quot;, functionType(doubleType, doubleType, int32)) \
</ins><span class="cx">     macro(doubleSqrt, &quot;llvm.sqrt.f64&quot;, functionType(doubleType, doubleType)) \
</span><span class="cx">     macro(frameAddress, &quot;llvm.frameaddress&quot;, functionType(pointerType(int8), int32)) \
</span><span class="cx">     macro(mulWithOverflow32, &quot;llvm.smul.with.overflow.i32&quot;, functionType(structType(m_context, int32, boolean), int32, int32)) \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLLowerDFGToLLVMcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -436,6 +436,9 @@
</span><span class="cx">         case ArithCos:
</span><span class="cx">             compileArithCos();
</span><span class="cx">             break;
</span><ins>+        case ArithPow:
+            compileArithPow();
+            break;
</ins><span class="cx">         case ArithSqrt:
</span><span class="cx">             compileArithSqrt();
</span><span class="cx">             break;
</span><span class="lines">@@ -1595,6 +1598,64 @@
</span><span class="cx"> 
</span><span class="cx">     void compileArithCos() { setDouble(m_out.doubleCos(lowDouble(m_node-&gt;child1()))); }
</span><span class="cx"> 
</span><ins>+    void compileArithPow()
+    {
+        // FIXME: investigate llvm.powi to better understand its performance characteristics.
+        // It might be better to have the inline loop in DFG too.
+        if (m_node-&gt;child2().useKind() == Int32Use)
+            setDouble(m_out.doublePowi(lowDouble(m_node-&gt;child1()), lowInt32(m_node-&gt;child2())));
+        else {
+            LValue base = lowDouble(m_node-&gt;child1());
+            LValue exponent = lowDouble(m_node-&gt;child2());
+
+            LBasicBlock integerExponentIsSmallBlock = FTL_NEW_BLOCK(m_out, (&quot;ArithPow test integer exponent is small.&quot;));
+            LBasicBlock integerExponentPowBlock = FTL_NEW_BLOCK(m_out, (&quot;ArithPow pow(double, (int)double).&quot;));
+            LBasicBlock doubleExponentPowBlock = FTL_NEW_BLOCK(m_out, (&quot;ArithPow pow(double, double).&quot;));
+            LBasicBlock powBlock = FTL_NEW_BLOCK(m_out, (&quot;ArithPow regular pow&quot;));
+            LBasicBlock nanException = FTL_NEW_BLOCK(m_out, (&quot;ArithPow NaN Exception&quot;));
+            LBasicBlock continuation = FTL_NEW_BLOCK(m_out, (&quot;ArithPow continuation&quot;));
+
+            LValue integerExponent = m_out.fpToInt32(exponent);
+            LValue integerExponentConvertedToDouble = m_out.intToDouble(integerExponent);
+            LValue exponentIsInteger = m_out.doubleEqual(exponent, integerExponentConvertedToDouble);
+            m_out.branch(exponentIsInteger, unsure(integerExponentIsSmallBlock), unsure(doubleExponentPowBlock));
+
+            LBasicBlock lastNext = m_out.appendTo(integerExponentIsSmallBlock, integerExponentPowBlock);
+            LValue integerExponentBelow1000 = m_out.below(integerExponent, m_out.constInt32(1000));
+            m_out.branch(integerExponentBelow1000, usually(integerExponentPowBlock), rarely(doubleExponentPowBlock));
+
+            m_out.appendTo(integerExponentPowBlock, doubleExponentPowBlock);
+            ValueFromBlock powDoubleIntResult = m_out.anchor(m_out.doublePowi(base, integerExponent));
+            m_out.jump(continuation);
+
+            m_out.appendTo(doubleExponentPowBlock, powBlock);
+            // If y is NaN, the result is NaN.
+            // FIXME: shouldn't we only check that if the type of child2() might have NaN?
+            LValue exponentIsNaN = m_out.doubleNotEqualOrUnordered(exponent, exponent);
+
+            // If abs(x) is 1 and y is +infinity, the result is NaN.
+            // If abs(x) is 1 and y is -infinity, the result is NaN.
+            LValue absoluteExponent = m_out.doubleAbs(exponent);
+            LValue absoluteExponentIsInfinity = m_out.doubleEqual(absoluteExponent, m_out.constDouble(std::numeric_limits&lt;double&gt;::infinity()));
+            LValue absoluteBase = m_out.doubleAbs(base);
+            LValue absoluteBaseIsOne = m_out.doubleEqual(absoluteBase, m_out.constDouble(1));
+            LValue oneBaseInfiniteExponent = m_out.bitAnd(absoluteExponentIsInfinity, absoluteBaseIsOne);
+
+            m_out.branch(m_out.bitOr(exponentIsNaN, oneBaseInfiniteExponent), rarely(nanException), usually(powBlock));
+
+            m_out.appendTo(powBlock, nanException);
+            ValueFromBlock powResult = m_out.anchor(m_out.doublePow(base, exponent));
+            m_out.jump(continuation);
+
+            m_out.appendTo(nanException, continuation);
+            ValueFromBlock pureNan = m_out.anchor(m_out.constDouble(PNaN));
+            m_out.jump(continuation);
+
+            m_out.appendTo(continuation, lastNext);
+            setDouble(m_out.phi(m_out.doubleType, powDoubleIntResult, powResult, pureNan));
+        }
+    }
+
</ins><span class="cx">     void compileArithSqrt() { setDouble(m_out.doubleSqrt(lowDouble(m_node-&gt;child1()))); }
</span><span class="cx">     
</span><span class="cx">     void compileArithFRound()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLOutputh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLOutput.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLOutput.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/ftl/FTLOutput.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -177,6 +177,16 @@
</span><span class="cx">         return call(doubleCosIntrinsic(), value);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    LValue doublePow(LValue xOperand, LValue yOperand)
+    {
+        return call(doublePowIntrinsic(), xOperand, yOperand);
+    }
+
+    LValue doublePowi(LValue xOperand, LValue yOperand)
+    {
+        return call(doublePowiIntrinsic(), xOperand, yOperand);
+    }
+
</ins><span class="cx">     LValue doubleSqrt(LValue value)
</span><span class="cx">     {
</span><span class="cx">         return call(doubleSqrtIntrinsic(), value);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -1213,6 +1213,395 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if PLATFORM(IOS) &amp;&amp; CPU(ARM_THUMB2)
+
+// The following code is taken from netlib.org:
+//   http://www.netlib.org/fdlibm/fdlibm.h
+//   http://www.netlib.org/fdlibm/e_pow.c
+//   http://www.netlib.org/fdlibm/s_scalbn.c
+//
+// And was originally distributed under the following license:
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+/*
+ * ====================================================
+ * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice 
+ * is preserved.
+ * ====================================================
+ */
+
+/* __ieee754_pow(x,y) return x**y
+ *
+ *              n
+ * Method:  Let x =  2   * (1+f)
+ *    1. Compute and return log2(x) in two pieces:
+ *        log2(x) = w1 + w2,
+ *       where w1 has 53-24 = 29 bit trailing zeros.
+ *    2. Perform y*log2(x) = n+y' by simulating muti-precision 
+ *       arithmetic, where |y'|&lt;=0.5.
+ *    3. Return x**y = 2**n*exp(y'*log2)
+ *
+ * Special cases:
+ *    1.  (anything) ** 0  is 1
+ *    2.  (anything) ** 1  is itself
+ *    3.  (anything) ** NAN is NAN
+ *    4.  NAN ** (anything except 0) is NAN
+ *    5.  +-(|x| &gt; 1) **  +INF is +INF
+ *    6.  +-(|x| &gt; 1) **  -INF is +0
+ *    7.  +-(|x| &lt; 1) **  +INF is +0
+ *    8.  +-(|x| &lt; 1) **  -INF is +INF
+ *    9.  +-1         ** +-INF is NAN
+ *    10. +0 ** (+anything except 0, NAN)               is +0
+ *    11. -0 ** (+anything except 0, NAN, odd integer)  is +0
+ *    12. +0 ** (-anything except 0, NAN)               is +INF
+ *    13. -0 ** (-anything except 0, NAN, odd integer)  is +INF
+ *    14. -0 ** (odd integer) = -( +0 ** (odd integer) )
+ *    15. +INF ** (+anything except 0,NAN) is +INF
+ *    16. +INF ** (-anything except 0,NAN) is +0
+ *    17. -INF ** (anything)  = -0 ** (-anything)
+ *    18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
+ *    19. (-anything except 0 and inf) ** (non-integer) is NAN
+ *
+ * Accuracy:
+ *    pow(x,y) returns x**y nearly rounded. In particular
+ *            pow(integer,integer)
+ *    always returns the correct integer provided it is 
+ *    representable.
+ *
+ * Constants :
+ * The hexadecimal values are the intended ones for the following 
+ * constants. The decimal values may be used, provided that the 
+ * compiler will convert from decimal to binary accurately enough 
+ * to produce the hexadecimal values shown.
+ */
+
+#define __HI(x) *(1+(int*)&amp;x)
+#define __LO(x) *(int*)&amp;x
+
+static const double
+bp[] = {1.0, 1.5,},
+dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */
+dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */
+zero    =  0.0,
+one    =  1.0,
+two    =  2.0,
+two53    =  9007199254740992.0,    /* 0x43400000, 0x00000000 */
+huge    =  1.0e300,
+tiny    =  1.0e-300,
+        /* for scalbn */
+two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
+twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
+    /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
+L1  =  5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
+L2  =  4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */
+L3  =  3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
+L4  =  2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */
+L5  =  2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
+L6  =  2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */
+P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
+P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
+P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
+P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
+P5   =  4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
+lg2  =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
+lg2_h  =  6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
+lg2_l  = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
+ovt =  8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */
+cp    =  9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */
+cp_h  =  9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */
+cp_l  = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
+ivln2    =  1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
+ivln2_h  =  1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
+ivln2_l  =  1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
+
+inline double fdlibmScalbn (double x, int n)
+{
+    int  k,hx,lx;
+    hx = __HI(x);
+    lx = __LO(x);
+        k = (hx&amp;0x7ff00000)&gt;&gt;20;        /* extract exponent */
+        if (k==0) {                /* 0 or subnormal x */
+            if ((lx|(hx&amp;0x7fffffff))==0) return x; /* +-0 */
+        x *= two54; 
+        hx = __HI(x);
+        k = ((hx&amp;0x7ff00000)&gt;&gt;20) - 54; 
+            if (n&lt; -50000) return tiny*x;     /*underflow*/
+        }
+        if (k==0x7ff) return x+x;        /* NaN or Inf */
+        k = k+n; 
+        if (k &gt;  0x7fe) return huge*copysign(huge,x); /* overflow  */
+        if (k &gt; 0)                 /* normal result */
+        {__HI(x) = (hx&amp;0x800fffff)|(k&lt;&lt;20); return x;}
+        if (k &lt;= -54) {
+            if (n &gt; 50000)     /* in case integer overflow in n+k */
+        return huge*copysign(huge,x);    /*overflow*/
+        else return tiny*copysign(tiny,x);     /*underflow*/
+        }
+        k += 54;                /* subnormal result */
+        __HI(x) = (hx&amp;0x800fffff)|(k&lt;&lt;20);
+        return x*twom54;
+}
+
+static double fdlibmPow(double x, double y)
+{
+    double z,ax,z_h,z_l,p_h,p_l;
+    double y1,t1,t2,r,s,t,u,v,w;
+    int i0,i1,i,j,k,yisint,n;
+    int hx,hy,ix,iy;
+    unsigned lx,ly;
+
+    i0 = ((*(int*)&amp;one)&gt;&gt;29)^1; i1=1-i0;
+    hx = __HI(x); lx = __LO(x);
+    hy = __HI(y); ly = __LO(y);
+    ix = hx&amp;0x7fffffff;  iy = hy&amp;0x7fffffff;
+
+    /* y==zero: x**0 = 1 */
+    if((iy|ly)==0) return one;     
+
+    /* +-NaN return x+y */
+    if(ix &gt; 0x7ff00000 || ((ix==0x7ff00000)&amp;&amp;(lx!=0)) ||
+       iy &gt; 0x7ff00000 || ((iy==0x7ff00000)&amp;&amp;(ly!=0))) 
+        return x+y;    
+
+    /* determine if y is an odd int when x &lt; 0
+     * yisint = 0    ... y is not an integer
+     * yisint = 1    ... y is an odd int
+     * yisint = 2    ... y is an even int
+     */
+    yisint  = 0;
+    if(hx&lt;0) {    
+        if(iy&gt;=0x43400000) yisint = 2; /* even integer y */
+        else if(iy&gt;=0x3ff00000) {
+        k = (iy&gt;&gt;20)-0x3ff;       /* exponent */
+        if(k&gt;20) {
+            j = ly&gt;&gt;(52-k);
+            if(static_cast&lt;unsigned&gt;(j&lt;&lt;(52-k))==ly) yisint = 2-(j&amp;1);
+        } else if(ly==0) {
+            j = iy&gt;&gt;(20-k);
+            if((j&lt;&lt;(20-k))==iy) yisint = 2-(j&amp;1);
+        }
+        }        
+    } 
+
+    /* special value of y */
+    if(ly==0) {     
+        if (iy==0x7ff00000) {    /* y is +-inf */
+            if(((ix-0x3ff00000)|lx)==0)
+            return  y - y;    /* inf**+-1 is NaN */
+            else if (ix &gt;= 0x3ff00000)/* (|x|&gt;1)**+-inf = inf,0 */
+            return (hy&gt;=0)? y: zero;
+            else            /* (|x|&lt;1)**-,+inf = inf,0 */
+            return (hy&lt;0)?-y: zero;
+        } 
+        if(iy==0x3ff00000) {    /* y is  +-1 */
+        if(hy&lt;0) return one/x; else return x;
+        }
+        if(hy==0x40000000) return x*x; /* y is  2 */
+        if(hy==0x3fe00000) {    /* y is  0.5 */
+        if(hx&gt;=0)    /* x &gt;= +0 */
+        return sqrt(x);    
+        }
+    }
+
+    ax   = fabs(x);
+    /* special value of x */
+    if(lx==0) {
+        if(ix==0x7ff00000||ix==0||ix==0x3ff00000){
+        z = ax;            /*x is +-0,+-inf,+-1*/
+        if(hy&lt;0) z = one/z;    /* z = (1/|x|) */
+        if(hx&lt;0) {
+            if(((ix-0x3ff00000)|yisint)==0) {
+            z = (z-z)/(z-z); /* (-1)**non-int is NaN */
+            } else if(yisint==1) 
+            z = -z;        /* (x&lt;0)**odd = -(|x|**odd) */
+        }
+        return z;
+        }
+    }
+    
+    n = (hx&gt;&gt;31)+1;
+
+    /* (x&lt;0)**(non-int) is NaN */
+    if((n|yisint)==0) return (x-x)/(x-x);
+
+    s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
+    if((n|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */
+
+    /* |y| is huge */
+    if(iy&gt;0x41e00000) { /* if |y| &gt; 2**31 */
+        if(iy&gt;0x43f00000){    /* if |y| &gt; 2**64, must o/uflow */
+        if(ix&lt;=0x3fefffff) return (hy&lt;0)? huge*huge:tiny*tiny;
+        if(ix&gt;=0x3ff00000) return (hy&gt;0)? huge*huge:tiny*tiny;
+        }
+    /* over/underflow if x is not close to one */
+        if(ix&lt;0x3fefffff) return (hy&lt;0)? s*huge*huge:s*tiny*tiny;
+        if(ix&gt;0x3ff00000) return (hy&gt;0)? s*huge*huge:s*tiny*tiny;
+    /* now |1-x| is tiny &lt;= 2**-20, suffice to compute 
+       log(x) by x-x^2/2+x^3/3-x^4/4 */
+        t = ax-one;        /* t has 20 trailing zeros */
+        w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
+        u = ivln2_h*t;    /* ivln2_h has 21 sig. bits */
+        v = t*ivln2_l-w*ivln2;
+        t1 = u+v;
+        __LO(t1) = 0;
+        t2 = v-(t1-u);
+    } else {
+        double ss,s2,s_h,s_l,t_h,t_l;
+        n = 0;
+    /* take care subnormal number */
+        if(ix&lt;0x00100000)
+        {ax *= two53; n -= 53; ix = __HI(ax); }
+        n  += ((ix)&gt;&gt;20)-0x3ff;
+        j  = ix&amp;0x000fffff;
+    /* determine interval */
+        ix = j|0x3ff00000;        /* normalize ix */
+        if(j&lt;=0x3988E) k=0;        /* |x|&lt;sqrt(3/2) */
+        else if(j&lt;0xBB67A) k=1;    /* |x|&lt;sqrt(3)   */
+        else {k=0;n+=1;ix -= 0x00100000;}
+        __HI(ax) = ix;
+
+    /* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
+        u = ax-bp[k];        /* bp[0]=1.0, bp[1]=1.5 */
+        v = one/(ax+bp[k]);
+        ss = u*v;
+        s_h = ss;
+        __LO(s_h) = 0;
+    /* t_h=ax+bp[k] High */
+        t_h = zero;
+        __HI(t_h)=((ix&gt;&gt;1)|0x20000000)+0x00080000+(k&lt;&lt;18); 
+        t_l = ax - (t_h-bp[k]);
+        s_l = v*((u-s_h*t_h)-s_h*t_l);
+    /* compute log(ax) */
+        s2 = ss*ss;
+        r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
+        r += s_l*(s_h+ss);
+        s2  = s_h*s_h;
+        t_h = 3.0+s2+r;
+        __LO(t_h) = 0;
+        t_l = r-((t_h-3.0)-s2);
+    /* u+v = ss*(1+...) */
+        u = s_h*t_h;
+        v = s_l*t_h+t_l*ss;
+    /* 2/(3log2)*(ss+...) */
+        p_h = u+v;
+        __LO(p_h) = 0;
+        p_l = v-(p_h-u);
+        z_h = cp_h*p_h;        /* cp_h+cp_l = 2/(3*log2) */
+        z_l = cp_l*p_h+p_l*cp+dp_l[k];
+    /* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
+        t = (double)n;
+        t1 = (((z_h+z_l)+dp_h[k])+t);
+        __LO(t1) = 0;
+        t2 = z_l-(((t1-t)-dp_h[k])-z_h);
+    }
+
+    /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
+    y1  = y;
+    __LO(y1) = 0;
+    p_l = (y-y1)*t1+y*t2;
+    p_h = y1*t1;
+    z = p_l+p_h;
+    j = __HI(z);
+    i = __LO(z);
+    if (j&gt;=0x40900000) {                /* z &gt;= 1024 */
+        if(((j-0x40900000)|i)!=0)            /* if z &gt; 1024 */
+        return s*huge*huge;            /* overflow */
+        else {
+        if(p_l+ovt&gt;z-p_h) return s*huge*huge;    /* overflow */
+        }
+    } else if((j&amp;0x7fffffff)&gt;=0x4090cc00 ) {    /* z &lt;= -1075 */
+        if(((j-0xc090cc00)|i)!=0)         /* z &lt; -1075 */
+        return s*tiny*tiny;        /* underflow */
+        else {
+        if(p_l&lt;=z-p_h) return s*tiny*tiny;    /* underflow */
+        }
+    }
+    /*
+     * compute 2**(p_h+p_l)
+     */
+    i = j&amp;0x7fffffff;
+    k = (i&gt;&gt;20)-0x3ff;
+    n = 0;
+    if(i&gt;0x3fe00000) {        /* if |z| &gt; 0.5, set n = [z+0.5] */
+        n = j+(0x00100000&gt;&gt;(k+1));
+        k = ((n&amp;0x7fffffff)&gt;&gt;20)-0x3ff;    /* new k for n */
+        t = zero;
+        __HI(t) = (n&amp;~(0x000fffff&gt;&gt;k));
+        n = ((n&amp;0x000fffff)|0x00100000)&gt;&gt;(20-k);
+        if(j&lt;0) n = -n;
+        p_h -= t;
+    } 
+    t = p_l+p_h;
+    __LO(t) = 0;
+    u = t*lg2_h;
+    v = (p_l-(t-p_h))*lg2+t*lg2_l;
+    z = u+v;
+    w = v-(z-u);
+    t  = z*z;
+    t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
+    r  = (z*t1)/(t1-two)-(w+z*w);
+    z  = one-(r-z);
+    j  = __HI(z);
+    j += (n&lt;&lt;20);
+    if((j&gt;&gt;20)&lt;=0) z = fdlibmScalbn(z,n);    /* subnormal output */
+    else __HI(z) += (n&lt;&lt;20);
+    return s*z;
+}
+
+static ALWAYS_INLINE bool isDenormal(double x)
+{
+    static const uint64_t signbit = 0x8000000000000000ULL;
+    static const uint64_t minNormal = 0x0001000000000000ULL;
+    return (bitwise_cast&lt;uint64_t&gt;(x) &amp; ~signbit) - 1 &lt; minNormal - 1;
+}
+
+static ALWAYS_INLINE bool isEdgeCase(double x)
+{
+    static const uint64_t signbit = 0x8000000000000000ULL;
+    static const uint64_t infinity = 0x7fffffffffffffffULL;
+    return (bitwise_cast&lt;uint64_t&gt;(x) &amp; ~signbit) - 1 &gt;= infinity - 1;
+}
+
+static ALWAYS_INLINE double mathPowInternal(double x, double y)
+{
+    if (!isDenormal(x) &amp;&amp; !isDenormal(y)) {
+        double libmResult = pow(x, y);
+        if (libmResult || isEdgeCase(x) || isEdgeCase(y))
+            return libmResult;
+    }
+    return fdlibmPow(x, y);
+}
+
+#else
+
+ALWAYS_INLINE double mathPowInternal(double x, double y)
+{
+    return pow(x, y);
+}
+
+#endif
+
+double JSC_HOST_CALL operationMathPow(double x, double y)
+{
+    if (std::isnan(y))
+        return PNaN;
+    if (std::isinf(y) &amp;&amp; fabs(x) == 1)
+        return PNaN;
+    return mathPowInternal(x, y);
+}
+
</ins><span class="cx"> void JIT_OPERATION operationPutByIndex(ExecState* exec, EncodedJSValue encodedArrayValue, int32_t index, EncodedJSValue encodedValue)
</span><span class="cx"> {
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITOperationsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/JITOperations.h (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITOperations.h        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/jit/JITOperations.h        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -281,6 +281,7 @@
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="cx"> SlowPathReturnType JIT_OPERATION operationOptimize(ExecState*, int32_t) WTF_INTERNAL;
</span><span class="cx"> #endif
</span><ins>+double JSC_HOST_CALL operationMathPow(double x, double y) WTF_INTERNAL;
</ins><span class="cx"> void JIT_OPERATION operationPutByIndex(ExecState*, EncodedJSValue, int32_t, EncodedJSValue);
</span><span class="cx"> #if USE(JSVALUE64)
</span><span class="cx"> void JIT_OPERATION operationPutGetterSetter(ExecState*, EncodedJSValue, Identifier*, EncodedJSValue, EncodedJSValue) WTF_INTERNAL;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreruntimeMathObjectcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/runtime/MathObject.cpp (180097 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/runtime/MathObject.cpp        2015-02-14 04:16:57 UTC (rev 180097)
+++ trunk/Source/JavaScriptCore/runtime/MathObject.cpp        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -21,6 +21,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;MathObject.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;JITOperations.h&quot;
</ins><span class="cx"> #include &quot;Lookup.h&quot;
</span><span class="cx"> #include &quot;ObjectPrototype.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="lines">@@ -242,43 +243,6 @@
</span><span class="cx">     return JSValue::encode(jsNumber(result));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#if PLATFORM(IOS) &amp;&amp; CPU(ARM_THUMB2)
-
-static double fdlibmPow(double x, double y);
-
-static ALWAYS_INLINE bool isDenormal(double x)
-{
-        static const uint64_t signbit = 0x8000000000000000ULL;
-        static const uint64_t minNormal = 0x0001000000000000ULL;
-        return (bitwise_cast&lt;uint64_t&gt;(x) &amp; ~signbit) - 1 &lt; minNormal - 1;
-}
-
-static ALWAYS_INLINE bool isEdgeCase(double x)
-{
-        static const uint64_t signbit = 0x8000000000000000ULL;
-        static const uint64_t infinity = 0x7fffffffffffffffULL;
-        return (bitwise_cast&lt;uint64_t&gt;(x) &amp; ~signbit) - 1 &gt;= infinity - 1;
-}
-
-static ALWAYS_INLINE double mathPow(double x, double y)
-{
-    if (!isDenormal(x) &amp;&amp; !isDenormal(y)) {
-        double libmResult = pow(x,y);
-        if (libmResult || isEdgeCase(x) || isEdgeCase(y))
-            return libmResult;
-    }
-    return fdlibmPow(x,y);
-}
-
-#else
-
-ALWAYS_INLINE double mathPow(double x, double y)
-{
-    return pow(x, y);
-}
-
-#endif
-
</del><span class="cx"> EncodedJSValue JSC_HOST_CALL mathProtoFuncPow(ExecState* exec)
</span><span class="cx"> {
</span><span class="cx">     // ECMA 15.8.2.1.13
</span><span class="lines">@@ -286,11 +250,7 @@
</span><span class="cx">     double arg = exec-&gt;argument(0).toNumber(exec);
</span><span class="cx">     double arg2 = exec-&gt;argument(1).toNumber(exec);
</span><span class="cx"> 
</span><del>-    if (std::isnan(arg2))
-        return JSValue::encode(jsNaN());
-    if (std::isinf(arg2) &amp;&amp; fabs(arg) == 1)
-        return JSValue::encode(jsNaN());
-    return JSValue::encode(jsNumber(mathPow(arg, arg2)));
</del><ins>+    return JSValue::encode(JSValue(operationMathPow(arg, arg2)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL mathProtoFuncRandom(ExecState* exec)
</span><span class="lines">@@ -407,354 +367,4 @@
</span><span class="cx">     return JSValue::encode(jsNumber(exec-&gt;argument(0).toIntegerPreserveNaN(exec)));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
-#if PLATFORM(IOS) &amp;&amp; CPU(ARM_THUMB2)
-
-// The following code is taken from netlib.org:
-//   http://www.netlib.org/fdlibm/fdlibm.h
-//   http://www.netlib.org/fdlibm/e_pow.c
-//   http://www.netlib.org/fdlibm/s_scalbn.c
-//
-// And was originally distributed under the following license:
-
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
- *
- * Developed at SunSoft, a Sun Microsystems, Inc. business.
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
- * is preserved.
- * ====================================================
- */
-/*
- * ====================================================
- * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this
- * software is freely granted, provided that this notice 
- * is preserved.
- * ====================================================
- */
-
-/* __ieee754_pow(x,y) return x**y
- *
- *              n
- * Method:  Let x =  2   * (1+f)
- *    1. Compute and return log2(x) in two pieces:
- *        log2(x) = w1 + w2,
- *       where w1 has 53-24 = 29 bit trailing zeros.
- *    2. Perform y*log2(x) = n+y' by simulating muti-precision 
- *       arithmetic, where |y'|&lt;=0.5.
- *    3. Return x**y = 2**n*exp(y'*log2)
- *
- * Special cases:
- *    1.  (anything) ** 0  is 1
- *    2.  (anything) ** 1  is itself
- *    3.  (anything) ** NAN is NAN
- *    4.  NAN ** (anything except 0) is NAN
- *    5.  +-(|x| &gt; 1) **  +INF is +INF
- *    6.  +-(|x| &gt; 1) **  -INF is +0
- *    7.  +-(|x| &lt; 1) **  +INF is +0
- *    8.  +-(|x| &lt; 1) **  -INF is +INF
- *    9.  +-1         ** +-INF is NAN
- *    10. +0 ** (+anything except 0, NAN)               is +0
- *    11. -0 ** (+anything except 0, NAN, odd integer)  is +0
- *    12. +0 ** (-anything except 0, NAN)               is +INF
- *    13. -0 ** (-anything except 0, NAN, odd integer)  is +INF
- *    14. -0 ** (odd integer) = -( +0 ** (odd integer) )
- *    15. +INF ** (+anything except 0,NAN) is +INF
- *    16. +INF ** (-anything except 0,NAN) is +0
- *    17. -INF ** (anything)  = -0 ** (-anything)
- *    18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
- *    19. (-anything except 0 and inf) ** (non-integer) is NAN
- *
- * Accuracy:
- *    pow(x,y) returns x**y nearly rounded. In particular
- *            pow(integer,integer)
- *    always returns the correct integer provided it is 
- *    representable.
- *
- * Constants :
- * The hexadecimal values are the intended ones for the following 
- * constants. The decimal values may be used, provided that the 
- * compiler will convert from decimal to binary accurately enough 
- * to produce the hexadecimal values shown.
- */
-
-#define __HI(x) *(1+(int*)&amp;x)
-#define __LO(x) *(int*)&amp;x
-
-static const double
-bp[] = {1.0, 1.5,},
-dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */
-dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */
-zero    =  0.0,
-one    =  1.0,
-two    =  2.0,
-two53    =  9007199254740992.0,    /* 0x43400000, 0x00000000 */
-huge    =  1.0e300,
-tiny    =  1.0e-300,
-        /* for scalbn */
-two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
-twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
-    /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
-L1  =  5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
-L2  =  4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */
-L3  =  3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
-L4  =  2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */
-L5  =  2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
-L6  =  2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */
-P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
-P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
-P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
-P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
-P5   =  4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
-lg2  =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
-lg2_h  =  6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
-lg2_l  = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
-ovt =  8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */
-cp    =  9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */
-cp_h  =  9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */
-cp_l  = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
-ivln2    =  1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
-ivln2_h  =  1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
-ivln2_l  =  1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
-
-inline double fdlibmScalbn (double x, int n)
-{
-    int  k,hx,lx;
-    hx = __HI(x);
-    lx = __LO(x);
-        k = (hx&amp;0x7ff00000)&gt;&gt;20;        /* extract exponent */
-        if (k==0) {                /* 0 or subnormal x */
-            if ((lx|(hx&amp;0x7fffffff))==0) return x; /* +-0 */
-        x *= two54; 
-        hx = __HI(x);
-        k = ((hx&amp;0x7ff00000)&gt;&gt;20) - 54; 
-            if (n&lt; -50000) return tiny*x;     /*underflow*/
-        }
-        if (k==0x7ff) return x+x;        /* NaN or Inf */
-        k = k+n; 
-        if (k &gt;  0x7fe) return huge*copysign(huge,x); /* overflow  */
-        if (k &gt; 0)                 /* normal result */
-        {__HI(x) = (hx&amp;0x800fffff)|(k&lt;&lt;20); return x;}
-        if (k &lt;= -54) {
-            if (n &gt; 50000)     /* in case integer overflow in n+k */
-        return huge*copysign(huge,x);    /*overflow*/
-        else return tiny*copysign(tiny,x);     /*underflow*/
-        }
-        k += 54;                /* subnormal result */
-        __HI(x) = (hx&amp;0x800fffff)|(k&lt;&lt;20);
-        return x*twom54;
-}
-
-double fdlibmPow(double x, double y)
-{
-    double z,ax,z_h,z_l,p_h,p_l;
-    double y1,t1,t2,r,s,t,u,v,w;
-    int i0,i1,i,j,k,yisint,n;
-    int hx,hy,ix,iy;
-    unsigned lx,ly;
-
-    i0 = ((*(int*)&amp;one)&gt;&gt;29)^1; i1=1-i0;
-    hx = __HI(x); lx = __LO(x);
-    hy = __HI(y); ly = __LO(y);
-    ix = hx&amp;0x7fffffff;  iy = hy&amp;0x7fffffff;
-
-    /* y==zero: x**0 = 1 */
-    if((iy|ly)==0) return one;     
-
-    /* +-NaN return x+y */
-    if(ix &gt; 0x7ff00000 || ((ix==0x7ff00000)&amp;&amp;(lx!=0)) ||
-       iy &gt; 0x7ff00000 || ((iy==0x7ff00000)&amp;&amp;(ly!=0))) 
-        return x+y;    
-
-    /* determine if y is an odd int when x &lt; 0
-     * yisint = 0    ... y is not an integer
-     * yisint = 1    ... y is an odd int
-     * yisint = 2    ... y is an even int
-     */
-    yisint  = 0;
-    if(hx&lt;0) {    
-        if(iy&gt;=0x43400000) yisint = 2; /* even integer y */
-        else if(iy&gt;=0x3ff00000) {
-        k = (iy&gt;&gt;20)-0x3ff;       /* exponent */
-        if(k&gt;20) {
-            j = ly&gt;&gt;(52-k);
-            if(static_cast&lt;unsigned&gt;(j&lt;&lt;(52-k))==ly) yisint = 2-(j&amp;1);
-        } else if(ly==0) {
-            j = iy&gt;&gt;(20-k);
-            if((j&lt;&lt;(20-k))==iy) yisint = 2-(j&amp;1);
-        }
-        }        
-    } 
-
-    /* special value of y */
-    if(ly==0) {     
-        if (iy==0x7ff00000) {    /* y is +-inf */
-            if(((ix-0x3ff00000)|lx)==0)
-            return  y - y;    /* inf**+-1 is NaN */
-            else if (ix &gt;= 0x3ff00000)/* (|x|&gt;1)**+-inf = inf,0 */
-            return (hy&gt;=0)? y: zero;
-            else            /* (|x|&lt;1)**-,+inf = inf,0 */
-            return (hy&lt;0)?-y: zero;
-        } 
-        if(iy==0x3ff00000) {    /* y is  +-1 */
-        if(hy&lt;0) return one/x; else return x;
-        }
-        if(hy==0x40000000) return x*x; /* y is  2 */
-        if(hy==0x3fe00000) {    /* y is  0.5 */
-        if(hx&gt;=0)    /* x &gt;= +0 */
-        return sqrt(x);    
-        }
-    }
-
-    ax   = fabs(x);
-    /* special value of x */
-    if(lx==0) {
-        if(ix==0x7ff00000||ix==0||ix==0x3ff00000){
-        z = ax;            /*x is +-0,+-inf,+-1*/
-        if(hy&lt;0) z = one/z;    /* z = (1/|x|) */
-        if(hx&lt;0) {
-            if(((ix-0x3ff00000)|yisint)==0) {
-            z = (z-z)/(z-z); /* (-1)**non-int is NaN */
-            } else if(yisint==1) 
-            z = -z;        /* (x&lt;0)**odd = -(|x|**odd) */
-        }
-        return z;
-        }
-    }
-    
-    n = (hx&gt;&gt;31)+1;
-
-    /* (x&lt;0)**(non-int) is NaN */
-    if((n|yisint)==0) return (x-x)/(x-x);
-
-    s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
-    if((n|(yisint-1))==0) s = -one;/* (-ve)**(odd int) */
-
-    /* |y| is huge */
-    if(iy&gt;0x41e00000) { /* if |y| &gt; 2**31 */
-        if(iy&gt;0x43f00000){    /* if |y| &gt; 2**64, must o/uflow */
-        if(ix&lt;=0x3fefffff) return (hy&lt;0)? huge*huge:tiny*tiny;
-        if(ix&gt;=0x3ff00000) return (hy&gt;0)? huge*huge:tiny*tiny;
-        }
-    /* over/underflow if x is not close to one */
-        if(ix&lt;0x3fefffff) return (hy&lt;0)? s*huge*huge:s*tiny*tiny;
-        if(ix&gt;0x3ff00000) return (hy&gt;0)? s*huge*huge:s*tiny*tiny;
-    /* now |1-x| is tiny &lt;= 2**-20, suffice to compute 
-       log(x) by x-x^2/2+x^3/3-x^4/4 */
-        t = ax-one;        /* t has 20 trailing zeros */
-        w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
-        u = ivln2_h*t;    /* ivln2_h has 21 sig. bits */
-        v = t*ivln2_l-w*ivln2;
-        t1 = u+v;
-        __LO(t1) = 0;
-        t2 = v-(t1-u);
-    } else {
-        double ss,s2,s_h,s_l,t_h,t_l;
-        n = 0;
-    /* take care subnormal number */
-        if(ix&lt;0x00100000)
-        {ax *= two53; n -= 53; ix = __HI(ax); }
-        n  += ((ix)&gt;&gt;20)-0x3ff;
-        j  = ix&amp;0x000fffff;
-    /* determine interval */
-        ix = j|0x3ff00000;        /* normalize ix */
-        if(j&lt;=0x3988E) k=0;        /* |x|&lt;sqrt(3/2) */
-        else if(j&lt;0xBB67A) k=1;    /* |x|&lt;sqrt(3)   */
-        else {k=0;n+=1;ix -= 0x00100000;}
-        __HI(ax) = ix;
-
-    /* compute ss = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
-        u = ax-bp[k];        /* bp[0]=1.0, bp[1]=1.5 */
-        v = one/(ax+bp[k]);
-        ss = u*v;
-        s_h = ss;
-        __LO(s_h) = 0;
-    /* t_h=ax+bp[k] High */
-        t_h = zero;
-        __HI(t_h)=((ix&gt;&gt;1)|0x20000000)+0x00080000+(k&lt;&lt;18); 
-        t_l = ax - (t_h-bp[k]);
-        s_l = v*((u-s_h*t_h)-s_h*t_l);
-    /* compute log(ax) */
-        s2 = ss*ss;
-        r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
-        r += s_l*(s_h+ss);
-        s2  = s_h*s_h;
-        t_h = 3.0+s2+r;
-        __LO(t_h) = 0;
-        t_l = r-((t_h-3.0)-s2);
-    /* u+v = ss*(1+...) */
-        u = s_h*t_h;
-        v = s_l*t_h+t_l*ss;
-    /* 2/(3log2)*(ss+...) */
-        p_h = u+v;
-        __LO(p_h) = 0;
-        p_l = v-(p_h-u);
-        z_h = cp_h*p_h;        /* cp_h+cp_l = 2/(3*log2) */
-        z_l = cp_l*p_h+p_l*cp+dp_l[k];
-    /* log2(ax) = (ss+..)*2/(3*log2) = n + dp_h + z_h + z_l */
-        t = (double)n;
-        t1 = (((z_h+z_l)+dp_h[k])+t);
-        __LO(t1) = 0;
-        t2 = z_l-(((t1-t)-dp_h[k])-z_h);
-    }
-
-    /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
-    y1  = y;
-    __LO(y1) = 0;
-    p_l = (y-y1)*t1+y*t2;
-    p_h = y1*t1;
-    z = p_l+p_h;
-    j = __HI(z);
-    i = __LO(z);
-    if (j&gt;=0x40900000) {                /* z &gt;= 1024 */
-        if(((j-0x40900000)|i)!=0)            /* if z &gt; 1024 */
-        return s*huge*huge;            /* overflow */
-        else {
-        if(p_l+ovt&gt;z-p_h) return s*huge*huge;    /* overflow */
-        }
-    } else if((j&amp;0x7fffffff)&gt;=0x4090cc00 ) {    /* z &lt;= -1075 */
-        if(((j-0xc090cc00)|i)!=0)         /* z &lt; -1075 */
-        return s*tiny*tiny;        /* underflow */
-        else {
-        if(p_l&lt;=z-p_h) return s*tiny*tiny;    /* underflow */
-        }
-    }
-    /*
-     * compute 2**(p_h+p_l)
-     */
-    i = j&amp;0x7fffffff;
-    k = (i&gt;&gt;20)-0x3ff;
-    n = 0;
-    if(i&gt;0x3fe00000) {        /* if |z| &gt; 0.5, set n = [z+0.5] */
-        n = j+(0x00100000&gt;&gt;(k+1));
-        k = ((n&amp;0x7fffffff)&gt;&gt;20)-0x3ff;    /* new k for n */
-        t = zero;
-        __HI(t) = (n&amp;~(0x000fffff&gt;&gt;k));
-        n = ((n&amp;0x000fffff)|0x00100000)&gt;&gt;(20-k);
-        if(j&lt;0) n = -n;
-        p_h -= t;
-    } 
-    t = p_l+p_h;
-    __LO(t) = 0;
-    u = t*lg2_h;
-    v = (p_l-(t-p_h))*lg2+t*lg2_l;
-    z = u+v;
-    w = v-(z-u);
-    t  = z*z;
-    t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
-    r  = (z*t1)/(t1-two)-(w+z*w);
-    z  = one-(r-z);
-    j  = __HI(z);
-    j += (n&lt;&lt;20);
-    if((j&gt;&gt;20)&lt;=0) z = fdlibmScalbn(z,n);    /* subnormal output */
-    else __HI(z) += (n&lt;&lt;20);
-    return s*z;
-}
-
-#endif
-
</del><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressmathpowbasicsjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/math-pow-basics.js (0 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/math-pow-basics.js                                (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/math-pow-basics.js        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -0,0 +1,286 @@
</span><ins>+function valuesAreClose(a, b) {
+    return Math.abs(a / b) - 1 &lt; 1e-10;
+}
+
+// Some random values.
+function mathPowDoubleDouble1(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble1);
+
+function mathPowDoubleInt1(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt1);
+
+function test1(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble1(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble1(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt1(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt1(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test1);
+test1(376.76522764377296, 10.81699226051569, 7.333951929109252e+27, 5.76378989575089e+25);
+
+function mathPowDoubleDouble2(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble2);
+
+function mathPowDoubleInt2(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt2);
+function test2(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble2(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble2(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt2(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt2(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test2);
+test2(376.76522764377296, -5.81699226051569, 1.035180331187579e-15, 1.3171824310400265e-13);
+
+function mathPowDoubleDouble3(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble3);
+
+function mathPowDoubleInt3(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt3);
+function test3(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble3(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble3(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt3(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt3(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test3);
+test3(-37.676522764377296, 10.0, 5763789895750892, 5763789895750892);
+
+// Exponent zero.
+function mathPowDoubleDouble4(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble4);
+
+function mathPowDoubleInt4(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt4);
+function test4(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble4(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble4(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt4(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt4(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test4);
+test4(-37.676522764377296, 0, 1, 1);
+
+// Exponent minus zero.
+function mathPowDoubleDouble5(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble5);
+
+function mathPowDoubleInt5(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt5);
+function test5(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble5(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble5(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt5(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test5);
+test5(-37.676522764377296, -0, 1, 1);
+
+// Exponent 1.
+function mathPowDoubleDouble6(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble6);
+
+function mathPowDoubleInt6(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt6);
+function test6(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble6(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble6(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt6(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt6(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test6);
+test6(-37.676522764377296, 1.0, -37.676522764377296, -37.676522764377296);
+
+// Exponent -1.
+function mathPowDoubleDouble7(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble7);
+
+function mathPowDoubleInt7(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt7);
+function test7(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble7(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble7(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble7(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleDouble7(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test7);
+test6(-37.676522764377296, -1.0, -0.026541727490454296, -0.026541727490454296);
+
+// Let's square things.
+function mathPowDoubleDouble8(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble8);
+
+function mathPowDoubleInt8(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt8);
+function test8(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble8(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble8(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt8(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt8(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test8);
+test7(-37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407);
+
+function mathPowDoubleDouble9(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble9);
+
+function mathPowDoubleInt9(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt9);
+function test9(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble9(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble9(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt9(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt9(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test9);
+test8(37.676522764377296, 2.0, 1419.5203676146407, 1419.5203676146407);
+
+// Let's cube things.
+function mathPowDoubleDouble10(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble10);
+
+function mathPowDoubleInt10(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt10);
+function test10(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble10(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt10(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test9);
+test9(-37.676522764377296, 3.0, -53482.591444930236, -53482.591444930236);
+
+function mathPowDoubleDouble11(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDouble11);
+
+function mathPowDoubleInt11(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleInt11);
+function test11(x, y, expected1, expected2) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDouble11(x, y);
+        if (!valuesAreClose(result, expected1))
+            throw &quot;Error: bad result, mathPowDoubleDouble(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected1;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleInt11(x, integerY);
+        if (!valuesAreClose(result, expected2))
+            throw &quot;Error: bad result, mathPowDoubleInt(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected a value close to &quot; + expected2;
+    }
+}
+noInline(test10);
+test10(37.676522764377296, 3.0, 53482.591444930236, 53482.591444930236);
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressmathpowintegerexponentfastpathjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/math-pow-integer-exponent-fastpath.js (0 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/math-pow-integer-exponent-fastpath.js                                (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/math-pow-integer-exponent-fastpath.js        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+function valuesAreClose(a, b) {
+    return Math.abs(a / b) - 1 &lt; 1e-10;
+}
+
+// Small exponent values are handled through a simpler inline loop. Test that it is not observable.
+function mathPowDoubleDoubleTestExponentFifty(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDoubleTestExponentFifty);
+
+function mathPowDoubleIntTestExponentFifty(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleIntTestExponentFifty);
+function testExponentFifty(x, y, expected) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDoubleTestExponentFifty(x, y);
+        if (!valuesAreClose(result, expected))
+            throw &quot;Error: bad result, Math.pow(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected value close to &quot; + expected;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleIntTestExponentFifty(x, integerY);
+        if (!valuesAreClose(result, expected))
+            throw &quot;Error: bad result, Math.pow(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected value close to &quot; + expected;
+    }
+}
+noInline(testExponentFifty);
+testExponentFifty(53.70901164133102, 50.0, 3.179494118120144e+86);
+testExponentFifty(53.70901164133102, -10.0, 5.006432842621192e-18);
+
+function mathPowDoubleDoubleTestExponentTenThousands(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleDoubleTestExponentTenThousands);
+
+function mathPowDoubleIntTestExponentTenThousands(x, y) {
+    return Math.pow(x, y)
+}
+noInline(mathPowDoubleIntTestExponentTenThousands);
+function testExponentTenThousands(x, y, expected) {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleDoubleTestExponentTenThousands(x, y);
+        if (!valuesAreClose(result, expected))
+            throw &quot;Error: bad result, Math.pow(&quot; + x + &quot;, &quot; + y + &quot;) = &quot; + result + &quot; expected value close to &quot; + expected;
+    }
+    var integerY = y | 0;
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = mathPowDoubleIntTestExponentTenThousands(x, integerY);
+        if (!valuesAreClose(result, expected))
+            throw &quot;Error: bad result, Math.pow(&quot; + x + &quot;, &quot; + integerY + &quot;) = &quot; + result + &quot; expected value close to &quot; + expected;
+    }
+}
+noInline(testExponentTenThousands);
+testExponentTenThousands(1.001, 10000.0, 21916.681339048373);
+testExponentTenThousands(1.001, -1.0, 0.9990009990009991);
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressmathpownanbehaviorsjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/math-pow-nan-behaviors.js (0 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/math-pow-nan-behaviors.js                                (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/math-pow-nan-behaviors.js        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -0,0 +1,85 @@
</span><ins>+// If y is NaN, the result is NaN.
+function testIntegerBaseWithNaNExponent() {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(5, NaN);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(5, NaN) = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(i, NaN);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(i, NaN) = &quot; + result + &quot; with i = &quot; + i;
+    }
+}
+noInline(testIntegerBaseWithNaNExponent);
+testIntegerBaseWithNaNExponent();
+
+function testFloatingPointBaseWithNaNExponent() {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(5.5, NaN);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(5.5, NaN) = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(i + 1, NaN);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(i + 0.5, NaN) = &quot; + result + &quot; with i = &quot; + i;
+    }
+}
+noInline(testFloatingPointBaseWithNaNExponent);
+testFloatingPointBaseWithNaNExponent();
+
+// If y is +0, the result is 1, even if x is NaN.
+// If y is −0, the result is 1, even if x is NaN.
+// If x is NaN and y is nonzero, the result is NaN.
+function testNaNBase() {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(NaN, i + 1);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(NaN, i + 1) = &quot; + result + &quot; with i = &quot; + i;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(NaN, i + 1.5);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(NaN, i + 1.5) = &quot; + result + &quot; with i = &quot; + i;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(NaN, 0);
+        if (result !== 1)
+            throw &quot;Error: bad result, Math.pow(NaN, 0) = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(NaN, -0);
+        if (result !== 1)
+            throw &quot;Error: bad result, Math.pow(NaN, -0) = &quot; + result;
+    }
+}
+noInline(testNaNBase);
+testNaNBase();
+
+// If abs(x) is 1 and y is +∞, the result is NaN.
+// If abs(x) is 1 and y is −∞, the result is NaN.
+function infiniteExponents() {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(1, Number.POSITIVE_INFINITY);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(1, Number.POSITIVE_INFINITY) = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(-1, Number.POSITIVE_INFINITY);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(-1, Number.POSITIVE_INFINITY) = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(1, Number.NEGATIVE_INFINITY);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(1, Number.NEGATIVE_INFINITY) = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = Math.pow(-1, Number.NEGATIVE_INFINITY);
+        if (!isNaN(result))
+            throw &quot;Error: bad result, Math.pow(-1, Number.NEGATIVE_INFINITY) = &quot; + result;
+    }
+}
+noInline(infiniteExponents);
+infiniteExponents();
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoretestsstressmathpowwithconstantsjs"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/tests/stress/math-pow-with-constants.js (0 => 180098)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/tests/stress/math-pow-with-constants.js                                (rev 0)
+++ trunk/Source/JavaScriptCore/tests/stress/math-pow-with-constants.js        2015-02-14 04:20:21 UTC (rev 180098)
</span><span class="lines">@@ -0,0 +1,115 @@
</span><ins>+function exponentIsZero(x) {
+    return Math.pow(x, 0);
+}
+noInline(exponentIsZero);
+
+function testExponentIsZero() {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = exponentIsZero(5);
+        if (result !== 1)
+            throw &quot;Error: zeroExponent(5) should be 1, was = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = exponentIsZero(5.5);
+        if (result !== 1)
+            throw &quot;Error: zeroExponent(5.5) should be 1, was = &quot; + result;
+    }
+}
+testExponentIsZero();
+
+
+function exponentIsOne(x) {
+    return Math.pow(x, 1);
+}
+noInline(exponentIsOne);
+
+function testExponentIsOne() {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = exponentIsOne(5);
+        if (result !== 5)
+            throw &quot;Error: exponentIsOne(5) should be 5, was = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = exponentIsOne(5.5);
+        if (result !== 5.5)
+            throw &quot;Error: exponentIsOne(5.5) should be 5.5, was = &quot; + result;
+    }
+}
+testExponentIsOne();
+
+
+function powUsedAsSqrt(x) {
+    return Math.pow(x, 0.5);
+}
+noInline(powUsedAsSqrt);
+
+function testPowUsedAsSqrt() {
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = powUsedAsSqrt(4);
+        if (result !== Math.sqrt(4))
+            throw &quot;Error: powUsedAsSqrt(4) should be 2, was = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = powUsedAsSqrt(4.4);
+        if (result !== Math.sqrt(4.4))
+            throw &quot;Error: powUsedAsSqrt(4) should be &quot; + Math.sqrt(4.4) + &quot;, was = &quot; + result;
+    }
+
+}
+testPowUsedAsSqrt();
+
+
+function intIntConstantsSmallNumbers() {
+    return Math.pow(42, 3);
+}
+function intIntConstantsLargeNumbers() {
+    // The result does not fit in a integer.
+    return Math.pow(42, 42);
+}
+function intIntSmallConstants() {
+    return Math.pow(42, 3);
+}
+function intDoubleConstants() {
+    return Math.pow(14, 42.5);
+}
+function doubleDoubleConstants() {
+    return Math.pow(13.5, 42.5);
+}
+function doubleIntConstants() {
+    return Math.pow(13.5, 52);
+}
+noInline(intIntConstantsSmallNumbers);
+noInline(intIntConstantsLargeNumbers);
+noInline(intDoubleConstants);
+noInline(doubleDoubleConstants);
+noInline(doubleIntConstants);
+
+function testBaseAndExponentConstantLiterals()
+{
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = intIntConstantsSmallNumbers();
+        if (result !== 74088)
+            throw &quot;Error: intIntConstantsSmallNumbers() should be 74088, was = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = intIntConstantsLargeNumbers();
+        if (result !== 1.5013093754529656e+68)
+            throw &quot;Error: intIntConstantsLargeNumbers() should be 1.5013093754529656e+68, was = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = intDoubleConstants();
+        if (result !== 5.1338303882015765e+48)
+            throw &quot;Error: intDoubleConstants() should be 5.1338303882015765e+48, was = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = doubleDoubleConstants();
+        if (result !== 1.0944228729647829e+48)
+            throw &quot;Error: doubleDoubleConstants() should be 1.0944228729647829e+48, was = &quot; + result;
+    }
+    for (var i = 0; i &lt; 10000; ++i) {
+        var result = doubleIntConstants();
+        if (result !== 5.989022735311158e+58)
+            throw &quot;Error: doubleIntConstants() should be 5.989022735311158e+58, was = &quot; + result;
+    }
+}
+testBaseAndExponentConstantLiterals();
</ins></span></pre>
</div>
</div>

</body>
</html>