<!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>[192812] 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/192812">192812</a></dd>
<dt>Author</dt> <dd>fpizlo@apple.com</dd>
<dt>Date</dt> <dd>2015-11-30 12:07:18 -0800 (Mon, 30 Nov 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>MacroAssembler needs an API for disabling scratch registers
https://bugs.webkit.org/show_bug.cgi?id=151010

Reviewed by Saam Barati and Michael Saboff.

This adds two scope classes, DisallowMacroScratchRegisterUsage and
AllowMacroScratchRegisterUsage. The default is that the scratch registers are enabled. Air
disables them before generation.

Henceforth the pattern inside B3 stackmap generator callbacks will be that you can only use
AllowMacroScratchRegisterUsage if you've either supplied the scratch register as a clobbered
register and arranged for all of the stackmap values to be late uses, or you're writing a test
and you're OK with it being fragile with respect to scratch registers. The latter holds in most
of testb3.

* JavaScriptCore.xcodeproj/project.pbxproj:
* assembler/AbstractMacroAssembler.h:
(JSC::optimizeForX86):
(JSC::AbstractMacroAssembler::setTempRegisterValid):
* assembler/AllowMacroScratchRegisterUsage.h: Added.
(JSC::AllowMacroScratchRegisterUsage::AllowMacroScratchRegisterUsage):
(JSC::AllowMacroScratchRegisterUsage::~AllowMacroScratchRegisterUsage):
* assembler/DisallowMacroScratchRegisterUsage.h: Added.
(JSC::DisallowMacroScratchRegisterUsage::DisallowMacroScratchRegisterUsage):
(JSC::DisallowMacroScratchRegisterUsage::~DisallowMacroScratchRegisterUsage):
* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::scratchRegister):
(JSC::MacroAssemblerX86Common::loadDouble):
(JSC::MacroAssemblerX86Common::branchConvertDoubleToInt32):
* assembler/MacroAssemblerX86_64.h:
(JSC::MacroAssemblerX86_64::add32):
(JSC::MacroAssemblerX86_64::and32):
(JSC::MacroAssemblerX86_64::or32):
(JSC::MacroAssemblerX86_64::sub32):
(JSC::MacroAssemblerX86_64::load8):
(JSC::MacroAssemblerX86_64::addDouble):
(JSC::MacroAssemblerX86_64::convertInt32ToDouble):
(JSC::MacroAssemblerX86_64::store32):
(JSC::MacroAssemblerX86_64::store8):
(JSC::MacroAssemblerX86_64::callWithSlowPathReturnType):
(JSC::MacroAssemblerX86_64::call):
(JSC::MacroAssemblerX86_64::jump):
(JSC::MacroAssemblerX86_64::tailRecursiveCall):
(JSC::MacroAssemblerX86_64::makeTailRecursiveCall):
(JSC::MacroAssemblerX86_64::branchAdd32):
(JSC::MacroAssemblerX86_64::add64):
(JSC::MacroAssemblerX86_64::addPtrNoFlags):
(JSC::MacroAssemblerX86_64::and64):
(JSC::MacroAssemblerX86_64::lshift64):
(JSC::MacroAssemblerX86_64::or64):
(JSC::MacroAssemblerX86_64::sub64):
(JSC::MacroAssemblerX86_64::store64):
(JSC::MacroAssemblerX86_64::store64WithAddressOffsetPatch):
(JSC::MacroAssemblerX86_64::branch64):
(JSC::MacroAssemblerX86_64::branchPtr):
(JSC::MacroAssemblerX86_64::branchTest64):
(JSC::MacroAssemblerX86_64::test64):
(JSC::MacroAssemblerX86_64::branchPtrWithPatch):
(JSC::MacroAssemblerX86_64::branch32WithPatch):
(JSC::MacroAssemblerX86_64::storePtrWithPatch):
(JSC::MacroAssemblerX86_64::branch8):
(JSC::MacroAssemblerX86_64::branchTest8):
(JSC::MacroAssemblerX86_64::convertInt64ToDouble):
(JSC::MacroAssemblerX86_64::readCallTarget):
(JSC::MacroAssemblerX86_64::haveScratchRegisterForBlinding):
(JSC::MacroAssemblerX86_64::scratchRegisterForBlinding):
(JSC::MacroAssemblerX86_64::canJumpReplacePatchableBranchPtrWithPatch):
(JSC::MacroAssemblerX86_64::canJumpReplacePatchableBranch32WithPatch):
(JSC::MacroAssemblerX86_64::revertJumpReplacementToPatchableBranchPtrWithPatch):
(JSC::MacroAssemblerX86_64::revertJumpReplacementToPatchableBranch32WithPatch):
(JSC::MacroAssemblerX86_64::revertJumpReplacementToBranchPtrWithPatch):
(JSC::MacroAssemblerX86_64::repatchCall):
(JSC::MacroAssemblerX86_64::add64AndSetFlags):
* b3/air/AirGenerate.cpp:
(JSC::B3::Air::generate):
* b3/testb3.cpp:
(JSC::B3::testSimplePatchpoint):
(JSC::B3::testSimplePatchpointWithoutOuputClobbersGPArgs):
(JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
(JSC::B3::testSimplePatchpointWithoutOuputClobbersFPArgs):
(JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
(JSC::B3::testPatchpointCallArg):
(JSC::B3::testPatchpointFixedRegister):
(JSC::B3::testPatchpointAny):
(JSC::B3::testPatchpointAnyImm):
(JSC::B3::testSimpleCheck):
(JSC::B3::testCheckLessThan):
(JSC::B3::testCheckMegaCombo):
(JSC::B3::testCheckAddImm):
(JSC::B3::testCheckAddImmCommute):
(JSC::B3::testCheckAddImmSomeRegister):
(JSC::B3::testCheckAdd):
(JSC::B3::testCheckAdd64):
(JSC::B3::testCheckAddFoldFail):
(JSC::B3::testCheckSubImm):
(JSC::B3::testCheckSubBadImm):
(JSC::B3::testCheckSub):
(JSC::B3::testCheckSub64):
(JSC::B3::testCheckSubFoldFail):
(JSC::B3::testCheckNeg):
(JSC::B3::testCheckNeg64):
(JSC::B3::testCheckMul):
(JSC::B3::testCheckMulMemory):
(JSC::B3::testCheckMul2):
(JSC::B3::testCheckMul64):
(JSC::B3::testCheckMulFoldFail):
(JSC::B3::genericTestCompare):
* dfg/DFGCommon.h:
* jit/GPRInfo.h:
(JSC::GPRInfo::toRegister):
(JSC::GPRInfo::reservedRegisters):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerAbstractMacroAssemblerh">trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerMacroAssemblerX86Commonh">trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerMacroAssemblerX86_64h">trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirGeneratecpp">trunk/Source/JavaScriptCore/b3/air/AirGenerate.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3testb3cpp">trunk/Source/JavaScriptCore/b3/testb3.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoredfgDFGCommonh">trunk/Source/JavaScriptCore/dfg/DFGCommon.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitGPRInfoh">trunk/Source/JavaScriptCore/jit/GPRInfo.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreassemblerAllowMacroScratchRegisterUsageh">trunk/Source/JavaScriptCore/assembler/AllowMacroScratchRegisterUsage.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerDisallowMacroScratchRegisterUsageh">trunk/Source/JavaScriptCore/assembler/DisallowMacroScratchRegisterUsage.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -1,3 +1,117 @@
</span><ins>+2015-11-30  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        MacroAssembler needs an API for disabling scratch registers
+        https://bugs.webkit.org/show_bug.cgi?id=151010
+
+        Reviewed by Saam Barati and Michael Saboff.
+
+        This adds two scope classes, DisallowMacroScratchRegisterUsage and
+        AllowMacroScratchRegisterUsage. The default is that the scratch registers are enabled. Air
+        disables them before generation.
+
+        Henceforth the pattern inside B3 stackmap generator callbacks will be that you can only use
+        AllowMacroScratchRegisterUsage if you've either supplied the scratch register as a clobbered
+        register and arranged for all of the stackmap values to be late uses, or you're writing a test
+        and you're OK with it being fragile with respect to scratch registers. The latter holds in most
+        of testb3.
+
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * assembler/AbstractMacroAssembler.h:
+        (JSC::optimizeForX86):
+        (JSC::AbstractMacroAssembler::setTempRegisterValid):
+        * assembler/AllowMacroScratchRegisterUsage.h: Added.
+        (JSC::AllowMacroScratchRegisterUsage::AllowMacroScratchRegisterUsage):
+        (JSC::AllowMacroScratchRegisterUsage::~AllowMacroScratchRegisterUsage):
+        * assembler/DisallowMacroScratchRegisterUsage.h: Added.
+        (JSC::DisallowMacroScratchRegisterUsage::DisallowMacroScratchRegisterUsage):
+        (JSC::DisallowMacroScratchRegisterUsage::~DisallowMacroScratchRegisterUsage):
+        * assembler/MacroAssemblerX86Common.h:
+        (JSC::MacroAssemblerX86Common::scratchRegister):
+        (JSC::MacroAssemblerX86Common::loadDouble):
+        (JSC::MacroAssemblerX86Common::branchConvertDoubleToInt32):
+        * assembler/MacroAssemblerX86_64.h:
+        (JSC::MacroAssemblerX86_64::add32):
+        (JSC::MacroAssemblerX86_64::and32):
+        (JSC::MacroAssemblerX86_64::or32):
+        (JSC::MacroAssemblerX86_64::sub32):
+        (JSC::MacroAssemblerX86_64::load8):
+        (JSC::MacroAssemblerX86_64::addDouble):
+        (JSC::MacroAssemblerX86_64::convertInt32ToDouble):
+        (JSC::MacroAssemblerX86_64::store32):
+        (JSC::MacroAssemblerX86_64::store8):
+        (JSC::MacroAssemblerX86_64::callWithSlowPathReturnType):
+        (JSC::MacroAssemblerX86_64::call):
+        (JSC::MacroAssemblerX86_64::jump):
+        (JSC::MacroAssemblerX86_64::tailRecursiveCall):
+        (JSC::MacroAssemblerX86_64::makeTailRecursiveCall):
+        (JSC::MacroAssemblerX86_64::branchAdd32):
+        (JSC::MacroAssemblerX86_64::add64):
+        (JSC::MacroAssemblerX86_64::addPtrNoFlags):
+        (JSC::MacroAssemblerX86_64::and64):
+        (JSC::MacroAssemblerX86_64::lshift64):
+        (JSC::MacroAssemblerX86_64::or64):
+        (JSC::MacroAssemblerX86_64::sub64):
+        (JSC::MacroAssemblerX86_64::store64):
+        (JSC::MacroAssemblerX86_64::store64WithAddressOffsetPatch):
+        (JSC::MacroAssemblerX86_64::branch64):
+        (JSC::MacroAssemblerX86_64::branchPtr):
+        (JSC::MacroAssemblerX86_64::branchTest64):
+        (JSC::MacroAssemblerX86_64::test64):
+        (JSC::MacroAssemblerX86_64::branchPtrWithPatch):
+        (JSC::MacroAssemblerX86_64::branch32WithPatch):
+        (JSC::MacroAssemblerX86_64::storePtrWithPatch):
+        (JSC::MacroAssemblerX86_64::branch8):
+        (JSC::MacroAssemblerX86_64::branchTest8):
+        (JSC::MacroAssemblerX86_64::convertInt64ToDouble):
+        (JSC::MacroAssemblerX86_64::readCallTarget):
+        (JSC::MacroAssemblerX86_64::haveScratchRegisterForBlinding):
+        (JSC::MacroAssemblerX86_64::scratchRegisterForBlinding):
+        (JSC::MacroAssemblerX86_64::canJumpReplacePatchableBranchPtrWithPatch):
+        (JSC::MacroAssemblerX86_64::canJumpReplacePatchableBranch32WithPatch):
+        (JSC::MacroAssemblerX86_64::revertJumpReplacementToPatchableBranchPtrWithPatch):
+        (JSC::MacroAssemblerX86_64::revertJumpReplacementToPatchableBranch32WithPatch):
+        (JSC::MacroAssemblerX86_64::revertJumpReplacementToBranchPtrWithPatch):
+        (JSC::MacroAssemblerX86_64::repatchCall):
+        (JSC::MacroAssemblerX86_64::add64AndSetFlags):
+        * b3/air/AirGenerate.cpp:
+        (JSC::B3::Air::generate):
+        * b3/testb3.cpp:
+        (JSC::B3::testSimplePatchpoint):
+        (JSC::B3::testSimplePatchpointWithoutOuputClobbersGPArgs):
+        (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
+        (JSC::B3::testSimplePatchpointWithoutOuputClobbersFPArgs):
+        (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
+        (JSC::B3::testPatchpointCallArg):
+        (JSC::B3::testPatchpointFixedRegister):
+        (JSC::B3::testPatchpointAny):
+        (JSC::B3::testPatchpointAnyImm):
+        (JSC::B3::testSimpleCheck):
+        (JSC::B3::testCheckLessThan):
+        (JSC::B3::testCheckMegaCombo):
+        (JSC::B3::testCheckAddImm):
+        (JSC::B3::testCheckAddImmCommute):
+        (JSC::B3::testCheckAddImmSomeRegister):
+        (JSC::B3::testCheckAdd):
+        (JSC::B3::testCheckAdd64):
+        (JSC::B3::testCheckAddFoldFail):
+        (JSC::B3::testCheckSubImm):
+        (JSC::B3::testCheckSubBadImm):
+        (JSC::B3::testCheckSub):
+        (JSC::B3::testCheckSub64):
+        (JSC::B3::testCheckSubFoldFail):
+        (JSC::B3::testCheckNeg):
+        (JSC::B3::testCheckNeg64):
+        (JSC::B3::testCheckMul):
+        (JSC::B3::testCheckMulMemory):
+        (JSC::B3::testCheckMul2):
+        (JSC::B3::testCheckMul64):
+        (JSC::B3::testCheckMulFoldFail):
+        (JSC::B3::genericTestCompare):
+        * dfg/DFGCommon.h:
+        * jit/GPRInfo.h:
+        (JSC::GPRInfo::toRegister):
+        (JSC::GPRInfo::reservedRegisters):
+
</ins><span class="cx"> 2015-11-26  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [ARM64] stress/op_div.js is failing on some divide by 0 cases.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -306,6 +306,8 @@
</span><span class="cx">                 0F338E1E1BF286EA0013C88F /* B3LowerMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F338E1A1BF286EA0013C88F /* B3LowerMacros.h */; };
</span><span class="cx">                 0F34B14916D42010001CDA5A /* DFGUseKind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F34B14716D4200E001CDA5A /* DFGUseKind.cpp */; };
</span><span class="cx">                 0F34B14A16D42013001CDA5A /* DFGUseKind.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F34B14816D4200E001CDA5A /* DFGUseKind.h */; };
</span><ins>+                0F37308F1C0CD68500052BFA /* DisallowMacroScratchRegisterUsage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F37308E1C0CD68500052BFA /* DisallowMacroScratchRegisterUsage.h */; };
+                0F3730911C0CD70C00052BFA /* AllowMacroScratchRegisterUsage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F3730901C0CD70C00052BFA /* AllowMacroScratchRegisterUsage.h */; };
</ins><span class="cx">                 0F38B01117CF078000B144D3 /* LLIntEntrypoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F38B00F17CF077F00B144D3 /* LLIntEntrypoint.cpp */; };
</span><span class="cx">                 0F38B01217CF078300B144D3 /* LLIntEntrypoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F38B01017CF077F00B144D3 /* LLIntEntrypoint.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F38B01717CFE75500B144D3 /* DFGCompilationKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F38B01317CFE75500B144D3 /* DFGCompilationKey.cpp */; };
</span><span class="lines">@@ -2367,6 +2369,8 @@
</span><span class="cx">                 0F338E1A1BF286EA0013C88F /* B3LowerMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3LowerMacros.h; path = b3/B3LowerMacros.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F34B14716D4200E001CDA5A /* DFGUseKind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGUseKind.cpp; path = dfg/DFGUseKind.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F34B14816D4200E001CDA5A /* DFGUseKind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGUseKind.h; path = dfg/DFGUseKind.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F37308E1C0CD68500052BFA /* DisallowMacroScratchRegisterUsage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DisallowMacroScratchRegisterUsage.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F3730901C0CD70C00052BFA /* AllowMacroScratchRegisterUsage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AllowMacroScratchRegisterUsage.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F38B00F17CF077F00B144D3 /* LLIntEntrypoint.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = LLIntEntrypoint.cpp; path = llint/LLIntEntrypoint.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F38B01017CF077F00B144D3 /* LLIntEntrypoint.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LLIntEntrypoint.h; path = llint/LLIntEntrypoint.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F38B01317CFE75500B144D3 /* DFGCompilationKey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGCompilationKey.cpp; path = dfg/DFGCompilationKey.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -6165,6 +6169,7 @@
</span><span class="cx">                         children = (
</span><span class="cx">                                 0F1FE51B1922A3BC006987C5 /* AbortReason.h */,
</span><span class="cx">                                 860161DF0F3A83C100F84710 /* AbstractMacroAssembler.h */,
</span><ins>+                                0F3730901C0CD70C00052BFA /* AllowMacroScratchRegisterUsage.h */,
</ins><span class="cx">                                 8640923B156EED3B00566CB2 /* ARM64Assembler.h */,
</span><span class="cx">                                 86D3B2BF10156BDE002865E7 /* ARMAssembler.cpp */,
</span><span class="cx">                                 86D3B2C010156BDE002865E7 /* ARMAssembler.h */,
</span><span class="lines">@@ -6172,6 +6177,7 @@
</span><span class="cx">                                 9688CB130ED12B4E001D649F /* AssemblerBuffer.h */,
</span><span class="cx">                                 86D3B2C110156BDE002865E7 /* AssemblerBufferWithConstantPool.h */,
</span><span class="cx">                                 86E116B00FE75AC800B512BC /* CodeLocation.h */,
</span><ins>+                                0F37308E1C0CD68500052BFA /* DisallowMacroScratchRegisterUsage.h */,
</ins><span class="cx">                                 0FF4275615914A20004CB9FF /* LinkBuffer.cpp */,
</span><span class="cx">                                 86D3B3C110159D7F002865E7 /* LinkBuffer.h */,
</span><span class="cx">                                 0FEB3ECE16237F6700AB67AD /* MacroAssembler.cpp */,
</span><span class="lines">@@ -6187,8 +6193,8 @@
</span><span class="cx">                                 FE68C6351B90DDD90042BCB3 /* MacroAssemblerPrinter.cpp */,
</span><span class="cx">                                 FE68C6361B90DDD90042BCB3 /* MacroAssemblerPrinter.h */,
</span><span class="cx">                                 86AE64A6135E5E1C00963012 /* MacroAssemblerSH4.h */,
</span><ins>+                                860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */,
</ins><span class="cx">                                 860161E00F3A83C100F84710 /* MacroAssemblerX86.h */,
</span><del>-                                860161E10F3A83C100F84710 /* MacroAssemblerX86_64.h */,
</del><span class="cx">                                 A7A4AE0717973B26005612B1 /* MacroAssemblerX86Common.cpp */,
</span><span class="cx">                                 860161E20F3A83C100F84710 /* MacroAssemblerX86Common.h */,
</span><span class="cx">                                 65860177185A8F5E00030EEE /* MaxFrameExtentForSlowPathCall.h */,
</span><span class="lines">@@ -6994,6 +7000,7 @@
</span><span class="cx">                                 0F2B9CED19D0BA7D00B1D1B5 /* DFGPromotedHeapLocation.h in Headers */,
</span><span class="cx">                                 0FFC92161B94FB3E0071DD66 /* DFGPropertyTypeKey.h in Headers */,
</span><span class="cx">                                 0FB17663196B8F9E0091052A /* DFGPureValue.h in Headers */,
</span><ins>+                                0F3730911C0CD70C00052BFA /* AllowMacroScratchRegisterUsage.h in Headers */,
</ins><span class="cx">                                 0F3A1BFA1A9ECB7D000DE01A /* DFGPutStackSinkingPhase.h in Headers */,
</span><span class="cx">                                 86EC9DD11328DF82002B2AD7 /* DFGRegisterBank.h in Headers */,
</span><span class="cx">                                 0F2FCCFC18A60070001A27F8 /* DFGSafepoint.h in Headers */,
</span><span class="lines">@@ -7477,6 +7484,7 @@
</span><span class="cx">                                 860161E60F3A83C100F84710 /* MacroAssemblerX86Common.h in Headers */,
</span><span class="cx">                                 A700873A17CBE85300C3E643 /* MapConstructor.h in Headers */,
</span><span class="cx">                                 A78507D717CBC6FD0011F6E7 /* MapData.h in Headers */,
</span><ins>+                                0F37308F1C0CD68500052BFA /* DisallowMacroScratchRegisterUsage.h in Headers */,
</ins><span class="cx">                                 0A6441519420A6C61AD1882E /* MapDataInlines.h in Headers */,
</span><span class="cx">                                 A74DEF94182D991400522C22 /* MapIteratorPrototype.h in Headers */,
</span><span class="cx">                                 A700873E17CBE8D300C3E643 /* MapPrototype.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerAbstractMacroAssemblerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -82,6 +82,8 @@
</span><span class="cx">     return isX86() &amp;&amp; Options::useArchitectureSpecificOptimizations();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+class AllowMacroScratchRegisterUsage;
+class DisallowMacroScratchRegisterUsage;
</ins><span class="cx"> class LinkBuffer;
</span><span class="cx"> class Watchpoint;
</span><span class="cx"> namespace DFG {
</span><span class="lines">@@ -1118,7 +1120,10 @@
</span><span class="cx">         m_tempRegistersValidBits |= registerMask;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    friend class AllowMacroScratchRegisterUsage;
+    friend class DisallowMacroScratchRegisterUsage;
</ins><span class="cx">     unsigned m_tempRegistersValidBits;
</span><ins>+    bool m_allowScratchRegister { true };
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;RefPtr&lt;SharedTask&lt;void(LinkBuffer&amp;)&gt;&gt;&gt; m_linkTasks;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerAllowMacroScratchRegisterUsageh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/assembler/AllowMacroScratchRegisterUsage.h (0 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/AllowMacroScratchRegisterUsage.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/assembler/AllowMacroScratchRegisterUsage.h        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef AllowMacroScratchRegisterUsage_h
+#define AllowMacroScratchRegisterUsage_h
+
+#if ENABLE(ASSEMBLER)
+
+#include &quot;MacroAssembler.h&quot;
+
+namespace JSC {
+
+class AllowMacroScratchRegisterUsage {
+public:
+    AllowMacroScratchRegisterUsage(MacroAssembler&amp; masm)
+        : m_masm(masm)
+        , m_oldValueOfAllowScratchRegister(masm.m_allowScratchRegister)
+    {
+        masm.m_allowScratchRegister = true;
+    }
+
+    ~AllowMacroScratchRegisterUsage()
+    {
+        m_masm.m_allowScratchRegister = m_oldValueOfAllowScratchRegister;
+    }
+
+private:
+    MacroAssembler&amp; m_masm;
+    bool m_oldValueOfAllowScratchRegister;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(ASSEMBLER)
+
+#endif // AllowMacroScratchRegisterUsage_h
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerDisallowMacroScratchRegisterUsageh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/assembler/DisallowMacroScratchRegisterUsage.h (0 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/DisallowMacroScratchRegisterUsage.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/assembler/DisallowMacroScratchRegisterUsage.h        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -0,0 +1,59 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef DisallowMacroScratchRegisterUsage_h
+#define DisallowMacroScratchRegisterUsage_h
+
+#if ENABLE(ASSEMBLER)
+
+#include &quot;MacroAssembler.h&quot;
+
+namespace JSC {
+
+class DisallowMacroScratchRegisterUsage {
+public:
+    DisallowMacroScratchRegisterUsage(MacroAssembler&amp; masm)
+        : m_masm(masm)
+        , m_oldValueOfAllowScratchRegister(masm.m_allowScratchRegister)
+    {
+        masm.m_allowScratchRegister = false;
+    }
+
+    ~DisallowMacroScratchRegisterUsage()
+    {
+        m_masm.m_allowScratchRegister = m_oldValueOfAllowScratchRegister;
+    }
+
+private:
+    MacroAssembler&amp; m_masm;
+    bool m_oldValueOfAllowScratchRegister;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(ASSEMBLER)
+
+#endif // DisallowMacroScratchRegisterUsage_h
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerMacroAssemblerX86Commonh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -36,7 +36,16 @@
</span><span class="cx"> class MacroAssemblerX86Common : public AbstractMacroAssembler&lt;X86Assembler, MacroAssemblerX86Common&gt; {
</span><span class="cx"> public:
</span><span class="cx"> #if CPU(X86_64)
</span><del>-    static const X86Registers::RegisterID scratchRegister = X86Registers::r11;
</del><ins>+    // Use this directly only if you're not generating code with it.
+    static const X86Registers::RegisterID s_scratchRegister = X86Registers::r11;
+
+    // Use this when generating code so that we get enforcement of the disallowing of scratch register
+    // usage.
+    X86Registers::RegisterID scratchRegister()
+    {
+        RELEASE_ASSERT(m_allowScratchRegister);
+        return s_scratchRegister;
+    }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="lines">@@ -742,8 +751,8 @@
</span><span class="cx">         ASSERT(isSSE2Present());
</span><span class="cx">         m_assembler.movsd_mr(address.m_value, dest);
</span><span class="cx"> #else
</span><del>-        move(address, scratchRegister);
-        loadDouble(scratchRegister, dest);
</del><ins>+        move(address, scratchRegister());
+        loadDouble(scratchRegister(), dest);
</ins><span class="cx"> #endif
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -964,8 +973,8 @@
</span><span class="cx"> #if CPU(X86_64)
</span><span class="cx">         if (negZeroCheck) {
</span><span class="cx">             Jump valueIsNonZero = branchTest32(NonZero, dest);
</span><del>-            m_assembler.movmskpd_rr(src, scratchRegister);
-            failureCases.append(branchTest32(NonZero, scratchRegister, TrustedImm32(1)));
</del><ins>+            m_assembler.movmskpd_rr(src, scratchRegister());
+            failureCases.append(branchTest32(NonZero, scratchRegister(), TrustedImm32(1)));
</ins><span class="cx">             valueIsNonZero.link(this);
</span><span class="cx">         }
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerMacroAssemblerX86_64h"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -60,38 +60,38 @@
</span><span class="cx">         if (!imm.m_value)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        add32(imm, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        add32(imm, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void and32(TrustedImm32 imm, AbsoluteAddress address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        and32(imm, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        and32(imm, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void add32(AbsoluteAddress address, RegisterID dest)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        add32(Address(scratchRegister), dest);
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        add32(Address(scratchRegister()), dest);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void or32(TrustedImm32 imm, AbsoluteAddress address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        or32(imm, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        or32(imm, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void or32(RegisterID reg, AbsoluteAddress address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        or32(reg, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        or32(reg, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void sub32(TrustedImm32 imm, AbsoluteAddress address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        sub32(imm, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        sub32(imm, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void load8(const void* address, RegisterID dest)
</span><span class="lines">@@ -112,20 +112,20 @@
</span><span class="cx"> 
</span><span class="cx">     void addDouble(AbsoluteAddress address, FPRegisterID dest)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        m_assembler.addsd_mr(0, scratchRegister, dest);
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        m_assembler.addsd_mr(0, scratchRegister(), dest);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void convertInt32ToDouble(TrustedImm32 imm, FPRegisterID dest)
</span><span class="cx">     {
</span><del>-        move(imm, scratchRegister);
-        m_assembler.cvtsi2sd_rr(scratchRegister, dest);
</del><ins>+        move(imm, scratchRegister());
+        m_assembler.cvtsi2sd_rr(scratchRegister(), dest);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void store32(TrustedImm32 imm, void* address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address), scratchRegister);
-        store32(imm, scratchRegister);
</del><ins>+        move(TrustedImmPtr(address), scratchRegister());
+        store32(imm, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void store32(RegisterID source, void* address)
</span><span class="lines">@@ -133,21 +133,21 @@
</span><span class="cx">         if (source == X86Registers::eax)
</span><span class="cx">             m_assembler.movl_EAXm(address);
</span><span class="cx">         else {
</span><del>-            move(TrustedImmPtr(address), scratchRegister);
-            store32(source, scratchRegister);
</del><ins>+            move(TrustedImmPtr(address), scratchRegister());
+            store32(source, scratchRegister());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void store8(TrustedImm32 imm, void* address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address), scratchRegister);
-        store8(imm, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address), scratchRegister());
+        store8(imm, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void store8(RegisterID reg, void* address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address), scratchRegister);
-        store8(reg, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address), scratchRegister());
+        store8(reg, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if OS(WINDOWS)
</span><span class="lines">@@ -175,8 +175,8 @@
</span><span class="cx">         move(X86Registers::esp, X86Registers::ecx);
</span><span class="cx">         add64(TrustedImm32(4 * sizeof(int64_t)), X86Registers::ecx);
</span><span class="cx"> 
</span><del>-        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister);
-        Call result = Call(m_assembler.call(scratchRegister), Call::Linkable);
</del><ins>+        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister());
+        Call result = Call(m_assembler.call(scratchRegister()), Call::Linkable);
</ins><span class="cx"> 
</span><span class="cx">         add64(TrustedImm32(8 * sizeof(int64_t)), X86Registers::esp);
</span><span class="cx"> 
</span><span class="lines">@@ -201,20 +201,20 @@
</span><span class="cx">         // We don't know the number of arguments at this point, so the arguments (5, 6, ...) should always be copied.
</span><span class="cx"> 
</span><span class="cx">         // Copy argument 5
</span><del>-        load64(Address(X86Registers::esp, 4 * sizeof(int64_t)), scratchRegister);
-        store64(scratchRegister, Address(X86Registers::esp, -4 * static_cast&lt;int32_t&gt;(sizeof(int64_t))));
</del><ins>+        load64(Address(X86Registers::esp, 4 * sizeof(int64_t)), scratchRegister());
+        store64(scratchRegister(), Address(X86Registers::esp, -4 * static_cast&lt;int32_t&gt;(sizeof(int64_t))));
</ins><span class="cx"> 
</span><span class="cx">         // Copy argument 6
</span><del>-        load64(Address(X86Registers::esp, 5 * sizeof(int64_t)), scratchRegister);
-        store64(scratchRegister, Address(X86Registers::esp, -3 * static_cast&lt;int32_t&gt;(sizeof(int64_t))));
</del><ins>+        load64(Address(X86Registers::esp, 5 * sizeof(int64_t)), scratchRegister());
+        store64(scratchRegister(), Address(X86Registers::esp, -3 * static_cast&lt;int32_t&gt;(sizeof(int64_t))));
</ins><span class="cx"> 
</span><span class="cx">         // We also need to allocate the shadow space on the stack for the 4 parameter registers.
</span><span class="cx">         // Also, we should allocate 16 bytes for the frame pointer, and return address (not populated).
</span><span class="cx">         // In addition, we need to allocate 16 bytes for two more parameters, since the call can have up to 6 parameters.
</span><span class="cx">         sub64(TrustedImm32(8 * sizeof(int64_t)), X86Registers::esp);
</span><span class="cx"> #endif
</span><del>-        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister);
-        Call result = Call(m_assembler.call(scratchRegister), Call::Linkable);
</del><ins>+        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister());
+        Call result = Call(m_assembler.call(scratchRegister()), Call::Linkable);
</ins><span class="cx"> #if OS(WINDOWS)
</span><span class="cx">         add64(TrustedImm32(8 * sizeof(int64_t)), X86Registers::esp);
</span><span class="cx"> #endif
</span><span class="lines">@@ -225,14 +225,14 @@
</span><span class="cx">     // Address is a memory location containing the address to jump to
</span><span class="cx">     void jump(AbsoluteAddress address)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        jump(Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        jump(Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Call tailRecursiveCall()
</span><span class="cx">     {
</span><del>-        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister);
-        Jump newJump = Jump(m_assembler.jmp_r(scratchRegister));
</del><ins>+        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister());
+        Jump newJump = Jump(m_assembler.jmp_r(scratchRegister()));
</ins><span class="cx">         ASSERT_UNUSED(label, differenceBetween(label, newJump) == REPATCH_OFFSET_CALL_R11);
</span><span class="cx">         return Call::fromTailJump(newJump);
</span><span class="cx">     }
</span><span class="lines">@@ -240,16 +240,16 @@
</span><span class="cx">     Call makeTailRecursiveCall(Jump oldJump)
</span><span class="cx">     {
</span><span class="cx">         oldJump.link(this);
</span><del>-        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister);
-        Jump newJump = Jump(m_assembler.jmp_r(scratchRegister));
</del><ins>+        DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister());
+        Jump newJump = Jump(m_assembler.jmp_r(scratchRegister()));
</ins><span class="cx">         ASSERT_UNUSED(label, differenceBetween(label, newJump) == REPATCH_OFFSET_CALL_R11);
</span><span class="cx">         return Call::fromTailJump(newJump);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branchAdd32(ResultCondition cond, TrustedImm32 src, AbsoluteAddress dest)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(dest.m_ptr), scratchRegister);
-        add32(src, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(dest.m_ptr), scratchRegister());
+        add32(src, Address(scratchRegister()));
</ins><span class="cx">         return Jump(m_assembler.jCC(x86Condition(cond)));
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -265,8 +265,8 @@
</span><span class="cx"> 
</span><span class="cx">     void add64(AbsoluteAddress src, RegisterID dest)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(src.m_ptr), scratchRegister);
-        add64(Address(scratchRegister), dest);
</del><ins>+        move(TrustedImmPtr(src.m_ptr), scratchRegister());
+        add64(Address(scratchRegister()), dest);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void add64(TrustedImm32 imm, RegisterID srcDest)
</span><span class="lines">@@ -309,8 +309,8 @@
</span><span class="cx">         if (!imm.m_value)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        add64(imm, Address(scratchRegister));
</del><ins>+        move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        add64(imm, Address(scratchRegister()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void addPtrNoFlags(TrustedImm32 imm, RegisterID srcDest)
</span><span class="lines">@@ -330,8 +330,8 @@
</span><span class="cx"> 
</span><span class="cx">     void and64(TrustedImmPtr imm, RegisterID srcDest)
</span><span class="cx">     {
</span><del>-        move(imm, scratchRegister);
-        and64(scratchRegister, srcDest);
</del><ins>+        move(imm, scratchRegister());
+        and64(scratchRegister(), srcDest);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void lshift64(TrustedImm32 imm, RegisterID dest)
</span><span class="lines">@@ -432,8 +432,8 @@
</span><span class="cx"> 
</span><span class="cx">     void or64(TrustedImm64 imm, RegisterID dest)
</span><span class="cx">     {
</span><del>-        move(imm, scratchRegister);
-        or64(scratchRegister, dest);
</del><ins>+        move(imm, scratchRegister());
+        or64(scratchRegister(), dest);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void or64(TrustedImm32 imm, RegisterID dest)
</span><span class="lines">@@ -482,8 +482,8 @@
</span><span class="cx">         if (imm.m_value == 1)
</span><span class="cx">             m_assembler.decq_r(dest);
</span><span class="cx">         else {
</span><del>-            move(imm, scratchRegister);
-            sub64(scratchRegister, dest);
</del><ins>+            move(imm, scratchRegister());
+            sub64(scratchRegister(), dest);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -561,8 +561,8 @@
</span><span class="cx">         if (src == X86Registers::eax)
</span><span class="cx">             m_assembler.movq_EAXm(address);
</span><span class="cx">         else {
</span><del>-            move(TrustedImmPtr(address), scratchRegister);
-            store64(src, scratchRegister);
</del><ins>+            move(TrustedImmPtr(address), scratchRegister());
+            store64(src, scratchRegister());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -578,14 +578,14 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        move(imm, scratchRegister);
-        store64(scratchRegister, address);
</del><ins>+        move(imm, scratchRegister());
+        store64(scratchRegister(), address);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void store64(TrustedImm64 imm, BaseIndex address)
</span><span class="cx">     {
</span><del>-        move(imm, scratchRegister);
-        m_assembler.movq_rm(scratchRegister, address.offset, address.base, address.index, address.scale);
</del><ins>+        move(imm, scratchRegister());
+        m_assembler.movq_rm(scratchRegister(), address.offset, address.base, address.index, address.scale);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     DataLabel32 store64WithAddressOffsetPatch(RegisterID src, Address address)
</span><span class="lines">@@ -668,8 +668,8 @@
</span><span class="cx">             m_assembler.testq_rr(left, left);
</span><span class="cx">             return Jump(m_assembler.jCC(x86Condition(cond)));
</span><span class="cx">         }
</span><del>-        move(right, scratchRegister);
-        return branch64(cond, left, scratchRegister);
</del><ins>+        move(right, scratchRegister());
+        return branch64(cond, left, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branch64(RelationalCondition cond, RegisterID left, Address right)
</span><span class="lines">@@ -680,8 +680,8 @@
</span><span class="cx"> 
</span><span class="cx">     Jump branch64(RelationalCondition cond, AbsoluteAddress left, RegisterID right)
</span><span class="cx">     {
</span><del>-        move(TrustedImmPtr(left.m_ptr), scratchRegister);
-        return branch64(cond, Address(scratchRegister), right);
</del><ins>+        move(TrustedImmPtr(left.m_ptr), scratchRegister());
+        return branch64(cond, Address(scratchRegister()), right);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branch64(RelationalCondition cond, Address left, RegisterID right)
</span><span class="lines">@@ -692,8 +692,8 @@
</span><span class="cx"> 
</span><span class="cx">     Jump branch64(RelationalCondition cond, Address left, TrustedImm64 right)
</span><span class="cx">     {
</span><del>-        move(right, scratchRegister);
-        return branch64(cond, left, scratchRegister);
</del><ins>+        move(right, scratchRegister());
+        return branch64(cond, left, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branch64(RelationalCondition cond, BaseIndex address, RegisterID right)
</span><span class="lines">@@ -709,8 +709,8 @@
</span><span class="cx"> 
</span><span class="cx">     Jump branchPtr(RelationalCondition cond, BaseIndex left, TrustedImmPtr right)
</span><span class="cx">     {
</span><del>-        move(right, scratchRegister);
-        return branchPtr(cond, left, scratchRegister);
</del><ins>+        move(right, scratchRegister());
+        return branchPtr(cond, left, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branchTest64(ResultCondition cond, RegisterID reg, RegisterID mask)
</span><span class="lines">@@ -733,8 +733,8 @@
</span><span class="cx"> 
</span><span class="cx">     Jump branchTest64(ResultCondition cond, RegisterID reg, TrustedImm64 mask)
</span><span class="cx">     {
</span><del>-        move(mask, scratchRegister);
-        return branchTest64(cond, reg, scratchRegister);
</del><ins>+        move(mask, scratchRegister());
+        return branchTest64(cond, reg, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void test64(ResultCondition cond, RegisterID reg, TrustedImm32 mask, RegisterID dest)
</span><span class="lines">@@ -756,8 +756,8 @@
</span><span class="cx"> 
</span><span class="cx">     Jump branchTest64(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
</span><span class="cx">     {
</span><del>-        load64(address.m_ptr, scratchRegister);
-        return branchTest64(cond, scratchRegister, mask);
</del><ins>+        load64(address.m_ptr, scratchRegister());
+        return branchTest64(cond, scratchRegister(), mask);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branchTest64(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
</span><span class="lines">@@ -896,28 +896,28 @@
</span><span class="cx"> 
</span><span class="cx">     Jump branchPtrWithPatch(RelationalCondition cond, RegisterID left, DataLabelPtr&amp; dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
</span><span class="cx">     {
</span><del>-        dataLabel = moveWithPatch(initialRightValue, scratchRegister);
-        return branch64(cond, left, scratchRegister);
</del><ins>+        dataLabel = moveWithPatch(initialRightValue, scratchRegister());
+        return branch64(cond, left, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branchPtrWithPatch(RelationalCondition cond, Address left, DataLabelPtr&amp; dataLabel, TrustedImmPtr initialRightValue = TrustedImmPtr(0))
</span><span class="cx">     {
</span><del>-        dataLabel = moveWithPatch(initialRightValue, scratchRegister);
-        return branch64(cond, left, scratchRegister);
</del><ins>+        dataLabel = moveWithPatch(initialRightValue, scratchRegister());
+        return branch64(cond, left, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     Jump branch32WithPatch(RelationalCondition cond, Address left, DataLabel32&amp; dataLabel, TrustedImm32 initialRightValue = TrustedImm32(0))
</span><span class="cx">     {
</span><span class="cx">         padBeforePatch();
</span><del>-        m_assembler.movl_i32r(initialRightValue.m_value, scratchRegister);
</del><ins>+        m_assembler.movl_i32r(initialRightValue.m_value, scratchRegister());
</ins><span class="cx">         dataLabel = DataLabel32(this);
</span><del>-        return branch32(cond, left, scratchRegister);
</del><ins>+        return branch32(cond, left, scratchRegister());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address)
</span><span class="cx">     {
</span><del>-        DataLabelPtr label = moveWithPatch(initialValue, scratchRegister);
-        store64(scratchRegister, address);
</del><ins>+        DataLabelPtr label = moveWithPatch(initialValue, scratchRegister());
+        store64(scratchRegister(), address);
</ins><span class="cx">         return label;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -934,22 +934,22 @@
</span><span class="cx">     using MacroAssemblerX86Common::branch8;
</span><span class="cx">     Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
</span><span class="cx">     {
</span><del>-        MacroAssemblerX86Common::move(TrustedImmPtr(left.m_ptr), scratchRegister);
-        return MacroAssemblerX86Common::branch8(cond, Address(scratchRegister), right);
</del><ins>+        MacroAssemblerX86Common::move(TrustedImmPtr(left.m_ptr), scratchRegister());
+        return MacroAssemblerX86Common::branch8(cond, Address(scratchRegister()), right);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     using MacroAssemblerX86Common::branchTest8;
</span><span class="cx">     Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1))
</span><span class="cx">     {
</span><span class="cx">         TrustedImmPtr addr(reinterpret_cast&lt;void*&gt;(address.offset));
</span><del>-        MacroAssemblerX86Common::move(addr, scratchRegister);
-        return MacroAssemblerX86Common::branchTest8(cond, BaseIndex(scratchRegister, address.base, TimesOne), mask);
</del><ins>+        MacroAssemblerX86Common::move(addr, scratchRegister());
+        return MacroAssemblerX86Common::branchTest8(cond, BaseIndex(scratchRegister(), address.base, TimesOne), mask);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
</span><span class="cx">     {
</span><del>-        MacroAssemblerX86Common::move(TrustedImmPtr(address.m_ptr), scratchRegister);
-        return MacroAssemblerX86Common::branchTest8(cond, Address(scratchRegister), mask);
</del><ins>+        MacroAssemblerX86Common::move(TrustedImmPtr(address.m_ptr), scratchRegister());
+        return MacroAssemblerX86Common::branchTest8(cond, Address(scratchRegister()), mask);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void convertInt64ToDouble(RegisterID src, FPRegisterID dest)
</span><span class="lines">@@ -967,8 +967,8 @@
</span><span class="cx">         return FunctionPtr(X86Assembler::readPointer(call.dataLabelPtrAtOffset(-REPATCH_OFFSET_CALL_R11).dataLocation()));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static bool haveScratchRegisterForBlinding() { return true; }
-    static RegisterID scratchRegisterForBlinding() { return scratchRegister; }
</del><ins>+    bool haveScratchRegisterForBlinding() { return m_allowScratchRegister; }
+    RegisterID scratchRegisterForBlinding() { return scratchRegister(); }
</ins><span class="cx"> 
</span><span class="cx">     static bool canJumpReplacePatchableBranchPtrWithPatch() { return true; }
</span><span class="cx">     static bool canJumpReplacePatchableBranch32WithPatch() { return true; }
</span><span class="lines">@@ -1005,17 +1005,17 @@
</span><span class="cx">     
</span><span class="cx">     static void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel instructionStart, Address, void* initialValue)
</span><span class="cx">     {
</span><del>-        X86Assembler::revertJumpTo_movq_i64r(instructionStart.executableAddress(), reinterpret_cast&lt;intptr_t&gt;(initialValue), scratchRegister);
</del><ins>+        X86Assembler::revertJumpTo_movq_i64r(instructionStart.executableAddress(), reinterpret_cast&lt;intptr_t&gt;(initialValue), s_scratchRegister);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void revertJumpReplacementToPatchableBranch32WithPatch(CodeLocationLabel instructionStart, Address, int32_t initialValue)
</span><span class="cx">     {
</span><del>-        X86Assembler::revertJumpTo_movl_i32r(instructionStart.executableAddress(), initialValue, scratchRegister);
</del><ins>+        X86Assembler::revertJumpTo_movl_i32r(instructionStart.executableAddress(), initialValue, s_scratchRegister);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void revertJumpReplacementToBranchPtrWithPatch(CodeLocationLabel instructionStart, RegisterID, void* initialValue)
</span><span class="cx">     {
</span><del>-        X86Assembler::revertJumpTo_movq_i64r(instructionStart.executableAddress(), reinterpret_cast&lt;intptr_t&gt;(initialValue), scratchRegister);
</del><ins>+        X86Assembler::revertJumpTo_movq_i64r(instructionStart.executableAddress(), reinterpret_cast&lt;intptr_t&gt;(initialValue), s_scratchRegister);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     static void repatchCall(CodeLocationCall call, CodeLocationLabel destination)
</span><span class="lines">@@ -1042,8 +1042,8 @@
</span><span class="cx">         if (imm.m_value == 1)
</span><span class="cx">             m_assembler.incq_r(dest);
</span><span class="cx">         else {
</span><del>-            move(imm, scratchRegister);
-            add64(scratchRegister, dest);
</del><ins>+            move(imm, scratchRegister());
+            add64(scratchRegister(), dest);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirGeneratecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirGenerate.cpp (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirGenerate.cpp        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/b3/air/AirGenerate.cpp        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -43,6 +43,7 @@
</span><span class="cx"> #include &quot;B3IndexMap.h&quot;
</span><span class="cx"> #include &quot;B3TimingScope.h&quot;
</span><span class="cx"> #include &quot;CCallHelpers.h&quot;
</span><ins>+#include &quot;DisallowMacroScratchRegisterUsage.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace B3 { namespace Air {
</span><span class="cx"> 
</span><span class="lines">@@ -112,6 +113,8 @@
</span><span class="cx"> {
</span><span class="cx">     TimingScope timingScope(&quot;Air::generate&quot;);
</span><span class="cx"> 
</span><ins>+    DisallowMacroScratchRegisterUsage disallowScratch(jit);
+
</ins><span class="cx">     // And now, we generate code.
</span><span class="cx">     jit.emitFunctionPrologue();
</span><span class="cx">     jit.addPtr(CCallHelpers::TrustedImm32(-code.frameSize()), MacroAssembler::stackPointerRegister);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3testb3cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/testb3.cpp (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/testb3.cpp        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/b3/testb3.cpp        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;AllowMacroScratchRegisterUsage.h&quot;
</ins><span class="cx"> #include &quot;B3ArgumentRegValue.h&quot;
</span><span class="cx"> #include &quot;B3BasicBlockInlines.h&quot;
</span><span class="cx"> #include &quot;B3CCallValue.h&quot;
</span><span class="lines">@@ -3182,6 +3183,7 @@
</span><span class="cx">     patchpoint-&gt;append(ConstrainedValue(arg2, ValueRep::SomeRegister));
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[0].isGPR());
</span><span class="cx">             CHECK(params.reps[1].isGPR());
</span><span class="lines">@@ -3209,6 +3211,7 @@
</span><span class="cx">     patchpoint-&gt;append(ConstrainedValue(const2, ValueRep::SomeRegister));
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 2);
</span><span class="cx">             CHECK(params.reps[0].isGPR());
</span><span class="cx">             CHECK(params.reps[1].isGPR());
</span><span class="lines">@@ -3253,6 +3256,7 @@
</span><span class="cx"> 
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[0].isGPR());
</span><span class="cx">             CHECK(params.reps[1].isGPR());
</span><span class="lines">@@ -3287,6 +3291,7 @@
</span><span class="cx">     patchpoint-&gt;append(ConstrainedValue(const2, ValueRep::SomeRegister));
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 2);
</span><span class="cx">             CHECK(params.reps[0].isFPR());
</span><span class="cx">             CHECK(params.reps[1].isFPR());
</span><span class="lines">@@ -3324,6 +3329,7 @@
</span><span class="cx"> 
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[0].isFPR());
</span><span class="cx">             CHECK(params.reps[1].isFPR());
</span><span class="lines">@@ -3353,6 +3359,7 @@
</span><span class="cx">     patchpoint-&gt;append(ConstrainedValue(arg2, ValueRep::stackArgument(8)));
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[0].isGPR());
</span><span class="cx">             CHECK(params.reps[1].isStack());
</span><span class="lines">@@ -3380,6 +3387,7 @@
</span><span class="cx">     patchpoint-&gt;append(ConstrainedValue(arg2, ValueRep(GPRInfo::regT1)));
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[0].isGPR());
</span><span class="cx">             CHECK(params.reps[1] == ValueRep(GPRInfo::regT0));
</span><span class="lines">@@ -3410,6 +3418,7 @@
</span><span class="cx">     patchpoint-&gt;append(ConstrainedValue(arg2, ValueRep::Any));
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             // We shouldn't have spilled the inputs, so we assert that they're in registers.
</span><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[0].isGPR());
</span><span class="lines">@@ -3436,6 +3445,7 @@
</span><span class="cx">     patchpoint-&gt;append(ConstrainedValue(arg2, ValueRep::Any));
</span><span class="cx">     patchpoint-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[0].isGPR());
</span><span class="cx">             CHECK(params.reps[1].isGPR());
</span><span class="lines">@@ -3486,6 +3496,7 @@
</span><span class="cx">     CheckValue* check = root-&gt;appendNew&lt;CheckValue&gt;(proc, Check, Origin(), arg);
</span><span class="cx">     check-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 1);
</span><span class="cx"> 
</span><span class="cx">             // This should always work because a function this simple should never have callee
</span><span class="lines">@@ -3517,6 +3528,7 @@
</span><span class="cx">             root-&gt;appendNew&lt;Const32Value&gt;(proc, Origin(), 42)));
</span><span class="cx">     check-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 1);
</span><span class="cx"> 
</span><span class="cx">             // This should always work because a function this simple should never have callee
</span><span class="lines">@@ -3562,6 +3574,7 @@
</span><span class="cx">             root-&gt;appendNew&lt;Const32Value&gt;(proc, Origin(), 42)));
</span><span class="cx">     check-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 1);
</span><span class="cx"> 
</span><span class="cx">             // This should always work because a function this simple should never have callee
</span><span class="lines">@@ -3601,6 +3614,7 @@
</span><span class="cx">     checkAdd-&gt;append(arg2);
</span><span class="cx">     checkAdd-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isConstant());
</span><span class="lines">@@ -3636,6 +3650,7 @@
</span><span class="cx">     checkAdd-&gt;append(arg2);
</span><span class="cx">     checkAdd-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isConstant());
</span><span class="lines">@@ -3671,6 +3686,7 @@
</span><span class="cx">     checkAdd-&gt;appendSomeRegister(arg2);
</span><span class="cx">     checkAdd-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -3707,6 +3723,7 @@
</span><span class="cx">     checkAdd-&gt;appendSomeRegister(arg2);
</span><span class="cx">     checkAdd-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -3739,6 +3756,7 @@
</span><span class="cx">     checkAdd-&gt;appendSomeRegister(arg2);
</span><span class="cx">     checkAdd-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -3787,6 +3805,7 @@
</span><span class="cx">     CheckValue* checkAdd = root-&gt;appendNew&lt;CheckValue&gt;(proc, CheckAdd, Origin(), arg1, arg2);
</span><span class="cx">     checkAdd-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp;) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             jit.move(CCallHelpers::TrustedImm32(42), GPRInfo::returnValueGPR);
</span><span class="cx">             jit.emitFunctionEpilogue();
</span><span class="cx">             jit.ret();
</span><span class="lines">@@ -3811,6 +3830,7 @@
</span><span class="cx">     checkSub-&gt;append(arg2);
</span><span class="cx">     checkSub-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isConstant());
</span><span class="lines">@@ -3847,6 +3867,7 @@
</span><span class="cx">     checkSub-&gt;append(arg2);
</span><span class="cx">     checkSub-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isConstant());
</span><span class="lines">@@ -3884,6 +3905,7 @@
</span><span class="cx">     checkSub-&gt;append(arg2);
</span><span class="cx">     checkSub-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -3921,6 +3943,7 @@
</span><span class="cx">     checkSub-&gt;append(arg2);
</span><span class="cx">     checkSub-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -3969,6 +3992,7 @@
</span><span class="cx">     CheckValue* checkSub = root-&gt;appendNew&lt;CheckValue&gt;(proc, CheckSub, Origin(), arg1, arg2);
</span><span class="cx">     checkSub-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp;) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             jit.move(CCallHelpers::TrustedImm32(42), GPRInfo::returnValueGPR);
</span><span class="cx">             jit.emitFunctionEpilogue();
</span><span class="cx">             jit.ret();
</span><span class="lines">@@ -3992,6 +4016,7 @@
</span><span class="cx">     checkNeg-&gt;append(arg2);
</span><span class="cx">     checkNeg-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             jit.convertInt32ToDouble(params.reps[2].gpr(), FPRInfo::fpRegT1);
</span><span class="lines">@@ -4021,6 +4046,7 @@
</span><span class="cx">     checkNeg-&gt;append(arg2);
</span><span class="cx">     checkNeg-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 3);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             jit.convertInt64ToDouble(params.reps[2].gpr(), FPRInfo::fpRegT1);
</span><span class="lines">@@ -4055,6 +4081,7 @@
</span><span class="cx">     checkMul-&gt;append(arg2);
</span><span class="cx">     checkMul-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -4095,6 +4122,7 @@
</span><span class="cx">     checkMul-&gt;append(arg2);
</span><span class="cx">     checkMul-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -4140,6 +4168,7 @@
</span><span class="cx">     checkMul-&gt;append(arg2);
</span><span class="cx">     checkMul-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isConstant());
</span><span class="lines">@@ -4173,6 +4202,7 @@
</span><span class="cx">     checkMul-&gt;append(arg2);
</span><span class="cx">     checkMul-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             CHECK(params.reps.size() == 4);
</span><span class="cx">             CHECK(params.reps[2].isGPR());
</span><span class="cx">             CHECK(params.reps[3].isGPR());
</span><span class="lines">@@ -4221,6 +4251,7 @@
</span><span class="cx">     CheckValue* checkMul = root-&gt;appendNew&lt;CheckValue&gt;(proc, CheckMul, Origin(), arg1, arg2);
</span><span class="cx">     checkMul-&gt;setGenerator(
</span><span class="cx">         [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp;) {
</span><ins>+            AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">             jit.move(CCallHelpers::TrustedImm32(42), GPRInfo::returnValueGPR);
</span><span class="cx">             jit.emitFunctionEpilogue();
</span><span class="cx">             jit.ret();
</span><span class="lines">@@ -4274,6 +4305,7 @@
</span><span class="cx">         PatchpointValue* patchpoint = thenCase-&gt;appendNew&lt;PatchpointValue&gt;(proc, Int32, Origin());
</span><span class="cx">         patchpoint-&gt;setGenerator(
</span><span class="cx">             [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
</span><ins>+                AllowMacroScratchRegisterUsage allowScratch(jit);
</ins><span class="cx">                 CHECK(params.reps.size() == 1);
</span><span class="cx">                 CHECK(params.reps[0].isGPR());
</span><span class="cx">                 jit.move(CCallHelpers::TrustedImm32(1), params.reps[0].gpr());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoredfgDFGCommonh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/dfg/DFGCommon.h (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/dfg/DFGCommon.h        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/dfg/DFGCommon.h        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx"> // We are in the middle of an experimental transition from LLVM to B3 as the backend for the FTL. We don't
</span><span class="cx"> // yet know how it will turn out. For now, this flag will control whether FTL uses B3. Remember to set this
</span><span class="cx"> // to 0 before committing!
</span><del>-#define FTL_USES_B3 0
</del><ins>+#define FTL_USES_B3 1
</ins><span class="cx"> 
</span><span class="cx"> struct Node;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitGPRInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/GPRInfo.h (192811 => 192812)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/GPRInfo.h        2015-11-30 19:52:46 UTC (rev 192811)
+++ trunk/Source/JavaScriptCore/jit/GPRInfo.h        2015-11-30 20:07:18 UTC (rev 192812)
</span><span class="lines">@@ -399,7 +399,6 @@
</span><span class="cx">     static const GPRReg callFrameRegister = X86Registers::ebp;
</span><span class="cx">     static const GPRReg tagTypeNumberRegister = X86Registers::r14;
</span><span class="cx">     static const GPRReg tagMaskRegister = X86Registers::r15;
</span><del>-    static const GPRReg scratchRegister = MacroAssembler::scratchRegister;
</del><span class="cx"> 
</span><span class="cx">     // Temporary registers.
</span><span class="cx">     static const GPRReg regT0 = X86Registers::eax;
</span><span class="lines">@@ -454,7 +453,7 @@
</span><span class="cx">     static const GPRReg returnValueGPR2 = X86Registers::edx; // regT1 or regT2
</span><span class="cx">     static const GPRReg nonPreservedNonReturnGPR = X86Registers::r10; // regT5 (regT4 on Windows)
</span><span class="cx">     static const GPRReg nonPreservedNonArgumentGPR = X86Registers::r10; // regT5 (regT4 on Windows)
</span><del>-    static const GPRReg patchpointScratchRegister = MacroAssembler::scratchRegister;
</del><ins>+    static const GPRReg patchpointScratchRegister = MacroAssembler::s_scratchRegister;
</ins><span class="cx"> 
</span><span class="cx">     static GPRReg toRegister(unsigned index)
</span><span class="cx">     {
</span><span class="lines">@@ -506,7 +505,7 @@
</span><span class="cx">     static const std::array&lt;GPRReg, 3&gt;&amp; reservedRegisters()
</span><span class="cx">     {
</span><span class="cx">         static const std::array&lt;GPRReg, 3&gt; reservedRegisters { {
</span><del>-            scratchRegister,
</del><ins>+            MacroAssembler::s_scratchRegister,
</ins><span class="cx">             tagTypeNumberRegister,
</span><span class="cx">             tagMaskRegister,
</span><span class="cx">         } };
</span></span></pre>
</div>
</div>

</body>
</html>