<!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>[164164] 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/164164">164164</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-02-15 00:30:54 -0800 (Sat, 15 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Win] LLINT is not working.
https://bugs.webkit.org/show_bug.cgi?id=128115

Patch by peavo@outlook.com &lt;peavo@outlook.com&gt; on 2014-02-15
Reviewed by Mark Lam.

This patch will generate assembly code with Intel syntax, which can be processed by the Microsoft assembler (MASM).
By creating an asm file instead of a header file with inline assembly, we can support 64-bit.
Only 32-bit compilation has been tested, not 64-bit.
The aim of this patch is to get LLINT up and running on Windows.

* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added new files, and generated asm file.
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
* LLIntAssembly/build-LLIntAssembly.sh: Generate dummy asm file in case we're using C backend.
* bytecode/CallLinkStatus.cpp:
(JSC::CallLinkStatus::computeFor): Compile fix when DFG is disabled.
* bytecode/GetByIdStatus.cpp:
(JSC::GetByIdStatus::computeFor): Ditto.
* bytecode/GetByIdStatus.h: Ditto.
* bytecode/PutByIdStatus.cpp:
(JSC::PutByIdStatus::computeFor): Ditto.
* bytecode/PutByIdStatus.h: Ditto.
* llint/LLIntData.cpp:
(JSC::LLInt::initialize): Compile fix.
* llint/LLIntSlowPaths.h: Added llint_crash function.
* llint/LLIntSlowPaths.cpp: Ditto.
* llint/LowLevelInterpreter.cpp: Disable code for Windows.
* llint/LowLevelInterpreter.asm: Remove instruction which generates incorrect assembly code on Windows (MOV 0xbbadbeef, register), call llint_crash instead.
Make local labels visible to MASM on Windows.
* llint/LowLevelInterpreter32_64.asm: Make local labels visible to MASM on Windows.
* offlineasm/asm.rb: Generate asm file with Intel assembly syntax.
* offlineasm/settings.rb: Ditto.
* offlineasm/x86.rb: Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojLLIntLLIntAssemblybuildLLIntAssemblysh">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeCallLinkStatuscpp">trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeGetByIdStatuscpp">trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodeGetByIdStatush">trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodePutByIdStatuscpp">trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorebytecodePutByIdStatush">trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntDatacpp">trunk/Source/JavaScriptCore/llint/LLIntData.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntSlowPathscpp">trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntSlowPathsh">trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.h</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreterasm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpretercpp">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreter32_64asm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmasmrb">trunk/Source/JavaScriptCore/offlineasm/asm.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmsettingsrb">trunk/Source/JavaScriptCore/offlineasm/settings.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmx86rb">trunk/Source/JavaScriptCore/offlineasm/x86.rb</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -1,3 +1,38 @@
</span><ins>+2014-02-15  peavo@outlook.com  &lt;peavo@outlook.com&gt;
+
+        [Win] LLINT is not working.
+        https://bugs.webkit.org/show_bug.cgi?id=128115
+
+        Reviewed by Mark Lam.
+
+        This patch will generate assembly code with Intel syntax, which can be processed by the Microsoft assembler (MASM).
+        By creating an asm file instead of a header file with inline assembly, we can support 64-bit.
+        Only 32-bit compilation has been tested, not 64-bit.
+        The aim of this patch is to get LLINT up and running on Windows.
+
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added new files, and generated asm file.
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
+        * LLIntAssembly/build-LLIntAssembly.sh: Generate dummy asm file in case we're using C backend.
+        * bytecode/CallLinkStatus.cpp:
+        (JSC::CallLinkStatus::computeFor): Compile fix when DFG is disabled.
+        * bytecode/GetByIdStatus.cpp:
+        (JSC::GetByIdStatus::computeFor): Ditto.
+        * bytecode/GetByIdStatus.h: Ditto.
+        * bytecode/PutByIdStatus.cpp:
+        (JSC::PutByIdStatus::computeFor): Ditto.
+        * bytecode/PutByIdStatus.h: Ditto.
+        * llint/LLIntData.cpp:
+        (JSC::LLInt::initialize): Compile fix.
+        * llint/LLIntSlowPaths.h: Added llint_crash function.
+        * llint/LLIntSlowPaths.cpp: Ditto.        
+        * llint/LowLevelInterpreter.cpp: Disable code for Windows.
+        * llint/LowLevelInterpreter.asm: Remove instruction which generates incorrect assembly code on Windows (MOV 0xbbadbeef, register), call llint_crash instead.
+        Make local labels visible to MASM on Windows.
+        * llint/LowLevelInterpreter32_64.asm: Make local labels visible to MASM on Windows.
+        * offlineasm/asm.rb: Generate asm file with Intel assembly syntax.
+        * offlineasm/settings.rb: Ditto.
+        * offlineasm/x86.rb: Ditto.
+
</ins><span class="cx"> 2014-02-14  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: CRASH when debugger closes while paused and remote inspecting a JSContext
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -513,6 +513,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\interpreter\ProtoCallFrame.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\interpreter\StackVisitor.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\interpreter\VMInspector.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\jit\ArityCheckFailReturnThunks.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\jit\AssemblyHelpers.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\ClosureCallStubRoutine.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\ExecutableAllocator.cpp&quot; /&gt;
</span><span class="lines">@@ -537,6 +538,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\JITStubs.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\JITThunks.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\JITToDFGDeferredCompilationCallback.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\jit\RegisterPreservationWrapperGenerator.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\jit\Repatch.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\ThunkGenerators.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\llint\LLIntCLoop.cpp&quot; /&gt;
</span><span class="lines">@@ -1119,6 +1121,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\interpreter\Register.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\interpreter\StackVisitor.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\interpreter\VMInspector.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\jit\ArityCheckFailReturnThunks.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\jit\AssemblyHelpers.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\CCallHelpers.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\ClosureCallStubRoutine.h&quot; /&gt;
</span><span class="lines">@@ -1147,6 +1150,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\JITWriteBarrier.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\JSInterfaceJIT.h&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\RegisterSet.cpp&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\jit\RegisterPreservationWrapperGenerator.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\jit\RegisterSet.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\Repatch.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\ScratchRegisterAllocator.h&quot; /&gt;
</span><span class="lines">@@ -1443,8 +1447,16 @@
</span><span class="cx">       &lt;FileType&gt;Document&lt;/FileType&gt;
</span><span class="cx">     &lt;/None&gt;
</span><span class="cx">   &lt;/ItemGroup&gt;
</span><ins>+  &lt;ItemGroup&gt;
+    &lt;MASM Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\LowLevelInterpreterWin.asm&quot;&gt;
+      &lt;UseSafeExceptionHandlers Condition=&quot;'$(Configuration)|$(Platform)'=='Release|Win32'&quot;&gt;true&lt;/UseSafeExceptionHandlers&gt;
+      &lt;UseSafeExceptionHandlers Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/UseSafeExceptionHandlers&gt;
+      &lt;UseSafeExceptionHandlers Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'&quot;&gt;true&lt;/UseSafeExceptionHandlers&gt;
+      &lt;UseSafeExceptionHandlers Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'&quot;&gt;true&lt;/UseSafeExceptionHandlers&gt;
+    &lt;/MASM&gt;
+  &lt;/ItemGroup&gt;
</ins><span class="cx">   &lt;Import Project=&quot;$(VCTargetsPath)\Microsoft.Cpp.targets&quot; /&gt;
</span><span class="cx">   &lt;ImportGroup Label=&quot;ExtensionTargets&quot;&gt;
</span><span class="cx">     &lt;Import Project=&quot;$(VCTargetsPath)\BuildCustomizations\masm.targets&quot; /&gt;
</span><span class="cx">   &lt;/ImportGroup&gt;
</span><del>-&lt;/Project&gt;
</del><ins>+&lt;/Project&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -1335,6 +1335,12 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\InspectorJSTypeBuilders.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;Derived Sources&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\jit\ArityCheckFailReturnThunks.cpp&quot;&gt;
+      &lt;Filter&gt;jit&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
+    &lt;ClCompile Include=&quot;..\jit\RegisterPreservationWrapperGenerator.cpp&quot;&gt;
+      &lt;Filter&gt;jit&lt;/Filter&gt;
+    &lt;/ClCompile&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSCBuiltins.cpp&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;Derived Sources&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClCompile&gt;
</span><span class="lines">@@ -3319,10 +3325,19 @@
</span><span class="cx">       &lt;Filter&gt;runtime&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSDataViewPrototype.lut.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\jit\ArityCheckFailReturnThunks.h&quot;&gt;
+      &lt;Filter&gt;jit&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
+    &lt;ClInclude Include=&quot;..\jit\RegisterPreservationWrapperGenerator.h&quot;&gt;
+      &lt;Filter&gt;jit&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">   &lt;/ItemGroup&gt;
</span><span class="cx">   &lt;ItemGroup&gt;
</span><span class="cx">     &lt;None Include=&quot;JavaScriptCorePreLink.cmd&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;JavaScriptCorePostBuild.cmd&quot; /&gt;
</span><span class="cx">     &lt;None Include=&quot;JavaScriptCorePreBuild.cmd&quot; /&gt;
</span><span class="cx">   &lt;/ItemGroup&gt;
</span><del>-&lt;/Project&gt;
</del><ins>+  &lt;ItemGroup&gt;
+    &lt;MASM Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\LowLevelInterpreterWin.asm&quot; /&gt;
+  &lt;/ItemGroup&gt;
+&lt;/Project&gt;
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojLLIntLLIntAssemblybuildLLIntAssemblysh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -23,4 +23,10 @@
</span><span class="cx"> ##############################################################################
</span><span class="cx"> # Step 3: Build LLIntOffsetsExtractor
</span><span class="cx"> 
</span><ins>+# Create a dummy asm file in case we are using the C backend
+# This is needed since LowLevelInterpreterWin.asm is part of the project.
+printf &quot;END&quot; &gt; LowLevelInterpreterWin.asm
+
+# When enabling LLINT and switching to the x86 backend, use &quot;LowLevelInterpreterWin.asm&quot; as output file when running asm.rb.
+
</ins><span class="cx"> /usr/bin/env ruby &quot;${SRCROOT}/offlineasm/asm.rb&quot; &quot;${SRCROOT}/llint/LowLevelInterpreter.asm&quot; &quot;${BUILT_PRODUCTS_DIR}/LLIntOffsetsExtractor/LLIntOffsetsExtractor${3}.exe&quot; &quot;LLIntAssembly.h&quot; || exit 1
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeCallLinkStatuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -121,7 +121,7 @@
</span><span class="cx">     
</span><span class="cx">     UNUSED_PARAM(profiledBlock);
</span><span class="cx">     UNUSED_PARAM(bytecodeIndex);
</span><del>-#if ENABLE(JIT)
</del><ins>+#if ENABLE(DFG_JIT)
</ins><span class="cx">     if (profiledBlock-&gt;hasExitSite(locker, DFG::FrequentExitSite(bytecodeIndex, BadCache))
</span><span class="cx">         || profiledBlock-&gt;hasExitSite(locker, DFG::FrequentExitSite(bytecodeIndex, BadCacheWatchpoint))
</span><span class="cx">         || profiledBlock-&gt;hasExitSite(locker, DFG::FrequentExitSite(bytecodeIndex, BadExecutable)))
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeGetByIdStatuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-#if ENABLE(JIT)
</del><ins>+#if ENABLE(DFG_JIT)
</ins><span class="cx"> bool GetByIdStatus::hasExitSite(const ConcurrentJITLocker&amp; locker, CodeBlock* profiledBlock, unsigned bytecodeIndex, ExitingJITType jitType)
</span><span class="cx"> {
</span><span class="cx">     return profiledBlock-&gt;hasExitSite(locker, DFG::FrequentExitSite(bytecodeIndex, BadCache, jitType))
</span><span class="lines">@@ -132,7 +132,7 @@
</span><span class="cx"> 
</span><span class="cx">     GetByIdStatus result;
</span><span class="cx"> 
</span><del>-#if ENABLE(JIT)
</del><ins>+#if ENABLE(DFG_JIT)
</ins><span class="cx">     result = computeForStubInfo(
</span><span class="cx">         locker, profiledBlock, map.get(CodeOrigin(bytecodeIndex)), uid);
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodeGetByIdStatush"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.h        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -95,8 +95,10 @@
</span><span class="cx">     bool wasSeenInJIT() const { return m_wasSeenInJIT; }
</span><span class="cx">     
</span><span class="cx"> private:
</span><ins>+#if ENABLE(DFG_JIT)
+    static bool hasExitSite(const ConcurrentJITLocker&amp;, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
+#endif
</ins><span class="cx"> #if ENABLE(JIT)
</span><del>-    static bool hasExitSite(const ConcurrentJITLocker&amp;, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
</del><span class="cx">     static GetByIdStatus computeForStubInfo(const ConcurrentJITLocker&amp;, CodeBlock*, StructureStubInfo*, StringImpl* uid);
</span><span class="cx"> #endif
</span><span class="cx">     static void computeForChain(GetByIdStatus&amp; result, CodeBlock*, StringImpl* uid);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodePutByIdStatuscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.cpp        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-#if ENABLE(JIT)
</del><ins>+#if ENABLE(DFG_JIT)
</ins><span class="cx"> bool PutByIdStatus::hasExitSite(const ConcurrentJITLocker&amp; locker, CodeBlock* profiledBlock, unsigned bytecodeIndex, ExitingJITType exitType)
</span><span class="cx"> {
</span><span class="cx">     return profiledBlock-&gt;hasExitSite(locker, DFG::FrequentExitSite(bytecodeIndex, BadCache, exitType))
</span><span class="lines">@@ -99,7 +99,7 @@
</span><span class="cx">     UNUSED_PARAM(profiledBlock);
</span><span class="cx">     UNUSED_PARAM(bytecodeIndex);
</span><span class="cx">     UNUSED_PARAM(uid);
</span><del>-#if ENABLE(JIT)
</del><ins>+#if ENABLE(DFG_JIT)
</ins><span class="cx">     if (profiledBlock-&gt;likelyToTakeSlowCase(bytecodeIndex)
</span><span class="cx">         || hasExitSite(locker, profiledBlock, bytecodeIndex))
</span><span class="cx">         return PutByIdStatus(TakesSlowPath, 0, 0, 0, invalidOffset);
</span><span class="lines">@@ -173,7 +173,7 @@
</span><span class="cx"> 
</span><span class="cx"> PutByIdStatus PutByIdStatus::computeFor(CodeBlock* baselineBlock, CodeBlock* dfgBlock, StubInfoMap&amp; baselineMap, StubInfoMap&amp; dfgMap, CodeOrigin codeOrigin, StringImpl* uid)
</span><span class="cx"> {
</span><del>-#if ENABLE(JIT)
</del><ins>+#if ENABLE(DFG_JIT)
</ins><span class="cx">     if (dfgBlock) {
</span><span class="cx">         {
</span><span class="cx">             ConcurrentJITLocker locker(baselineBlock-&gt;m_lock);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorebytecodePutByIdStatush"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/bytecode/PutByIdStatus.h        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -111,8 +111,10 @@
</span><span class="cx">     PropertyOffset offset() const { return m_offset; }
</span><span class="cx">     
</span><span class="cx"> private:
</span><ins>+#if ENABLE(DFG_JIT)
+    static bool hasExitSite(const ConcurrentJITLocker&amp;, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
+#endif
</ins><span class="cx"> #if ENABLE(JIT)
</span><del>-    static bool hasExitSite(const ConcurrentJITLocker&amp;, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
</del><span class="cx">     static PutByIdStatus computeForStubInfo(const ConcurrentJITLocker&amp;, CodeBlock*, StructureStubInfo*, StringImpl* uid);
</span><span class="cx"> #endif
</span><span class="cx">     static PutByIdStatus computeFromLLInt(CodeBlock*, unsigned bytecodeIndex, StringImpl* uid);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntData.cpp (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntData.cpp        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/llint/LLIntData.cpp        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">         Data::s_exceptionInstructions[i].u.pointer =
</span><span class="cx">             LLInt::getCodePtr(llint_throw_from_slow_path_trampoline);
</span><span class="cx">     #define OPCODE_ENTRY(opcode, length) \
</span><del>-        Data::s_opcodeMap[opcode] = LLInt::getCodePtr(llint_##opcode);
</del><ins>+        Data::s_opcodeMap[opcode] = static_cast&lt;Opcode&gt;(LLInt::getCodePtr(llint_##opcode));
</ins><span class="cx">     FOR_EACH_OPCODE_ID(OPCODE_ENTRY);
</span><span class="cx">     #undef OPCODE_ENTRY
</span><span class="cx">     #endif // !ENABLE(LLINT_C_LOOP)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntSlowPathscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -1443,6 +1443,11 @@
</span><span class="cx">     vm.heap.writeBarrier(cell);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+extern &quot;C&quot; NO_RETURN_DUE_TO_CRASH void llint_crash()
+{
+    CRASH();
+}
+
</ins><span class="cx"> } } // namespace JSC::LLInt
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(LLINT)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntSlowPathsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.h (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.h        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.h        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -128,6 +128,7 @@
</span><span class="cx"> #if ENABLE(LLINT_C_LOOP)
</span><span class="cx"> extern &quot;C&quot; SlowPathReturnType llint_stack_check_at_vm_entry(VM*, Register*) WTF_INTERNAL;
</span><span class="cx"> #endif
</span><ins>+extern &quot;C&quot; NO_RETURN_DUE_TO_CRASH void llint_crash() WTF_INTERNAL;
</ins><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::LLInt
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -209,9 +209,7 @@
</span><span class="cx">     if C_LOOP
</span><span class="cx">         cloopCrash
</span><span class="cx">     else
</span><del>-        storei t0, 0xbbadbeef[]
-        move 0, t0
-        call t0
</del><ins>+        call _llint_crash
</ins><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="lines">@@ -694,14 +692,12 @@
</span><span class="cx"> 
</span><span class="cx"> _llint_function_for_call_prologue:
</span><span class="cx">     prologue(functionForCallCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_call, _llint_trace_prologue_function_for_call)
</span><del>-.functionForCallBegin:
</del><span class="cx">     functionInitialization(0)
</span><span class="cx">     dispatch(0)
</span><span class="cx">     
</span><span class="cx"> 
</span><span class="cx"> _llint_function_for_construct_prologue:
</span><span class="cx">     prologue(functionForConstructCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_construct, _llint_trace_prologue_function_for_construct)
</span><del>-.functionForConstructBegin:
</del><span class="cx">     functionInitialization(1)
</span><span class="cx">     dispatch(0)
</span><span class="cx">     
</span><span class="lines">@@ -709,11 +705,17 @@
</span><span class="cx"> _llint_function_for_call_arity_check:
</span><span class="cx">     prologue(functionForCallCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_call_arityCheck, _llint_trace_arityCheck_for_call)
</span><span class="cx">     functionArityCheck(.functionForCallBegin, _slow_path_call_arityCheck)
</span><ins>+.functionForCallBegin:
+    functionInitialization(0)
+    dispatch(0)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> _llint_function_for_construct_arity_check:
</span><span class="cx">     prologue(functionForConstructCodeBlockGetter, functionCodeBlockSetter, _llint_entry_osr_function_for_construct_arityCheck, _llint_trace_arityCheck_for_construct)
</span><span class="cx">     functionArityCheck(.functionForConstructBegin, _slow_path_construct_arityCheck)
</span><ins>+.functionForConstructBegin:
+    functionInitialization(1)
+    dispatch(0)
</ins><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> # Value-representation-specific code.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpretercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -485,7 +485,7 @@
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><del>-#else // !ENABLE(LLINT_C_LOOP)
</del><ins>+#elif !OS(WINDOWS)
</ins><span class="cx"> 
</span><span class="cx"> //============================================================================
</span><span class="cx"> // Define the opcode dispatch mechanism when using an ASM loop:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter32_64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -1459,16 +1459,16 @@
</span><span class="cx">             storei t2, PayloadOffset[propertyStorage, t1]
</span><span class="cx">             dispatch(9)
</span><span class="cx">         end)
</span><ins>+
+    .opPutByIdSlow:
+        callSlowPath(_llint_slow_path_put_by_id)
+        dispatch(9)
</ins><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> _llint_op_put_by_id:
</span><span class="cx">     putById(withInlineStorage)
</span><span class="cx"> 
</span><del>-.opPutByIdSlow:
-    callSlowPath(_llint_slow_path_put_by_id)
-    dispatch(9)
</del><span class="cx"> 
</span><del>-
</del><span class="cx"> _llint_op_put_by_id_out_of_line:
</span><span class="cx">     putById(withOutOfLineStorage)
</span><span class="cx"> 
</span><span class="lines">@@ -1481,7 +1481,7 @@
</span><span class="cx">     loadConstantOrVariablePayload(t3, CellTag, t0, .opPutByIdSlow)
</span><span class="cx">     loadi 12[PC], t2
</span><span class="cx">     bpneq JSCell::m_structure[t0], t1, .opPutByIdSlow
</span><del>-    additionalChecks(t1, t3)
</del><ins>+    additionalChecks(t1, t3, .opPutByIdSlow)
</ins><span class="cx">     loadi 20[PC], t1
</span><span class="cx">     getPropertyStorage(
</span><span class="cx">         t0,
</span><span class="lines">@@ -1495,12 +1495,16 @@
</span><span class="cx">             storep t1, JSCell::m_structure[t0]
</span><span class="cx">             dispatch(9)
</span><span class="cx">         end)
</span><ins>+
+    .opPutByIdSlow:
+        callSlowPath(_llint_slow_path_put_by_id)
+        dispatch(9)
</ins><span class="cx"> end
</span><span class="cx"> 
</span><del>-macro noAdditionalChecks(oldStructure, scratch)
</del><ins>+macro noAdditionalChecks(oldStructure, scratch, slowPath)
</ins><span class="cx"> end
</span><span class="cx"> 
</span><del>-macro structureChainChecks(oldStructure, scratch)
</del><ins>+macro structureChainChecks(oldStructure, scratch, slowPath)
</ins><span class="cx">     const protoCell = oldStructure   # Reusing the oldStructure register for the proto
</span><span class="cx"> 
</span><span class="cx">     loadp 28[PC], scratch
</span><span class="lines">@@ -1511,7 +1515,7 @@
</span><span class="cx"> .loop:
</span><span class="cx">     loadi Structure::m_prototype + PayloadOffset[oldStructure], protoCell
</span><span class="cx">     loadp JSCell::m_structure[protoCell], oldStructure
</span><del>-    bpneq oldStructure, [scratch], .opPutByIdSlow
</del><ins>+    bpneq oldStructure, [scratch], slowPath
</ins><span class="cx">     addp 4, scratch
</span><span class="cx">     bineq Structure::m_prototype + TagOffset[oldStructure], NullTag, .loop
</span><span class="cx"> .done:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmasmrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/asm.rb (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/asm.rb        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/offlineasm/asm.rb        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -47,16 +47,18 @@
</span><span class="cx">         @numGlobalLabels = 0
</span><span class="cx"> 
</span><span class="cx">         @newlineSpacerState = :none
</span><ins>+        @lastlabel = &quot;&quot;
</ins><span class="cx">     end
</span><del>-    
</del><ins>+
</ins><span class="cx">     def enterAsm
</span><del>-        @outp.puts &quot;OFFLINE_ASM_BEGIN&quot;
</del><ins>+        @outp.puts &quot;OFFLINE_ASM_BEGIN&quot; if !$emitWinAsm
</ins><span class="cx">         @state = :asm
</span><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def leaveAsm
</span><ins>+        putsProcEndIfNeeded if $emitWinAsm
</ins><span class="cx">         putsLastComment
</span><del>-        @outp.puts &quot;OFFLINE_ASM_END&quot;
</del><ins>+        @outp.puts &quot;OFFLINE_ASM_END&quot; if !$emitWinAsm
</ins><span class="cx">         @state = :cpp
</span><span class="cx">     end
</span><span class="cx">     
</span><span class="lines">@@ -84,7 +86,7 @@
</span><span class="cx">             result += &quot;#{@codeOrigin}&quot;
</span><span class="cx">         end
</span><span class="cx">         if result != &quot;&quot;
</span><del>-            result = &quot;// &quot; + result
</del><ins>+            result = $commentPrefix + &quot; &quot; + result
</ins><span class="cx">         end
</span><span class="cx"> 
</span><span class="cx">         # Reset all the components that we've just sent to be dumped.
</span><span class="lines">@@ -137,7 +139,11 @@
</span><span class="cx">     
</span><span class="cx">     def puts(*line)
</span><span class="cx">         raise unless @state == :asm
</span><del>-        @outp.puts(formatDump(&quot;    \&quot;\\t&quot; + line.join('') + &quot;\\n\&quot;&quot;, lastComment))
</del><ins>+        if !$emitWinAsm
+            @outp.puts(formatDump(&quot;    \&quot;\\t&quot; + line.join('') + &quot;\\n\&quot;&quot;, lastComment))
+        else
+            @outp.puts(formatDump(&quot;    &quot; + line.join(''), lastComment))
+        end
</ins><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def print(line)
</span><span class="lines">@@ -152,15 +158,39 @@
</span><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx"> 
</span><ins>+    def putsProc(label, comment)
+        raise unless $emitWinAsm
+        @outp.puts(formatDump(&quot;#{label} PROC PUBLIC&quot;, comment))
+        @lastlabel = label
+    end
+
+    def putsProcEndIfNeeded
+        raise unless $emitWinAsm
+        if @lastlabel != &quot;&quot;
+            @outp.puts(&quot;#{@lastlabel} ENDP&quot;)
+        end
+        @lastlabel = &quot;&quot;
+    end
+
</ins><span class="cx">     def putsLabel(labelName)
</span><span class="cx">         raise unless @state == :asm
</span><span class="cx">         @numGlobalLabels += 1
</span><ins>+        putsProcEndIfNeeded if $emitWinAsm
</ins><span class="cx">         putsNewlineSpacerIfAppropriate(:global)
</span><span class="cx">         @internalComment = $enableLabelCountComments ? &quot;Global Label #{@numGlobalLabels}&quot; : nil
</span><span class="cx">         if /\Allint_op_/.match(labelName)
</span><del>-            @outp.puts(formatDump(&quot;OFFLINE_ASM_OPCODE_LABEL(op_#{$~.post_match})&quot;, lastComment))
</del><ins>+            if !$emitWinAsm
+                @outp.puts(formatDump(&quot;OFFLINE_ASM_OPCODE_LABEL(op_#{$~.post_match})&quot;, lastComment))
+            else
+                label = &quot;llint_&quot; + &quot;op_#{$~.post_match}&quot;
+                putsProc(label, lastComment)
+            end
</ins><span class="cx">         else
</span><del>-            @outp.puts(formatDump(&quot;OFFLINE_ASM_GLUE_LABEL(#{labelName})&quot;, lastComment))
</del><ins>+            if !$emitWinAsm
+                @outp.puts(formatDump(&quot;OFFLINE_ASM_GLUE_LABEL(#{labelName})&quot;, lastComment))
+            else
+                putsProc(labelName, lastComment)
+            end
</ins><span class="cx">         end
</span><span class="cx">         @newlineSpacerState = :none # After a global label, we can use another spacer.
</span><span class="cx">     end
</span><span class="lines">@@ -170,15 +200,27 @@
</span><span class="cx">         @numLocalLabels += 1
</span><span class="cx">         @outp.puts(&quot;\n&quot;)
</span><span class="cx">         @internalComment = $enableLabelCountComments ? &quot;Local Label #{@numLocalLabels}&quot; : nil
</span><del>-        @outp.puts(formatDump(&quot;  OFFLINE_ASM_LOCAL_LABEL(#{labelName})&quot;, lastComment))
</del><ins>+        if !$emitWinAsm
+            @outp.puts(formatDump(&quot;  OFFLINE_ASM_LOCAL_LABEL(#{labelName})&quot;, lastComment))
+        else
+            @outp.puts(formatDump(&quot;  #{labelName}:&quot;, lastComment))
+        end
</ins><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def self.labelReference(labelName)
</span><del>-        &quot;\&quot; LOCAL_REFERENCE(#{labelName}) \&quot;&quot;
</del><ins>+        if !$emitWinAsm
+            &quot;\&quot; LOCAL_REFERENCE(#{labelName}) \&quot;&quot;
+        else
+            &quot;#{labelName}&quot;
+        end
</ins><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def self.localLabelReference(labelName)
</span><del>-        &quot;\&quot; LOCAL_LABEL_STRING(#{labelName}) \&quot;&quot;
</del><ins>+        if !$emitWinAsm
+            &quot;\&quot; LOCAL_LABEL_STRING(#{labelName}) \&quot;&quot;
+        else
+            &quot;#{labelName}&quot;
+        end
</ins><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def self.cLabelReference(labelName)
</span><span class="lines">@@ -200,8 +242,8 @@
</span><span class="cx">             @commentState = :one
</span><span class="cx">         when :one
</span><span class="cx">             if $enableCodeOriginComments
</span><del>-                @outp.puts &quot;    // #{@codeOrigin}&quot;
-                @outp.puts &quot;    // #{text}&quot;
</del><ins>+                @outp.puts &quot;    &quot; + $commentPrefix + &quot; #{@codeOrigin}&quot;
+                @outp.puts &quot;    &quot; + $commentPrefix + &quot; #{text}&quot;
</ins><span class="cx">             end
</span><span class="cx">             @codeOrigin = nil
</span><span class="cx">             @commentState = :many
</span><span class="lines">@@ -233,8 +275,11 @@
</span><span class="cx">     exit 0
</span><span class="cx"> end
</span><span class="cx"> 
</span><ins>+$emitWinAsm = isMSVC ? outputFlnm.index(&quot;.asm&quot;) != nil : false
+$commentPrefix = $emitWinAsm ? &quot;;&quot; : &quot;//&quot;
+
</ins><span class="cx"> inputHash =
</span><del>-    &quot;// offlineasm input hash: &quot; + parseHash(asmFile) +
</del><ins>+    $commentPrefix + &quot; offlineasm input hash: &quot; + parseHash(asmFile) +
</ins><span class="cx">     &quot; &quot; + Digest::SHA1.hexdigest(configurationList.map{|v| (v[0] + [v[1]]).join(' ')}.join(' ')) +
</span><span class="cx">     &quot; &quot; + selfHash
</span><span class="cx"> 
</span><span class="lines">@@ -253,11 +298,11 @@
</span><span class="cx">     | outp |
</span><span class="cx">     $output = outp
</span><span class="cx">     $output.puts inputHash
</span><del>-    
</del><ins>+
</ins><span class="cx">     $asm = Assembler.new($output)
</span><span class="cx">     
</span><span class="cx">     ast = parse(asmFile)
</span><del>-    
</del><ins>+
</ins><span class="cx">     configurationList.each {
</span><span class="cx">         | configuration |
</span><span class="cx">         offsetsList = configuration[0]
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmsettingsrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/settings.rb (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/settings.rb        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/offlineasm/settings.rb        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -172,7 +172,13 @@
</span><span class="cx"> #
</span><span class="cx"> 
</span><span class="cx"> def emitCodeInConfiguration(concreteSettings, ast, backend)
</span><del>-    $output.puts cppSettingsTest(concreteSettings)
</del><ins>+    if !$emitWinAsm
+        $output.puts cppSettingsTest(concreteSettings)
+    else
+        $output.puts &quot;.MODEL FLAT, C&quot;
+        $output.puts &quot;INCLUDE #{File.basename($output.path)}.sym&quot;
+        $output.puts &quot;_TEXT SEGMENT&quot;
+    end
</ins><span class="cx">     
</span><span class="cx">     if isASTErroneous(ast)
</span><span class="cx">         $output.puts &quot;#error \&quot;Invalid configuration.\&quot;&quot;
</span><span class="lines">@@ -182,7 +188,12 @@
</span><span class="cx">         yield concreteSettings, ast, backend
</span><span class="cx">     end
</span><span class="cx">     
</span><del>-    $output.puts &quot;#endif&quot;
</del><ins>+    if !$emitWinAsm
+        $output.puts &quot;#endif&quot;
+    else
+        $output.puts &quot;_TEXT ENDS&quot;
+        $output.puts &quot;END&quot;
+    end
</ins><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> #
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmx86rb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/x86.rb (164163 => 164164)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/x86.rb        2014-02-15 08:28:41 UTC (rev 164163)
+++ trunk/Source/JavaScriptCore/offlineasm/x86.rb        2014-02-15 08:30:54 UTC (rev 164164)
</span><span class="lines">@@ -46,6 +46,64 @@
</span><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><ins>+def isWindows
+    RUBY_PLATFORM =~ /cygwin/i
+end
+
+def isGCC
+    !isWindows
+end
+
+def isMSVC
+    isWindows
+end
+
+def isIntelSyntax
+    isWindows
+end
+
+def register(name)
+    isIntelSyntax ? name : &quot;%&quot; + name
+end
+
+def offsetRegister(off, register)
+    isIntelSyntax ? &quot;[#{off} + #{register}]&quot; : &quot;#{off}(#{register})&quot;
+end
+
+def callPrefix
+    isIntelSyntax ? &quot;&quot; : &quot;*&quot;
+end
+
+def orderOperands(opA, opB)
+    isIntelSyntax ? &quot;#{opB}, #{opA}&quot; : &quot;#{opA}, #{opB}&quot;
+end
+
+def const(c)
+    isIntelSyntax ? &quot;#{c}&quot; : &quot;$#{c}&quot;
+end
+
+def getSizeString(kind)
+    if !isIntelSyntax
+        return &quot;&quot;
+    end
+
+    size = &quot;&quot;
+    case kind
+    when :byte
+        size = &quot;byte&quot;
+    when :half
+        size = &quot;word&quot;
+    when :int
+        size = &quot;dword&quot;
+    when :ptr
+        size = &quot;dword&quot;
+    else
+        raise
+    end
+
+    return size + &quot; &quot; + &quot;ptr&quot; + &quot; &quot;;
+end
+
</ins><span class="cx"> class SpecialRegister &lt; NoChildren
</span><span class="cx">     def x86Operand(kind)
</span><span class="cx">         raise unless @name =~ /^r/
</span><span class="lines">@@ -65,7 +123,7 @@
</span><span class="cx">     end
</span><span class="cx">     def x86CallOperand(kind)
</span><span class="cx">         # Call operands are not allowed to be partial registers.
</span><del>-        &quot;*#{x86Operand(:quad)}&quot;
</del><ins>+        &quot;#{callPrefix}#{x86Operand(:quad)}&quot;
</ins><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="lines">@@ -90,75 +148,75 @@
</span><span class="cx">         when &quot;t0&quot;, &quot;a0&quot;, &quot;r0&quot;
</span><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><del>-                &quot;%al&quot;
</del><ins>+                register(&quot;al&quot;)
</ins><span class="cx">             when :half
</span><del>-                &quot;%ax&quot;
</del><ins>+                register(&quot;ax&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%eax&quot;
</del><ins>+                register(&quot;eax&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                isX64 ? &quot;%rax&quot; : &quot;%eax&quot;
</del><ins>+                isX64 ? register(&quot;rax&quot;) : register(&quot;eax&quot;)
</ins><span class="cx">             when :quad
</span><del>-                isX64 ? &quot;%rax&quot; : raise
</del><ins>+                isX64 ? register(&quot;rax&quot;) : raise
</ins><span class="cx">             else
</span><span class="cx">                 raise &quot;Invalid kind #{kind} for name #{name}&quot;
</span><span class="cx">             end
</span><span class="cx">         when &quot;t1&quot;, &quot;a1&quot;, &quot;r1&quot;
</span><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><del>-                &quot;%dl&quot;
</del><ins>+                register(&quot;dl&quot;)
</ins><span class="cx">             when :half
</span><del>-                &quot;%dx&quot;
</del><ins>+                register(&quot;dx&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%edx&quot;
</del><ins>+                register(&quot;edx&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                isX64 ? &quot;%rdx&quot; : &quot;%edx&quot;
</del><ins>+                isX64 ? register(&quot;rdx&quot;) : register(&quot;edx&quot;)
</ins><span class="cx">             when :quad
</span><del>-                isX64 ? &quot;%rdx&quot; : raise
</del><ins>+                isX64 ? register(&quot;rdx&quot;) : raise
</ins><span class="cx">             else
</span><span class="cx">                 raise
</span><span class="cx">             end
</span><span class="cx">         when &quot;t2&quot;
</span><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><del>-                &quot;%cl&quot;
</del><ins>+                register(&quot;cl&quot;)
</ins><span class="cx">             when :half
</span><del>-                &quot;%cx&quot;
</del><ins>+                register(&quot;cx&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%ecx&quot;
</del><ins>+                register(&quot;ecx&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                isX64 ? &quot;%rcx&quot; : &quot;%ecx&quot;
</del><ins>+                isX64 ? register(&quot;rcx&quot;) : register(&quot;ecx&quot;)
</ins><span class="cx">             when :quad
</span><del>-                isX64 ? &quot;%rcx&quot; : raise
</del><ins>+                isX64 ? register(&quot;rcx&quot;) : raise
</ins><span class="cx">             else
</span><span class="cx">                 raise
</span><span class="cx">             end
</span><span class="cx">         when &quot;t3&quot;
</span><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><del>-                &quot;%bl&quot;
</del><ins>+                register(&quot;bl&quot;)
</ins><span class="cx">             when :half
</span><del>-                &quot;%bx&quot;
</del><ins>+                register(&quot;bx&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%ebx&quot;
</del><ins>+                register(&quot;ebx&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                isX64 ? &quot;%rbx&quot; : &quot;%ebx&quot;
</del><ins>+                isX64 ? register(&quot;rbx&quot;) : register(&quot;ebx&quot;)
</ins><span class="cx">             when :quad
</span><del>-                isX64 ? &quot;%rbx&quot; : raise
</del><ins>+                isX64 ? register(&quot;rbx&quot;) : raise
</ins><span class="cx">             else
</span><span class="cx">                 raise
</span><span class="cx">             end
</span><span class="cx">         when &quot;t4&quot;
</span><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><del>-                &quot;%dil&quot;
</del><ins>+                register(&quot;dil&quot;)
</ins><span class="cx">             when :half
</span><del>-                &quot;%di&quot;
</del><ins>+                register(&quot;di&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%edi&quot;
</del><ins>+                register(&quot;edi&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                isX64 ? &quot;%rdi&quot; : &quot;%edi&quot;
</del><ins>+                isX64 ? register(&quot;rdi&quot;) : register(&quot;edi&quot;)
</ins><span class="cx">             when :quad
</span><del>-                isX64 ? &quot;%rdi&quot; : raise
</del><ins>+                isX64 ? register(&quot;rdi&quot;) : raise
</ins><span class="cx">             else
</span><span class="cx">                 raise
</span><span class="cx">             end
</span><span class="lines">@@ -166,24 +224,24 @@
</span><span class="cx">             if isX64
</span><span class="cx">                 case kind
</span><span class="cx">                 when :half
</span><del>-                    &quot;%bp&quot;
</del><ins>+                    register(&quot;bp&quot;)
</ins><span class="cx">                 when :int
</span><del>-                    &quot;%ebp&quot;
</del><ins>+                    register(&quot;ebp&quot;)
</ins><span class="cx">                 when :ptr
</span><del>-                    &quot;%rbp&quot;
</del><ins>+                    register(&quot;rbp&quot;)
</ins><span class="cx">                 when :quad
</span><del>-                    &quot;%rbp&quot;
</del><ins>+                    register(&quot;rbp&quot;)
</ins><span class="cx">                 else
</span><span class="cx">                     raise
</span><span class="cx">                 end
</span><span class="cx">             else
</span><span class="cx">                 case kind
</span><span class="cx">                 when :half
</span><del>-                    &quot;%bp&quot;
</del><ins>+                    register(&quot;bp&quot;)
</ins><span class="cx">                 when :int
</span><del>-                    &quot;%ebp&quot;
</del><ins>+                    register(&quot;ebp&quot;)
</ins><span class="cx">                 when :ptr
</span><del>-                    &quot;%ebp&quot;
</del><ins>+                    register(&quot;ebp&quot;)
</ins><span class="cx">                 else
</span><span class="cx">                     raise
</span><span class="cx">                 end
</span><span class="lines">@@ -191,30 +249,30 @@
</span><span class="cx">         when &quot;sp&quot;
</span><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><del>-                &quot;%spl&quot;
</del><ins>+                register(&quot;spl&quot;)
</ins><span class="cx">             when :half
</span><del>-                &quot;%sp&quot;
</del><ins>+                register(&quot;sp&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%esp&quot;
</del><ins>+                register(&quot;esp&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                isX64 ? &quot;%rsp&quot; : &quot;%esp&quot;
</del><ins>+                isX64 ? register(&quot;rsp&quot;) : register(&quot;esp&quot;)
</ins><span class="cx">             when :quad
</span><del>-                isX64 ? &quot;%rsp&quot; : raise
</del><ins>+                isX64 ? register(&quot;rsp&quot;) : raise
</ins><span class="cx">             else
</span><span class="cx">                 raise
</span><span class="cx">             end
</span><span class="cx">         when &quot;t5&quot;
</span><span class="cx">             case kind
</span><span class="cx">             when :byte
</span><del>-                &quot;%sil&quot;
</del><ins>+                register(&quot;sil&quot;)
</ins><span class="cx">             when :half
</span><del>-                &quot;%si&quot;
</del><ins>+                register(&quot;si&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%esi&quot;
</del><ins>+                register(&quot;esi&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                isX64 ? &quot;%rsi&quot; : &quot;%esi&quot;
</del><ins>+                isX64 ? register(&quot;rsi&quot;) : register(&quot;esi&quot;)
</ins><span class="cx">             when :quad
</span><del>-                isX64 ? &quot;%rsi&quot; : raise
</del><ins>+                isX64 ? register(&quot;rsi&quot;) : raise
</ins><span class="cx">             end
</span><span class="cx">         when &quot;t6&quot;
</span><span class="cx">             raise &quot;Cannot use #{name} in 32-bit X86 at #{codeOriginString}&quot; unless isX64
</span><span class="lines">@@ -257,7 +315,7 @@
</span><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx">     def x86CallOperand(kind)
</span><del>-        isX64 ? &quot;*#{x86Operand(:quad)}&quot; : &quot;*#{x86Operand(:ptr)}&quot;
</del><ins>+        isX64 ? &quot;#{callPrefix}#{x86Operand(:quad)}&quot; : &quot;#{callPrefix}#{x86Operand(:ptr)}&quot;
</ins><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="lines">@@ -297,10 +355,10 @@
</span><span class="cx">     def x87Operand(offset)
</span><span class="cx">         raise unless useX87
</span><span class="cx">         raise unless offset == 0 or offset == 1
</span><del>-        &quot;%st(#{x87DefaultStackPosition + offset})&quot;
</del><ins>+        &quot;#{register(&quot;st&quot;)}(#{x87DefaultStackPosition + offset})&quot;
</ins><span class="cx">     end
</span><span class="cx">     def x86CallOperand(kind)
</span><del>-        &quot;*#{x86Operand(kind)}&quot;
</del><ins>+        &quot;#{callPrefix}#{x86Operand(kind)}&quot;
</ins><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="lines">@@ -313,7 +371,7 @@
</span><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx">     def x86Operand(kind)
</span><del>-        &quot;$#{value}&quot;
</del><ins>+        &quot;#{const(value)}&quot;
</ins><span class="cx">     end
</span><span class="cx">     def x86CallOperand(kind)
</span><span class="cx">         &quot;#{value}&quot;
</span><span class="lines">@@ -326,13 +384,13 @@
</span><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def x86AddressOperand(addressKind)
</span><del>-        &quot;#{offset.value}(#{base.x86Operand(addressKind)})&quot;
</del><ins>+        &quot;#{offsetRegister(offset.value, base.x86Operand(addressKind))}&quot;
</ins><span class="cx">     end
</span><span class="cx">     def x86Operand(kind)
</span><del>-        x86AddressOperand(:ptr)
</del><ins>+        &quot;#{getSizeString(kind)}#{x86AddressOperand(:ptr)}&quot;
</ins><span class="cx">     end
</span><span class="cx">     def x86CallOperand(kind)
</span><del>-        &quot;*#{x86Operand(kind)}&quot;
</del><ins>+        &quot;#{callPrefix}#{x86Operand(kind)}&quot;
</ins><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="lines">@@ -342,7 +400,11 @@
</span><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def x86AddressOperand(addressKind)
</span><del>-        &quot;#{offset.value}(#{base.x86Operand(addressKind)}, #{index.x86Operand(addressKind)}, #{scale})&quot;
</del><ins>+        if !isIntelSyntax
+            &quot;#{offset.value}(#{base.x86Operand(addressKind)}, #{index.x86Operand(addressKind)}, #{scale})&quot;
+        else
+            &quot;#{getSizeString(addressKind)}[#{offset.value} + #{base.x86Operand(addressKind)} + #{index.x86Operand(addressKind)} * #{scale}]&quot;
+        end
</ins><span class="cx">     end
</span><span class="cx">     
</span><span class="cx">     def x86Operand(kind)
</span><span class="lines">@@ -350,7 +412,7 @@
</span><span class="cx">     end
</span><span class="cx"> 
</span><span class="cx">     def x86CallOperand(kind)
</span><del>-        &quot;*#{x86Operand(kind)}&quot;
</del><ins>+        &quot;#{callPrefix}#{x86Operand(kind)}&quot;
</ins><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="lines">@@ -368,7 +430,7 @@
</span><span class="cx">     end
</span><span class="cx"> 
</span><span class="cx">     def x86CallOperand(kind)
</span><del>-        &quot;*#{address.value}&quot;
</del><ins>+        &quot;#{callPrefix}#{address.value}&quot;
</ins><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="lines">@@ -426,17 +488,25 @@
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> class Instruction
</span><ins>+    @@floatingPointCompareImplicitOperand = isIntelSyntax ? &quot;st(0), &quot; : &quot;&quot;
+    @@exportedSymbols = Array.new
+    
</ins><span class="cx">     def x86Operands(*kinds)
</span><span class="cx">         raise unless kinds.size == operands.size
</span><span class="cx">         result = []
</span><span class="cx">         kinds.size.times {
</span><span class="cx">             | idx |
</span><del>-            result &lt;&lt; operands[idx].x86Operand(kinds[idx])
</del><ins>+            i = isIntelSyntax ? (kinds.size - idx - 1) : idx
+            result &lt;&lt; operands[i].x86Operand(kinds[i])
</ins><span class="cx">         }
</span><span class="cx">         result.join(&quot;, &quot;)
</span><span class="cx">     end
</span><span class="cx"> 
</span><span class="cx">     def x86Suffix(kind)
</span><ins>+        if isIntelSyntax
+            return &quot;&quot;
+        end
+
</ins><span class="cx">         case kind
</span><span class="cx">         when :byte
</span><span class="cx">             &quot;b&quot;
</span><span class="lines">@@ -477,15 +547,15 @@
</span><span class="cx">     def handleX86OpWithNumOperands(opcode, kind, numOperands)
</span><span class="cx">         if numOperands == 3
</span><span class="cx">             if operands[0] == operands[2]
</span><del>-                $asm.puts &quot;#{opcode} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                $asm.puts &quot;#{opcode} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">             elsif operands[1] == operands[2]
</span><del>-                $asm.puts &quot;#{opcode} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                $asm.puts &quot;#{opcode} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">             else
</span><del>-                $asm.puts &quot;mov#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
-                $asm.puts &quot;#{opcode} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                $asm.puts &quot;mov#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
+                $asm.puts &quot;#{opcode} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">             end
</span><span class="cx">         else
</span><del>-            $asm.puts &quot;#{opcode} #{operands[0].x86Operand(kind)}, #{operands[1].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;#{opcode} #{orderOperands(operands[0].x86Operand(kind), operands[1].x86Operand(kind))}&quot;
</ins><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx">     
</span><span class="lines">@@ -495,11 +565,11 @@
</span><span class="cx">     
</span><span class="cx">     def handleX86Shift(opcode, kind)
</span><span class="cx">         if operands[0].is_a? Immediate or operands[0] == RegisterID.forName(nil, &quot;t2&quot;)
</span><del>-            $asm.puts &quot;#{opcode} #{operands[0].x86Operand(:byte)}, #{operands[1].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;#{opcode} #{orderOperands(operands[0].x86Operand(:byte), operands[1].x86Operand(kind))}&quot;
</ins><span class="cx">         else
</span><span class="cx">             cx = RegisterID.forName(nil, &quot;t2&quot;)
</span><span class="cx">             $asm.puts &quot;xchg#{x86Suffix(:ptr)} #{operands[0].x86Operand(:ptr)}, #{cx.x86Operand(:ptr)}&quot;
</span><del>-            $asm.puts &quot;#{opcode} %cl, #{operands[1].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;#{opcode} #{orderOperands(register(&quot;cl&quot;), operands[1].x86Operand(kind))}&quot;
</ins><span class="cx">             $asm.puts &quot;xchg#{x86Suffix(:ptr)} #{operands[0].x86Operand(:ptr)}, #{cx.x86Operand(:ptr)}&quot;
</span><span class="cx">         end
</span><span class="cx">     end
</span><span class="lines">@@ -522,11 +592,11 @@
</span><span class="cx">     
</span><span class="cx">     def handleX86IntCompare(opcodeSuffix, kind)
</span><span class="cx">         if operands[0].is_a? Immediate and operands[0].value == 0 and operands[1].is_a? RegisterID and (opcodeSuffix == &quot;e&quot; or opcodeSuffix == &quot;ne&quot;)
</span><del>-            $asm.puts &quot;test#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[1].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;test#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[1].x86Operand(kind))}&quot;
</ins><span class="cx">         elsif operands[1].is_a? Immediate and operands[1].value == 0 and operands[0].is_a? RegisterID and (opcodeSuffix == &quot;e&quot; or opcodeSuffix == &quot;ne&quot;)
</span><del>-            $asm.puts &quot;test#{x86Suffix(kind)}  #{operands[0].x86Operand(kind)}, #{operands[0].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;test#{x86Suffix(kind)}  #{orderOperands(operands[0].x86Operand(kind), operands[0].x86Operand(kind))}&quot;
</ins><span class="cx">         else
</span><del>-            $asm.puts &quot;cmp#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[0].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;cmp#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[0].x86Operand(kind))}&quot;
</ins><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx">     
</span><span class="lines">@@ -538,7 +608,11 @@
</span><span class="cx">     def handleX86Set(setOpcode, operand)
</span><span class="cx">         if operand.supports8BitOnX86
</span><span class="cx">             $asm.puts &quot;#{setOpcode} #{operand.x86Operand(:byte)}&quot;
</span><del>-            $asm.puts &quot;movzbl #{operand.x86Operand(:byte)}, #{operand.x86Operand(:int)}&quot;
</del><ins>+            if !isIntelSyntax
+                $asm.puts &quot;movzbl #{orderOperands(operand.x86Operand(:byte), operand.x86Operand(:int))}&quot;
+            else
+                $asm.puts &quot;movzx #{orderOperands(operand.x86Operand(:byte), operand.x86Operand(:int))}&quot;
+            end
</ins><span class="cx">         else
</span><span class="cx">             ax = RegisterID.new(nil, &quot;t0&quot;)
</span><span class="cx">             $asm.puts &quot;xchg#{x86Suffix(:ptr)} #{operand.x86Operand(:ptr)}, #{ax.x86Operand(:ptr)}&quot;
</span><span class="lines">@@ -568,10 +642,10 @@
</span><span class="cx">             if value.is_a? RegisterID
</span><span class="cx">                 $asm.puts &quot;test#{x86Suffix(kind)} #{value.x86Operand(kind)}, #{value.x86Operand(kind)}&quot;
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;cmp#{x86Suffix(kind)} $0, #{value.x86Operand(kind)}&quot;
</del><ins>+                $asm.puts &quot;cmp#{x86Suffix(kind)} #{orderOperands(const(0), value.x86Operand(kind))}&quot;
</ins><span class="cx">             end
</span><span class="cx">         else
</span><del>-            $asm.puts &quot;test#{x86Suffix(kind)} #{mask.x86Operand(kind)}, #{value.x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;test#{x86Suffix(kind)} #{orderOperands(mask.x86Operand(kind), value.x86Operand(kind))}&quot;
</ins><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx">     
</span><span class="lines">@@ -601,7 +675,7 @@
</span><span class="cx">     def handleX86SubBranch(branchOpcode, kind)
</span><span class="cx">         if operands.size == 4 and operands[1] == operands[2]
</span><span class="cx">             $asm.puts &quot;neg#{x86Suffix(kind)} #{operands[2].x86Operand(kind)}&quot;
</span><del>-            $asm.puts &quot;add#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;add#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">         else
</span><span class="cx">             handleX86OpWithNumOperands(&quot;sub#{x86Suffix(kind)}&quot;, kind, operands.size - 1)
</span><span class="cx">         end
</span><span class="lines">@@ -619,25 +693,29 @@
</span><span class="cx">     def handleX86Add(kind)
</span><span class="cx">         if operands.size == 3 and operands[1] == operands[2]
</span><span class="cx">             unless Immediate.new(nil, 0) == operands[0]
</span><del>-                $asm.puts &quot;add#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                $asm.puts &quot;add#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">             end
</span><span class="cx">         elsif operands.size == 3 and operands[0].is_a? Immediate
</span><span class="cx">             raise unless operands[1].is_a? RegisterID
</span><span class="cx">             raise unless operands[2].is_a? RegisterID
</span><span class="cx">             if operands[0].value == 0
</span><span class="cx">                 unless operands[1] == operands[2]
</span><del>-                    $asm.puts &quot;mov#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                    $asm.puts &quot;mov#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">                 end
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;lea#{x86Suffix(kind)} #{operands[0].value}(#{operands[1].x86Operand(kind)}), #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                $asm.puts &quot;lea#{x86Suffix(kind)} #{orderOperands(offsetRegister(operands[0].value, operands[1].x86Operand(kind)), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">             end
</span><span class="cx">         elsif operands.size == 3 and operands[0].is_a? RegisterID
</span><span class="cx">             raise unless operands[1].is_a? RegisterID
</span><span class="cx">             raise unless operands[2].is_a? RegisterID
</span><span class="cx">             if operands[0] == operands[2]
</span><del>-                $asm.puts &quot;add#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                $asm.puts &quot;add#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">             else
</span><del>-                $asm.puts &quot;lea#{x86Suffix(kind)} (#{operands[0].x86Operand(kind)}, #{operands[1].x86Operand(kind)}), #{operands[2].x86Operand(kind)}&quot;
</del><ins>+                if !isIntelSyntax
+                    $asm.puts &quot;lea#{x86Suffix(kind)} (#{operands[0].x86Operand(kind)}, #{operands[1].x86Operand(kind)}), #{operands[2].x86Operand(kind)}&quot;
+                else
+                    $asm.puts &quot;lea#{x86Suffix(kind)} #{operands[2].x86Operand(kind)}, [#{operands[0].x86Operand(kind)} + #{operands[1].x86Operand(kind)}]&quot;
+                end
</ins><span class="cx">             end
</span><span class="cx">         else
</span><span class="cx">             unless Immediate.new(nil, 0) == operands[0]
</span><span class="lines">@@ -649,7 +727,7 @@
</span><span class="cx">     def handleX86Sub(kind)
</span><span class="cx">         if operands.size == 3 and operands[1] == operands[2]
</span><span class="cx">             $asm.puts &quot;neg#{x86Suffix(kind)} #{operands[2].x86Operand(kind)}&quot;
</span><del>-            $asm.puts &quot;add#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}&quot;
</del><ins>+            $asm.puts &quot;add#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}&quot;
</ins><span class="cx">         else
</span><span class="cx">             handleX86Op(&quot;sub#{x86Suffix(kind)}&quot;, kind)
</span><span class="cx">         end
</span><span class="lines">@@ -665,6 +743,20 @@
</span><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx">     
</span><ins>+    def handleX86Peek()
+        sp = RegisterID.new(nil, &quot;sp&quot;)
+        opA = offsetRegister(operands[0].value * x86Bytes(:ptr), sp.x86Operand(:ptr))
+        opB = operands[1].x86Operand(:ptr)
+        $asm.puts &quot;mov#{x86Suffix(:ptr)} #{orderOperands(opA, opB)}&quot;
+    end
+
+    def handleX86Poke()
+        sp = RegisterID.new(nil, &quot;sp&quot;)
+        opA = operands[0].x86Operand(:ptr)
+        opB = offsetRegister(operands[1].value * x86Bytes(:ptr), sp.x86Operand(:ptr))
+        $asm.puts &quot;mov#{x86Suffix(:ptr)} #{orderOperands(opA, opB)}&quot;
+    end
+
</ins><span class="cx">     def handleMove
</span><span class="cx">         if Immediate.new(nil, 0) == operands[0] and operands[1].is_a? RegisterID
</span><span class="cx">             if isX64
</span><span class="lines">@@ -680,22 +772,22 @@
</span><span class="cx">             end
</span><span class="cx">         end
</span><span class="cx">     end
</span><del>-    
</del><ins>+
</ins><span class="cx">     def handleX87Compare(mode)
</span><span class="cx">         case mode
</span><span class="cx">         when :normal
</span><span class="cx">             if (operands[0].x87DefaultStackPosition == 0)
</span><del>-                $asm.puts &quot;fucomi #{operands[1].x87Operand(0)}&quot;
</del><ins>+                $asm.puts &quot;fucomi #{@@floatingPointCompareImplicitOperand}#{operands[1].x87Operand(0)}&quot;
</ins><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;fld #{operands[0].x87Operand(0)}&quot;
</span><del>-                $asm.puts &quot;fucomip #{operands[1].x87Operand(1)}&quot;
</del><ins>+                $asm.puts &quot;fucomip #{@@floatingPointCompareImplicitOperand}#{operands[1].x87Operand(1)}&quot;
</ins><span class="cx">             end
</span><span class="cx">         when :reverse
</span><span class="cx">             if (operands[1].x87DefaultStackPosition == 0)
</span><del>-                $asm.puts &quot;fucomi #{operands[0].x87Operand(0)}&quot;
</del><ins>+                $asm.puts &quot;fucomi #{@@floatingPointCompareImplicitOperand}#{operands[0].x87Operand(0)}&quot;
</ins><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;fld #{operands[1].x87Operand(0)}&quot;
</span><del>-                $asm.puts &quot;fucomip #{operands[0].x87Operand(1)}&quot;
</del><ins>+                $asm.puts &quot;fucomip #{@@floatingPointCompareImplicitOperand}#{operands[0].x87Operand(1)}&quot;
</ins><span class="cx">             end
</span><span class="cx">         else
</span><span class="cx">             raise mode.inspect
</span><span class="lines">@@ -704,12 +796,12 @@
</span><span class="cx"> 
</span><span class="cx">     def handleX87BinOp(opcode, opcodereverse)
</span><span class="cx">         if (operands[1].x87DefaultStackPosition == 0)
</span><del>-            $asm.puts &quot;#{opcode} #{operands[0].x87Operand(0)}, %st&quot;
</del><ins>+            $asm.puts &quot;#{opcode} #{operands[0].x87Operand(0)}, #{register(&quot;st&quot;)}&quot;
</ins><span class="cx">         elsif (operands[0].x87DefaultStackPosition == 0)
</span><del>-            $asm.puts &quot;#{opcodereverse} %st, #{operands[1].x87Operand(0)}&quot;
</del><ins>+            $asm.puts &quot;#{opcodereverse} #{register(&quot;st&quot;)}, #{operands[1].x87Operand(0)}&quot;
</ins><span class="cx">         else
</span><span class="cx">             $asm.puts &quot;fld #{operands[0].x87Operand(0)}&quot;
</span><del>-            $asm.puts &quot;#{opcodereverse}p %st, #{operands[1].x87Operand(1)}&quot;
</del><ins>+            $asm.puts &quot;#{opcodereverse}p #{register(&quot;st&quot;)}, #{operands[1].x87Operand(1)}&quot;
</ins><span class="cx">         end
</span><span class="cx">     end
</span><span class="cx"> 
</span><span class="lines">@@ -722,6 +814,22 @@
</span><span class="cx">         raise unless $activeBackend == &quot;X86_64&quot;
</span><span class="cx">         lowerX86Common
</span><span class="cx">     end
</span><ins>+
+    def writeSymbolToFile(symbol)
+        raise unless isMSVC
+
+        alreadyExported = @@exportedSymbols.include?(symbol)
+
+        if !alreadyExported
+            @@exportedSymbols.push(symbol)
+
+            # Write symbols needed by MASM
+            File.open(&quot;#{File.basename($output.path)}.sym&quot;, &quot;a&quot;) {
+                | outp |
+                outp.puts &quot;EXTERN #{symbol} : near&quot;
+            }
+        end
+    end
</ins><span class="cx">     
</span><span class="cx">     def lowerX86Common
</span><span class="cx">         $asm.codeOrigin codeOriginString if $enableCodeOriginComments
</span><span class="lines">@@ -735,13 +843,13 @@
</span><span class="cx">         when &quot;addq&quot;
</span><span class="cx">             handleX86Add(:quad)
</span><span class="cx">         when &quot;andi&quot;
</span><del>-            handleX86Op(&quot;andl&quot;, :int)
</del><ins>+            handleX86Op(&quot;and#{x86Suffix(:int)}&quot;, :int)
</ins><span class="cx">         when &quot;andp&quot;
</span><span class="cx">             handleX86Op(&quot;and#{x86Suffix(:ptr)}&quot;, :ptr)
</span><span class="cx">         when &quot;andq&quot;
</span><span class="cx">             handleX86Op(&quot;and#{x86Suffix(:quad)}&quot;, :quad)
</span><span class="cx">         when &quot;lshifti&quot;
</span><del>-            handleX86Shift(&quot;sall&quot;, :int)
</del><ins>+            handleX86Shift(&quot;sal#{x86Suffix(:int)}&quot;, :int)
</ins><span class="cx">         when &quot;lshiftp&quot;
</span><span class="cx">             handleX86Shift(&quot;sal#{x86Suffix(:ptr)}&quot;, :ptr)
</span><span class="cx">         when &quot;lshiftq&quot;
</span><span class="lines">@@ -753,27 +861,27 @@
</span><span class="cx">         when &quot;mulq&quot;
</span><span class="cx">             handleX86Mul(:quad)
</span><span class="cx">         when &quot;negi&quot;
</span><del>-            $asm.puts &quot;negl #{x86Operands(:int)}&quot;
</del><ins>+            $asm.puts &quot;neg#{x86Suffix(:int)} #{x86Operands(:int)}&quot;
</ins><span class="cx">         when &quot;negp&quot;
</span><span class="cx">             $asm.puts &quot;neg#{x86Suffix(:ptr)} #{x86Operands(:ptr)}&quot;
</span><span class="cx">         when &quot;negq&quot;
</span><span class="cx">             $asm.puts &quot;neg#{x86Suffix(:quad)} #{x86Operands(:quad)}&quot;
</span><span class="cx">         when &quot;noti&quot;
</span><del>-            $asm.puts &quot;notl #{x86Operands(:int)}&quot;
</del><ins>+            $asm.puts &quot;not#{x86Suffix(:int)} #{x86Operands(:int)}&quot;
</ins><span class="cx">         when &quot;ori&quot;
</span><del>-            handleX86Op(&quot;orl&quot;, :int)
</del><ins>+            handleX86Op(&quot;or#{x86Suffix(:int)}&quot;, :int)
</ins><span class="cx">         when &quot;orp&quot;
</span><span class="cx">             handleX86Op(&quot;or#{x86Suffix(:ptr)}&quot;, :ptr)
</span><span class="cx">         when &quot;orq&quot;
</span><span class="cx">             handleX86Op(&quot;or#{x86Suffix(:quad)}&quot;, :quad)
</span><span class="cx">         when &quot;rshifti&quot;
</span><del>-            handleX86Shift(&quot;sarl&quot;, :int)
</del><ins>+            handleX86Shift(&quot;sar#{x86Suffix(:int)}&quot;, :int)
</ins><span class="cx">         when &quot;rshiftp&quot;
</span><span class="cx">             handleX86Shift(&quot;sar#{x86Suffix(:ptr)}&quot;, :ptr)
</span><span class="cx">         when &quot;rshiftq&quot;
</span><span class="cx">             handleX86Shift(&quot;sar#{x86Suffix(:quad)}&quot;, :quad)
</span><span class="cx">         when &quot;urshifti&quot;
</span><del>-            handleX86Shift(&quot;shrl&quot;, :int)
</del><ins>+            handleX86Shift(&quot;shr#{x86Suffix(:int)}&quot;, :int)
</ins><span class="cx">         when &quot;urshiftp&quot;
</span><span class="cx">             handleX86Shift(&quot;shr#{x86Suffix(:ptr)}&quot;, :ptr)
</span><span class="cx">         when &quot;urshiftq&quot;
</span><span class="lines">@@ -785,36 +893,48 @@
</span><span class="cx">         when &quot;subq&quot;
</span><span class="cx">             handleX86Sub(:quad)
</span><span class="cx">         when &quot;xori&quot;
</span><del>-            handleX86Op(&quot;xorl&quot;, :int)
</del><ins>+            handleX86Op(&quot;xor#{x86Suffix(:int)}&quot;, :int)
</ins><span class="cx">         when &quot;xorp&quot;
</span><span class="cx">             handleX86Op(&quot;xor#{x86Suffix(:ptr)}&quot;, :ptr)
</span><span class="cx">         when &quot;xorq&quot;
</span><span class="cx">             handleX86Op(&quot;xor#{x86Suffix(:quad)}&quot;, :quad)
</span><span class="cx">         when &quot;loadi&quot;, &quot;storei&quot;
</span><del>-            $asm.puts &quot;movl #{x86Operands(:int, :int)}&quot;
</del><ins>+            $asm.puts &quot;mov#{x86Suffix(:int)} #{x86Operands(:int, :int)}&quot;
</ins><span class="cx">         when &quot;loadis&quot;
</span><span class="cx">             if isX64
</span><span class="cx">                 $asm.puts &quot;movslq #{x86Operands(:int, :quad)}&quot;
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;movl #{x86Operands(:int, :int)}&quot;
</del><ins>+                $asm.puts &quot;mov#{x86Suffix(:int)} #{x86Operands(:int, :int)}&quot;
</ins><span class="cx">             end
</span><span class="cx">         when &quot;loadp&quot;, &quot;storep&quot;
</span><span class="cx">             $asm.puts &quot;mov#{x86Suffix(:ptr)} #{x86Operands(:ptr, :ptr)}&quot;
</span><span class="cx">         when &quot;loadq&quot;, &quot;storeq&quot;
</span><span class="cx">             $asm.puts &quot;mov#{x86Suffix(:quad)} #{x86Operands(:quad, :quad)}&quot;
</span><span class="cx">         when &quot;loadb&quot;
</span><del>-            $asm.puts &quot;movzbl #{operands[0].x86Operand(:byte)}, #{operands[1].x86Operand(:int)}&quot;
</del><ins>+            if !isIntelSyntax
+                $asm.puts &quot;movzbl #{orderOperands(operands[0].x86Operand(:byte), operands[1].x86Operand(:int))}&quot;
+            else
+                $asm.puts &quot;movzx #{orderOperands(operands[0].x86Operand(:byte), operands[1].x86Operand(:int))}&quot;
+            end
</ins><span class="cx">         when &quot;loadbs&quot;
</span><span class="cx">             $asm.puts &quot;movsbl #{operands[0].x86Operand(:byte)}, #{operands[1].x86Operand(:int)}&quot;
</span><span class="cx">         when &quot;loadh&quot;
</span><del>-            $asm.puts &quot;movzwl #{operands[0].x86Operand(:half)}, #{operands[1].x86Operand(:int)}&quot;
</del><ins>+            if !isIntelSyntax
+                $asm.puts &quot;movzwl #{orderOperands(operands[0].x86Operand(:half), operands[1].x86Operand(:int))}&quot;
+            else
+                $asm.puts &quot;movzx #{orderOperands(operands[0].x86Operand(:half), operands[1].x86Operand(:int))}&quot;
+            end
</ins><span class="cx">         when &quot;loadhs&quot;
</span><span class="cx">             $asm.puts &quot;movswl #{operands[0].x86Operand(:half)}, #{operands[1].x86Operand(:int)}&quot;
</span><span class="cx">         when &quot;storeb&quot;
</span><del>-            $asm.puts &quot;movb #{x86Operands(:byte, :byte)}&quot;
</del><ins>+            $asm.puts &quot;mov#{x86Suffix(:byte)} #{x86Operands(:byte, :byte)}&quot;
</ins><span class="cx">         when &quot;loadd&quot;
</span><span class="cx">             if useX87
</span><del>-                $asm.puts &quot;fldl #{operands[0].x86Operand(:double)}&quot;
</del><ins>+                if !isIntelSyntax
+                    $asm.puts &quot;fldl #{operands[0].x86Operand(:double)}&quot;
+                else
+                    $asm.puts &quot;fld #{operands[0].x86Operand(:double)}&quot;
+                end
</ins><span class="cx">                 $asm.puts &quot;fstp #{operands[1].x87Operand(1)}&quot;
</span><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;movsd #{x86Operands(:double, :double)}&quot;
</span><span class="lines">@@ -833,10 +953,14 @@
</span><span class="cx">         when &quot;stored&quot;
</span><span class="cx">             if useX87
</span><span class="cx">                 if (operands[0].x87DefaultStackPosition == 0)
</span><del>-                    $asm.puts &quot;fstl #{operands[1].x86Operand(:double)}&quot;
</del><ins>+                    $asm.puts &quot;fst#{x86Suffix(:int)} #{operands[1].x86Operand(:double)}&quot;
</ins><span class="cx">                 else
</span><span class="cx">                     $asm.puts &quot;fld #{operands[0].x87Operand(0)}&quot;
</span><del>-                    $asm.puts &quot;fstpl #{operands[1].x86Operand(:double)}&quot;
</del><ins>+                    if !isIntelSyntax
+                        $asm.puts &quot;fstpl #{operands[1].x86Operand(:double)}&quot;
+                    else
+                        $asm.puts &quot;fstp #{operands[1].x86Operand(:double)}&quot;
+                    end
</ins><span class="cx">                 end
</span><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;movsd #{x86Operands(:double, :double)}&quot;
</span><span class="lines">@@ -876,8 +1000,8 @@
</span><span class="cx">         when &quot;ci2d&quot;
</span><span class="cx">             if useX87
</span><span class="cx">                 sp = RegisterID.new(nil, &quot;sp&quot;)
</span><del>-                $asm.puts &quot;movl #{operands[0].x86Operand(:int)}, -4(#{sp.x86Operand(:ptr)})&quot;
-                $asm.puts &quot;fildl -4(#{sp.x86Operand(:ptr)})&quot;
</del><ins>+                $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), offsetRegister(-4, sp.x86Operand(:ptr)))}&quot;
+                $asm.puts &quot;fild#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-4, sp.x86Operand(:ptr))}&quot;
</ins><span class="cx">                 $asm.puts &quot;fstp #{operands[1].x87Operand(1)}&quot;
</span><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;cvtsi2sd #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:double)}&quot;
</span><span class="lines">@@ -952,18 +1076,18 @@
</span><span class="cx">                     $asm.puts &quot;fistl -4(#{sp.x86Operand(:ptr)})&quot;
</span><span class="cx">                 else
</span><span class="cx">                     $asm.puts &quot;fld #{operands[0].x87Operand(0)}&quot;
</span><del>-                    $asm.puts &quot;fistpl -4(#{sp.x86Operand(:ptr)})&quot;
</del><ins>+                    $asm.puts &quot;fistp#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-4, sp.x86Operand(:ptr))}&quot;
</ins><span class="cx">                 end
</span><del>-                $asm.puts &quot;movl -4(#{sp.x86Operand(:ptr)}), #{operands[1].x86Operand(:int)}&quot;
-                $asm.puts &quot;testl #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}&quot;
</del><ins>+                $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(offsetRegister(-4, sp.x86Operand(:ptr)), operands[1].x86Operand(:int))}&quot;
+                $asm.puts &quot;test#{x86Suffix(:int)} #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}&quot;
</ins><span class="cx">                 $asm.puts &quot;je #{operands[2].asmLabel}&quot;
</span><del>-                $asm.puts &quot;fildl -4(#{sp.x86Operand(:ptr)})&quot;
-                $asm.puts &quot;fucomip #{operands[0].x87Operand(1)}&quot;
</del><ins>+                $asm.puts &quot;fild#{x86Suffix(:int)} #{getSizeString(:int)}#{offsetRegister(-4, sp.x86Operand(:ptr))}&quot;
+                $asm.puts &quot;fucomip #{@@floatingPointCompareImplicitOperand}#{operands[0].x87Operand(1)}&quot;
</ins><span class="cx">                 $asm.puts &quot;jp #{operands[2].asmLabel}&quot;
</span><span class="cx">                 $asm.puts &quot;jne #{operands[2].asmLabel}&quot;
</span><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;cvttsd2si #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:int)}&quot;
</span><del>-                $asm.puts &quot;testl #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}&quot;
</del><ins>+                $asm.puts &quot;test#{x86Suffix(:int)} #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}&quot;
</ins><span class="cx">                 $asm.puts &quot;je #{operands[2].asmLabel}&quot;
</span><span class="cx">                 $asm.puts &quot;cvtsi2sd #{operands[1].x86Operand(:int)}, %xmm7&quot;
</span><span class="cx">                 $asm.puts &quot;ucomisd #{operands[0].x86Operand(:double)}, %xmm7&quot;
</span><span class="lines">@@ -995,9 +1119,9 @@
</span><span class="cx">                 $asm.puts &quot;pop %r13&quot;
</span><span class="cx">                 $asm.puts &quot;pop %r12&quot;
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;pop %ebx&quot;
-                $asm.puts &quot;pop %edi&quot;
-                $asm.puts &quot;pop %esi&quot;
</del><ins>+                $asm.puts &quot;pop &quot; + register(&quot;ebx&quot;)
+                $asm.puts &quot;pop &quot; + register(&quot;edi&quot;)
+                $asm.puts &quot;pop &quot; + register(&quot;esi&quot;)
</ins><span class="cx">             end
</span><span class="cx">         when &quot;pushCalleeSaves&quot;
</span><span class="cx">             if isX64
</span><span class="lines">@@ -1007,16 +1131,16 @@
</span><span class="cx">                 $asm.puts &quot;push %r15&quot;
</span><span class="cx">                 $asm.puts &quot;push %rbx&quot;
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;push %esi&quot;
-                $asm.puts &quot;push %edi&quot;
-                $asm.puts &quot;push %ebx&quot;
</del><ins>+                $asm.puts &quot;push &quot; + register(&quot;esi&quot;)
+                $asm.puts &quot;push &quot; + register(&quot;edi&quot;)
+                $asm.puts &quot;push &quot; + register(&quot;ebx&quot;)
</ins><span class="cx">             end
</span><span class="cx">         when &quot;move&quot;
</span><span class="cx">             handleMove
</span><span class="cx">         when &quot;sxi2q&quot;
</span><span class="cx">             $asm.puts &quot;movslq #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:quad)}&quot;
</span><span class="cx">         when &quot;zxi2q&quot;
</span><del>-            $asm.puts &quot;movl #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:int)}&quot;
</del><ins>+            $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), operands[1].x86Operand(:int))}&quot;
</ins><span class="cx">         when &quot;nop&quot;
</span><span class="cx">             $asm.puts &quot;nop&quot;
</span><span class="cx">         when &quot;bieq&quot;
</span><span class="lines">@@ -1126,25 +1250,25 @@
</span><span class="cx">         when &quot;jmp&quot;
</span><span class="cx">             $asm.puts &quot;jmp #{operands[0].x86CallOperand(:ptr)}&quot;
</span><span class="cx">         when &quot;baddio&quot;
</span><del>-            handleX86OpBranch(&quot;addl&quot;, &quot;jo&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;add#{x86Suffix(:int)}&quot;, &quot;jo&quot;, :int)
</ins><span class="cx">         when &quot;baddpo&quot;
</span><span class="cx">             handleX86OpBranch(&quot;add#{x86Suffix(:ptr)}&quot;, &quot;jo&quot;, :ptr)
</span><span class="cx">         when &quot;baddqo&quot;
</span><span class="cx">             handleX86OpBranch(&quot;add#{x86Suffix(:quad)}&quot;, &quot;jo&quot;, :quad)
</span><span class="cx">         when &quot;baddis&quot;
</span><del>-            handleX86OpBranch(&quot;addl&quot;, &quot;js&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;add#{x86Suffix(:int)}&quot;, &quot;js&quot;, :int)
</ins><span class="cx">         when &quot;baddps&quot;
</span><span class="cx">             handleX86OpBranch(&quot;add#{x86Suffix(:ptr)}&quot;, &quot;js&quot;, :ptr)
</span><span class="cx">         when &quot;baddqs&quot;
</span><span class="cx">             handleX86OpBranch(&quot;add#{x86Suffix(:quad)}&quot;, &quot;js&quot;, :quad)
</span><span class="cx">         when &quot;baddiz&quot;
</span><del>-            handleX86OpBranch(&quot;addl&quot;, &quot;jz&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;add#{x86Suffix(:int)}&quot;, &quot;jz&quot;, :int)
</ins><span class="cx">         when &quot;baddpz&quot;
</span><span class="cx">             handleX86OpBranch(&quot;add#{x86Suffix(:ptr)}&quot;, &quot;jz&quot;, :ptr)
</span><span class="cx">         when &quot;baddqz&quot;
</span><span class="cx">             handleX86OpBranch(&quot;add#{x86Suffix(:quad)}&quot;, &quot;jz&quot;, :quad)
</span><span class="cx">         when &quot;baddinz&quot;
</span><del>-            handleX86OpBranch(&quot;addl&quot;, &quot;jnz&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;add#{x86Suffix(:int)}&quot;, &quot;jnz&quot;, :int)
</ins><span class="cx">         when &quot;baddpnz&quot;
</span><span class="cx">             handleX86OpBranch(&quot;add#{x86Suffix(:ptr)}&quot;, &quot;jnz&quot;, :ptr)
</span><span class="cx">         when &quot;baddqnz&quot;
</span><span class="lines">@@ -1158,13 +1282,13 @@
</span><span class="cx">         when &quot;bsubinz&quot;
</span><span class="cx">             handleX86SubBranch(&quot;jnz&quot;, :int)
</span><span class="cx">         when &quot;bmulio&quot;
</span><del>-            handleX86OpBranch(&quot;imull&quot;, &quot;jo&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;imul#{x86Suffix(:int)}&quot;, &quot;jo&quot;, :int)
</ins><span class="cx">         when &quot;bmulis&quot;
</span><del>-            handleX86OpBranch(&quot;imull&quot;, &quot;js&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;imul#{x86Suffix(:int)}&quot;, &quot;js&quot;, :int)
</ins><span class="cx">         when &quot;bmuliz&quot;
</span><del>-            handleX86OpBranch(&quot;imull&quot;, &quot;jz&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;imul#{x86Suffix(:int)}&quot;, &quot;jz&quot;, :int)
</ins><span class="cx">         when &quot;bmulinz&quot;
</span><del>-            handleX86OpBranch(&quot;imull&quot;, &quot;jnz&quot;, :int)
</del><ins>+            handleX86OpBranch(&quot;imul#{x86Suffix(:int)}&quot;, &quot;jnz&quot;, :int)
</ins><span class="cx">         when &quot;borio&quot;
</span><span class="cx">             handleX86OpBranch(&quot;orl&quot;, &quot;jo&quot;, :int)
</span><span class="cx">         when &quot;boris&quot;
</span><span class="lines">@@ -1174,15 +1298,19 @@
</span><span class="cx">         when &quot;borinz&quot;
</span><span class="cx">             handleX86OpBranch(&quot;orl&quot;, &quot;jnz&quot;, :int)
</span><span class="cx">         when &quot;break&quot;
</span><del>-            $asm.puts &quot;int $3&quot;
</del><ins>+            $asm.puts &quot;int #{const(3)}&quot;
</ins><span class="cx">         when &quot;call&quot;
</span><span class="cx">             if useX87
</span><span class="cx">                 2.times {
</span><span class="cx">                     | offset |
</span><del>-                    $asm.puts &quot;ffree %st(#{offset})&quot;
</del><ins>+                    $asm.puts &quot;ffree #{register(&quot;st&quot;)}(#{offset})&quot;
</ins><span class="cx">                 }
</span><span class="cx">             end
</span><del>-            $asm.puts &quot;call #{operands[0].x86CallOperand(:ptr)}&quot;
</del><ins>+            op = operands[0].x86CallOperand(:ptr)
+            if isMSVC &amp;&amp; (/\Allint_/.match(op) || /\Aslow_path/.match(op))
+                writeSymbolToFile(op)
+            end
+            $asm.puts &quot;call #{op}&quot;
</ins><span class="cx">         when &quot;ret&quot;
</span><span class="cx">             $asm.puts &quot;ret&quot;
</span><span class="cx">         when &quot;cieq&quot;
</span><span class="lines">@@ -1290,11 +1418,9 @@
</span><span class="cx">         when &quot;tbnz&quot;
</span><span class="cx">             handleX86SetTest(&quot;setnz&quot;, :byte)
</span><span class="cx">         when &quot;peek&quot;
</span><del>-            sp = RegisterID.new(nil, &quot;sp&quot;)
-            $asm.puts &quot;mov#{x86Suffix(:ptr)} #{operands[0].value * x86Bytes(:ptr)}(#{sp.x86Operand(:ptr)}), #{operands[1].x86Operand(:ptr)}&quot;
</del><ins>+            handleX86Peek()
</ins><span class="cx">         when &quot;poke&quot;
</span><del>-            sp = RegisterID.new(nil, &quot;sp&quot;)
-            $asm.puts &quot;mov#{x86Suffix(:ptr)} #{operands[0].x86Operand(:ptr)}, #{operands[1].value * x86Bytes(:ptr)}(#{sp.x86Operand(:ptr)})&quot;
</del><ins>+            handleX86Poke()
</ins><span class="cx">         when &quot;cdqi&quot;
</span><span class="cx">             $asm.puts &quot;cdq&quot;
</span><span class="cx">         when &quot;idivi&quot;
</span><span class="lines">@@ -1302,9 +1428,9 @@
</span><span class="cx">         when &quot;fii2d&quot;
</span><span class="cx">             if useX87
</span><span class="cx">                 sp = RegisterID.new(nil, &quot;sp&quot;)
</span><del>-                $asm.puts &quot;movl #{operands[0].x86Operand(:int)}, -8(#{sp.x86Operand(:ptr)})&quot;
-                $asm.puts &quot;movl #{operands[1].x86Operand(:int)}, -4(#{sp.x86Operand(:ptr)})&quot;
-                $asm.puts &quot;fldl -8(#{sp.x86Operand(:ptr)})&quot;
</del><ins>+                $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), offsetRegister(-8, sp.x86Operand(:ptr)))}&quot;
+                $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(operands[1].x86Operand(:int), offsetRegister(-4, sp.x86Operand(:ptr)))}&quot;
+                $asm.puts &quot;fld#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-8, sp.x86Operand(:ptr))}&quot;
</ins><span class="cx">                 $asm.puts &quot;fstp #{operands[2].x87Operand(1)}&quot;
</span><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;movd #{operands[0].x86Operand(:int)}, #{operands[2].x86Operand(:double)}&quot;
</span><span class="lines">@@ -1316,13 +1442,13 @@
</span><span class="cx">             if useX87
</span><span class="cx">                 sp = RegisterID.new(nil, &quot;sp&quot;)
</span><span class="cx">                 if (operands[0].x87DefaultStackPosition == 0)
</span><del>-                    $asm.puts &quot;fstl -8(#{sp.x86Operand(:ptr)})&quot;
</del><ins>+                    $asm.puts &quot;fst#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-8, sp.x86Operand(:ptr))}&quot;
</ins><span class="cx">                 else
</span><span class="cx">                     $asm.puts &quot;fld #{operands[0].x87Operand(0)}&quot;
</span><span class="cx">                     $asm.puts &quot;fstpl -8(#{sp.x86Operand(:ptr)})&quot;
</span><span class="cx">                 end
</span><del>-                $asm.puts &quot;movl -8(#{sp.x86Operand(:ptr)}), #{operands[1].x86Operand(:int)}&quot;
-                $asm.puts &quot;movl -4(#{sp.x86Operand(:ptr)}), #{operands[2].x86Operand(:int)}&quot;
</del><ins>+                $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(offsetRegister(-8, sp.x86Operand(:ptr)), operands[1].x86Operand(:int))}&quot;
+                $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(offsetRegister(-4, sp.x86Operand(:ptr)), operands[2].x86Operand(:int))}&quot;
</ins><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;movd #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:int)}&quot;
</span><span class="cx">                 $asm.puts &quot;movsd #{operands[0].x86Operand(:double)}, %xmm7&quot;
</span><span class="lines">@@ -1342,7 +1468,7 @@
</span><span class="cx">             if useX87
</span><span class="cx">                 sp = RegisterID.new(nil, &quot;sp&quot;)
</span><span class="cx">                 if (operands[0].x87DefaultStackPosition == 0)
</span><del>-                    $asm.puts &quot;fstl -8(#{sp.x86Operand(:ptr)})&quot;
</del><ins>+                    $asm.puts &quot;fst#{x86Suffix(:int)} #{getSizeString(:int)}#{offsetRegister(-8, sp.x86Operand(:ptr))}&quot;
</ins><span class="cx">                 else
</span><span class="cx">                     $asm.puts &quot;fld #{operands[0].x87Operand(0)}&quot;
</span><span class="cx">                     $asm.puts &quot;fstpl -8(#{sp.x86Operand(:ptr)})&quot;
</span><span class="lines">@@ -1360,9 +1486,9 @@
</span><span class="cx">         when &quot;bnz&quot;
</span><span class="cx">             $asm.puts &quot;jnz #{operands[0].asmLabel}&quot;
</span><span class="cx">         when &quot;leai&quot;
</span><del>-            $asm.puts &quot;leal #{operands[0].x86AddressOperand(:int)}, #{operands[1].x86Operand(:int)}&quot;
</del><ins>+            $asm.puts &quot;lea#{x86Suffix(:int)} #{orderOperands(operands[0].x86AddressOperand(:int), operands[1].x86Operand(:int))}&quot;
</ins><span class="cx">         when &quot;leap&quot;
</span><del>-            $asm.puts &quot;lea#{x86Suffix(:ptr)} #{operands[0].x86AddressOperand(:ptr)}, #{operands[1].x86Operand(:ptr)}&quot;
</del><ins>+            $asm.puts &quot;lea#{x86Suffix(:ptr)} #{orderOperands(operands[0].x86AddressOperand(:ptr), operands[1].x86Operand(:ptr))}&quot;
</ins><span class="cx">         when &quot;memfence&quot;
</span><span class="cx">             $asm.puts &quot;mfence&quot;
</span><span class="cx">         else
</span></span></pre>
</div>
</div>

</body>
</html>