<!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>[187877] branches/jsc-tailcall/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/187877">187877</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2015-08-04 12:47:44 -0700 (Tue, 04 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>jsc-tailcall: Align callee save registers names across LLInt and JITs
https://bugs.webkit.org/show_bug.cgi?id=147640

Reviewed by Basile Clement.

Added callee save register aliases to both the LLInt and JITs and set the aliases to
the same register.  As a result, regCS0 in the JIT is the same as csr0 in the LLInt.
Some registers are unused in either the LLInt or JITs.

This is in preparation for properly handling callee save register restoration during exception
processing as all tiers are involved in the restoration process of all callee saves.

* jit/GPRInfo.h:
(JSC::GPRInfo::toIndex):
* jit/RegisterSet.cpp:
(JSC::RegisterSet::allVMCalleeSaveRegisters):
(JSC::RegisterSet::baselineCalleeSaveRegisters):
(JSC::RegisterSet::dfgCalleeSaveRegisters):
* llint/LowLevelInterpreter.asm:
* offlineasm/registers.rb:
* offlineasm/x86.rb:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreChangeLog">branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitGPRInfoh">branches/jsc-tailcall/Source/JavaScriptCore/jit/GPRInfo.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSetcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorellintLowLevelInterpreterasm">branches/jsc-tailcall/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreofflineasmregistersrb">branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/registers.rb</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreofflineasmx86rb">branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/x86.rb</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesjsctailcallSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog (187876 => 187877)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog        2015-08-04 19:22:52 UTC (rev 187876)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog        2015-08-04 19:47:44 UTC (rev 187877)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2015-08-04  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        jsc-tailcall: Align callee save registers names across LLInt and JITs
+        https://bugs.webkit.org/show_bug.cgi?id=147640
+
+        Reviewed by Basile Clement.
+
+        Added callee save register aliases to both the LLInt and JITs and set the aliases to
+        the same register.  As a result, regCS0 in the JIT is the same as csr0 in the LLInt.
+        Some registers are unused in either the LLInt or JITs.
+
+        This is in preparation for properly handling callee save register restoration during exception
+        processing as all tiers are involved in the restoration process of all callee saves.
+
+        * jit/GPRInfo.h:
+        (JSC::GPRInfo::toIndex):
+        * jit/RegisterSet.cpp:
+        (JSC::RegisterSet::allVMCalleeSaveRegisters):
+        (JSC::RegisterSet::baselineCalleeSaveRegisters):
+        (JSC::RegisterSet::dfgCalleeSaveRegisters):
+        * llint/LowLevelInterpreter.asm:
+        * offlineasm/registers.rb:
+        * offlineasm/x86.rb:
+
</ins><span class="cx"> 2015-08-04  Basile Clement  &lt;basile_clement@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         jsc-tailcall: We should abortWithReason() if we ever return from a tail call
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitGPRInfoh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/GPRInfo.h (187876 => 187877)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/GPRInfo.h        2015-08-04 19:22:52 UTC (rev 187876)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/GPRInfo.h        2015-08-04 19:47:44 UTC (rev 187877)
</span><span class="lines">@@ -403,15 +403,17 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     static const GPRReg regCS0 = X86Registers::ebx;
</span><ins>+
+#if !OS(WINDOWS)
</ins><span class="cx">     static const GPRReg regCS1 = X86Registers::r12;
</span><span class="cx">     static const GPRReg regCS2 = X86Registers::r13;
</span><del>-
-#if !OS(WINDOWS)
</del><span class="cx">     static const GPRReg regCS3 = X86Registers::r14;
</span><span class="cx">     static const GPRReg regCS4 = X86Registers::r15;
</span><span class="cx"> #else
</span><del>-    static const GPRReg regCS3 = X86Registers::esi;
-    static const GPRReg regCS4 = X86Registers::edi;
</del><ins>+    static const GPRReg regCS1 = X86Registers::esi;
+    static const GPRReg regCS2 = X86Registers::edi;
+    static const GPRReg regCS3 = X86Registers::r12;
+    static const GPRReg regCS4 = X86Registers::r13;
</ins><span class="cx">     static const GPRReg regCS5 = X86Registers::r14;
</span><span class="cx">     static const GPRReg regCS6 = X86Registers::r15;
</span><span class="cx"> #endif
</span><span class="lines">@@ -474,7 +476,7 @@
</span><span class="cx"> #if !OS(WINDOWS)
</span><span class="cx">         static const unsigned indexForRegister[16] = { 0, 3, 2, 8, InvalidIndex, InvalidIndex, 1, 6, 4, 7, 5, InvalidIndex, 9, 10, InvalidIndex, InvalidIndex };
</span><span class="cx"> #else
</span><del>-        static const unsigned indexForRegister[16] = { 0, 5, 1, 6, InvalidIndex, InvalidIndex, 9, 10, 2, 3, 4, InvalidIndex, 7, 8, InvalidIndex, InvalidIndex };
</del><ins>+        static const unsigned indexForRegister[16] = { 0, 5, 1, 6, InvalidIndex, InvalidIndex, 7, 8, 2, 3, 4, InvalidIndex, 9, 10, InvalidIndex, InvalidIndex };
</ins><span class="cx"> #endif
</span><span class="cx">         return indexForRegister[reg];
</span><span class="cx">     }
</span><span class="lines">@@ -612,8 +614,9 @@
</span><span class="cx">     static const GPRReg regT13 = ARM64Registers::x13;
</span><span class="cx">     static const GPRReg regT14 = ARM64Registers::x14;
</span><span class="cx">     static const GPRReg regT15 = ARM64Registers::x15;
</span><del>-    static const GPRReg regCS0 = ARM64Registers::x27; // tagTypeNumber
-    static const GPRReg regCS1 = ARM64Registers::x28; // tagMask
</del><ins>+    static const GPRReg regCS0 = ARM64Registers::x26; // Used by LLInt only
+    static const GPRReg regCS1 = ARM64Registers::x27; // tagTypeNumber
+    static const GPRReg regCS2 = ARM64Registers::x28; // tagMask
</ins><span class="cx">     // These constants provide the names for the general purpose argument &amp; return value registers.
</span><span class="cx">     static const GPRReg argumentGPR0 = ARM64Registers::x0; // regT0
</span><span class="cx">     static const GPRReg argumentGPR1 = ARM64Registers::x1; // regT1
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSetcpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp (187876 => 187877)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp        2015-08-04 19:22:52 UTC (rev 187876)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp        2015-08-04 19:47:44 UTC (rev 187877)
</span><span class="lines">@@ -146,11 +146,11 @@
</span><span class="cx"> #elif CPU(ARM_THUMB2)
</span><span class="cx"> #elif CPU(ARM_TRADITIONAL)
</span><span class="cx"> #elif CPU(ARM64)
</span><del>-    result.set(ARM64Registers::x26);
-    ASSERT(GPRInfo::regCS0 == GPRInfo::tagTypeNumberRegister);
-    ASSERT(GPRInfo::regCS1 == GPRInfo::tagMaskRegister);
</del><span class="cx">     result.set(GPRInfo::regCS0);
</span><ins>+    ASSERT(GPRInfo::regCS1 == GPRInfo::tagTypeNumberRegister);
+    ASSERT(GPRInfo::regCS2 == GPRInfo::tagMaskRegister);
</ins><span class="cx">     result.set(GPRInfo::regCS1);
</span><ins>+    result.set(GPRInfo::regCS2);
</ins><span class="cx"> #elif CPU(MIPS)
</span><span class="cx"> #elif CPU(SH4)
</span><span class="cx"> #else
</span><span class="lines">@@ -180,10 +180,10 @@
</span><span class="cx"> #elif CPU(ARM_THUMB2)
</span><span class="cx"> #elif CPU(ARM_TRADITIONAL)
</span><span class="cx"> #elif CPU(ARM64)
</span><del>-    ASSERT(GPRInfo::regCS0 == GPRInfo::tagTypeNumberRegister);
-    ASSERT(GPRInfo::regCS1 == GPRInfo::tagMaskRegister);
-    result.set(GPRInfo::regCS0);
</del><ins>+    ASSERT(GPRInfo::regCS1 == GPRInfo::tagTypeNumberRegister);
+    ASSERT(GPRInfo::regCS2 == GPRInfo::tagMaskRegister);
</ins><span class="cx">     result.set(GPRInfo::regCS1);
</span><ins>+    result.set(GPRInfo::regCS2);
</ins><span class="cx"> #elif CPU(MIPS)
</span><span class="cx"> #elif CPU(SH4)
</span><span class="cx"> #else
</span><span class="lines">@@ -216,10 +216,10 @@
</span><span class="cx"> #elif CPU(ARM_THUMB2)
</span><span class="cx"> #elif CPU(ARM_TRADITIONAL)
</span><span class="cx"> #elif CPU(ARM64)
</span><del>-    ASSERT(GPRInfo::regCS0 == GPRInfo::tagTypeNumberRegister);
-    ASSERT(GPRInfo::regCS1 == GPRInfo::tagMaskRegister);
-    result.set(GPRInfo::regCS0);
</del><ins>+    ASSERT(GPRInfo::regCS1 == GPRInfo::tagTypeNumberRegister);
+    ASSERT(GPRInfo::regCS2 == GPRInfo::tagMaskRegister);
</ins><span class="cx">     result.set(GPRInfo::regCS1);
</span><ins>+    result.set(GPRInfo::regCS2);
</ins><span class="cx"> #elif CPU(MIPS)
</span><span class="cx"> #elif CPU(SH4)
</span><span class="cx"> #else
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (187876 => 187877)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2015-08-04 19:22:52 UTC (rev 187876)
+++ branches/jsc-tailcall/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2015-08-04 19:47:44 UTC (rev 187877)
</span><span class="lines">@@ -107,9 +107,10 @@
</span><span class="cx"> #  - t4 and t5 are never argument registers, t3 can only be a3, t1 can only be
</span><span class="cx"> #  a1; but t0 and t2 can be either a0 or a2.
</span><span class="cx"> #
</span><del>-#  - On 64 bits, csr0, csr1 and csr2 are available as callee-save registers.
-#  csr0 is used to store the PC base, while csr1 and csr2 are used to store
-#  special tag values. Don't use them for anything else.
</del><ins>+#  - On 64 bits, csr0, csr1, csr2 and optionally csr3, csr4, csr5 and csr6
+#  are available as callee-save registers.
+#  csr0 is used to store the PC base, while the last two csr registers are used
+#  to store special tag values. Don't use them for anything else.
</ins><span class="cx"> #
</span><span class="cx"> # Additional platform-specific details (you shouldn't rely on this remaining
</span><span class="cx"> # true):
</span><span class="lines">@@ -239,9 +240,17 @@
</span><span class="cx">     #   This requires an add before the call, and a sub after.
</span><span class="cx">     const PC = t4
</span><span class="cx">     const PB = csr0
</span><del>-    const tagTypeNumber = csr1
-    const tagMask = csr2
-    
</del><ins>+    if ARM64
+        const tagTypeNumber = csr1
+        const tagMask = csr2
+    elsif X86_64
+        const tagTypeNumber = csr3
+        const tagMask = csr4
+    elsif X86_64_WIN
+        const tagTypeNumber = csr5
+        const tagMask = csr6
+    end
+
</ins><span class="cx">     macro loadisFromInstruction(offset, dest)
</span><span class="cx">         loadis offset * 8[PB, PC, 8], dest
</span><span class="cx">     end
</span><span class="lines">@@ -546,13 +555,13 @@
</span><span class="cx">     elsif X86
</span><span class="cx">     elsif X86_WIN
</span><span class="cx">     elsif X86_64
</span><del>-        storep csr2, -8[cfr]
-        storep csr1, -16[cfr]
</del><ins>+        storep csr4, -8[cfr]
+        storep csr3, -16[cfr]
</ins><span class="cx">         storep csr0, -24[cfr]
</span><span class="cx">     elsif X86_64_WIN
</span><span class="cx">         storep t4, -8[cfr]
</span><del>-        storep csr2, -16[cfr]
-        storep csr1, -24[cfr]
</del><ins>+        storep csr6, -16[cfr]
+        storep csr5, -24[cfr]
</ins><span class="cx">         storep csr0, -32[cfr]
</span><span class="cx">     end
</span><span class="cx"> end
</span><span class="lines">@@ -570,12 +579,12 @@
</span><span class="cx">     elsif X86_WIN
</span><span class="cx">     elsif X86_64
</span><span class="cx">         loadp -24[cfr], csr0
</span><del>-        loadp -16[cfr], csr1
-        loadp -8[cfr], csr2
</del><ins>+        loadp -16[cfr], csr3
+        loadp -8[cfr], csr4
</ins><span class="cx">     elsif X86_64_WIN
</span><span class="cx">         loadp -32[cfr], csr0
</span><del>-        loadp -24[cfr], csr1
-        loadp -16[cfr], csr2
</del><ins>+        loadp -24[cfr], csr5
+        loadp -16[cfr], csr6
</ins><span class="cx">         loadp -8[cfr], t4
</span><span class="cx">     end
</span><span class="cx"> end
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreofflineasmregistersrb"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/registers.rb (187876 => 187877)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/registers.rb        2015-08-04 19:22:52 UTC (rev 187876)
+++ branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/registers.rb        2015-08-04 19:47:44 UTC (rev 187877)
</span><span class="lines">@@ -43,8 +43,12 @@
</span><span class="cx">      &quot;pc&quot;,
</span><span class="cx">      # 64-bit only registers:
</span><span class="cx">      &quot;csr0&quot;,
</span><del>-     &quot;csr1&quot;,  # tag type number register
-     &quot;csr2&quot;   # tag mask register
</del><ins>+     &quot;csr1&quot;,
+     &quot;csr2&quot;,
+     &quot;csr3&quot;,
+     &quot;csr4&quot;,
+     &quot;csr5&quot;,
+     &quot;csr6&quot;
</ins><span class="cx">     ]
</span><span class="cx"> 
</span><span class="cx"> FPRS =
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreofflineasmx86rb"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/x86.rb (187876 => 187877)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/x86.rb        2015-08-04 19:22:52 UTC (rev 187876)
+++ branches/jsc-tailcall/Source/JavaScriptCore/offlineasm/x86.rb        2015-08-04 19:47:44 UTC (rev 187877)
</span><span class="lines">@@ -51,10 +51,10 @@
</span><span class="cx"> #  r8 =&gt; t4
</span><span class="cx"> # r10 =&gt; t5
</span><span class="cx"> # rbx =&gt;             csr0 (callee-save, PB, unused in baseline)
</span><del>-# r12 =&gt;                  (callee-save)
-# r13 =&gt;                  (callee-save)
-# r14 =&gt;             csr1 (callee-save, tagTypeNumber)
-# r15 =&gt;             csr2 (callee-save, tagMask)
</del><ins>+# r12 =&gt;             csr1 (callee-save)
+# r13 =&gt;             csr2 (callee-save)
+# r14 =&gt;             csr3 (callee-save, tagTypeNumber)
+# r15 =&gt;             csr4 (callee-save, tagMask)
</ins><span class="cx"> # rsp =&gt; sp
</span><span class="cx"> # rbp =&gt; cfr
</span><span class="cx"> # r11 =&gt;                  (scratch)
</span><span class="lines">@@ -69,13 +69,13 @@
</span><span class="cx"> #  r8 =&gt; t2, a2
</span><span class="cx"> #  r9 =&gt; t3, a3
</span><span class="cx"> # r10 =&gt; t4
</span><del>-# rsi =&gt;                  (callee-save)
</del><span class="cx"> # rbx =&gt;             csr0 (callee-save, PB, unused in baseline)
</span><del>-# rdi =&gt;                  (callee-save)
-# r12 =&gt;                  (callee-save)
-# r13 =&gt;                  (callee-save)
-# r14 =&gt;             csr1 (callee-save, tagTypeNumber)
-# r15 =&gt;             csr2 (callee-save, tagMask)
</del><ins>+# rsi =&gt;             csr1 (callee-save)
+# rdi =&gt;             csr2 (callee-save)
+# r12 =&gt;             csr3 (callee-save)
+# r13 =&gt;             csr4 (callee-save)
+# r14 =&gt;             csr5 (callee-save, tagTypeNumber)
+# r15 =&gt;             csr6 (callee-save, tagMask)
</ins><span class="cx"> # rsp =&gt; sp
</span><span class="cx"> # rbp =&gt; cfr
</span><span class="cx"> # r11 =&gt;                  (scratch)
</span><span class="lines">@@ -290,9 +290,20 @@
</span><span class="cx">             when &quot;csr0&quot;
</span><span class="cx">                 &quot;ebx&quot;
</span><span class="cx">             when &quot;csr1&quot;
</span><del>-                &quot;r14&quot;
</del><ins>+                &quot;r12&quot;
</ins><span class="cx">             when &quot;csr2&quot;
</span><ins>+                &quot;r13&quot;
+            when &quot;csr3&quot;
+                isWin ? &quot;esi&quot; : &quot;r14&quot;
+            when &quot;csr4&quot;
+                isWin ? &quot;edi&quot; : &quot;r15&quot;
</ins><span class="cx">                 &quot;r15&quot;
</span><ins>+            when &quot;csr5&quot;
+                raise &quot;cannot use register #{name} on X86-64&quot; unless isWin
+                &quot;r14&quot;
+            when &quot;csr6&quot;
+                raise &quot;cannot use register #{name} on X86-64&quot; unless isWin
+                &quot;r15&quot;
</ins><span class="cx">             when &quot;cfr&quot;
</span><span class="cx">                 &quot;ebp&quot;
</span><span class="cx">             when &quot;sp&quot;
</span></span></pre>
</div>
</div>

</body>
</html>