<!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 <peavo@outlook.com> 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 <peavo@outlook.com>
+
+ [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 <pecoraro@apple.com>
</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"> <ClCompile Include="..\interpreter\ProtoCallFrame.cpp" />
</span><span class="cx"> <ClCompile Include="..\interpreter\StackVisitor.cpp" />
</span><span class="cx"> <ClCompile Include="..\interpreter\VMInspector.cpp" />
</span><ins>+ <ClCompile Include="..\jit\ArityCheckFailReturnThunks.cpp" />
</ins><span class="cx"> <ClCompile Include="..\jit\AssemblyHelpers.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\ClosureCallStubRoutine.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\ExecutableAllocator.cpp" />
</span><span class="lines">@@ -537,6 +538,7 @@
</span><span class="cx"> <ClCompile Include="..\jit\JITStubs.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\JITThunks.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\JITToDFGDeferredCompilationCallback.cpp" />
</span><ins>+ <ClCompile Include="..\jit\RegisterPreservationWrapperGenerator.cpp" />
</ins><span class="cx"> <ClCompile Include="..\jit\Repatch.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\ThunkGenerators.cpp" />
</span><span class="cx"> <ClCompile Include="..\llint\LLIntCLoop.cpp" />
</span><span class="lines">@@ -1119,6 +1121,7 @@
</span><span class="cx"> <ClInclude Include="..\interpreter\Register.h" />
</span><span class="cx"> <ClInclude Include="..\interpreter\StackVisitor.h" />
</span><span class="cx"> <ClInclude Include="..\interpreter\VMInspector.h" />
</span><ins>+ <ClInclude Include="..\jit\ArityCheckFailReturnThunks.h" />
</ins><span class="cx"> <ClInclude Include="..\jit\AssemblyHelpers.h" />
</span><span class="cx"> <ClInclude Include="..\jit\CCallHelpers.h" />
</span><span class="cx"> <ClInclude Include="..\jit\ClosureCallStubRoutine.h" />
</span><span class="lines">@@ -1147,6 +1150,7 @@
</span><span class="cx"> <ClInclude Include="..\jit\JITWriteBarrier.h" />
</span><span class="cx"> <ClInclude Include="..\jit\JSInterfaceJIT.h" />
</span><span class="cx"> <ClCompile Include="..\jit\RegisterSet.cpp" />
</span><ins>+ <ClInclude Include="..\jit\RegisterPreservationWrapperGenerator.h" />
</ins><span class="cx"> <ClInclude Include="..\jit\RegisterSet.h" />
</span><span class="cx"> <ClInclude Include="..\jit\Repatch.h" />
</span><span class="cx"> <ClInclude Include="..\jit\ScratchRegisterAllocator.h" />
</span><span class="lines">@@ -1443,8 +1447,16 @@
</span><span class="cx"> <FileType>Document</FileType>
</span><span class="cx"> </None>
</span><span class="cx"> </ItemGroup>
</span><ins>+ <ItemGroup>
+ <MASM Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\LowLevelInterpreterWin.asm">
+ <UseSafeExceptionHandlers Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</UseSafeExceptionHandlers>
+ <UseSafeExceptionHandlers Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</UseSafeExceptionHandlers>
+ <UseSafeExceptionHandlers Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</UseSafeExceptionHandlers>
+ <UseSafeExceptionHandlers Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</UseSafeExceptionHandlers>
+ </MASM>
+ </ItemGroup>
</ins><span class="cx"> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</span><span class="cx"> <ImportGroup Label="ExtensionTargets">
</span><span class="cx"> <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets" />
</span><span class="cx"> </ImportGroup>
</span><del>-</Project>
</del><ins>+</Project>
</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"> <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\InspectorJSTypeBuilders.cpp">
</span><span class="cx"> <Filter>Derived Sources</Filter>
</span><span class="cx"> </ClCompile>
</span><ins>+ <ClCompile Include="..\jit\ArityCheckFailReturnThunks.cpp">
+ <Filter>jit</Filter>
+ </ClCompile>
+ <ClCompile Include="..\jit\RegisterPreservationWrapperGenerator.cpp">
+ <Filter>jit</Filter>
+ </ClCompile>
</ins><span class="cx"> <ClCompile Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSCBuiltins.cpp">
</span><span class="cx"> <Filter>Derived Sources</Filter>
</span><span class="cx"> </ClCompile>
</span><span class="lines">@@ -3319,10 +3325,19 @@
</span><span class="cx"> <Filter>runtime</Filter>
</span><span class="cx"> </ClInclude>
</span><span class="cx"> <ClInclude Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\JSDataViewPrototype.lut.h" />
</span><ins>+ <ClInclude Include="..\jit\ArityCheckFailReturnThunks.h">
+ <Filter>jit</Filter>
+ </ClInclude>
+ <ClInclude Include="..\jit\RegisterPreservationWrapperGenerator.h">
+ <Filter>jit</Filter>
+ </ClInclude>
</ins><span class="cx"> </ItemGroup>
</span><span class="cx"> <ItemGroup>
</span><span class="cx"> <None Include="JavaScriptCorePreLink.cmd" />
</span><span class="cx"> <None Include="JavaScriptCorePostBuild.cmd" />
</span><span class="cx"> <None Include="JavaScriptCorePreBuild.cmd" />
</span><span class="cx"> </ItemGroup>
</span><del>-</Project>
</del><ins>+ <ItemGroup>
+ <MASM Include="$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\LowLevelInterpreterWin.asm" />
+ </ItemGroup>
+</Project>
</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 "END" > LowLevelInterpreterWin.asm
+
+# When enabling LLINT and switching to the x86 backend, use "LowLevelInterpreterWin.asm" as output file when running asm.rb.
+
</ins><span class="cx"> /usr/bin/env ruby "${SRCROOT}/offlineasm/asm.rb" "${SRCROOT}/llint/LowLevelInterpreter.asm" "${BUILT_PRODUCTS_DIR}/LLIntOffsetsExtractor/LLIntOffsetsExtractor${3}.exe" "LLIntAssembly.h" || 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->hasExitSite(locker, DFG::FrequentExitSite(bytecodeIndex, BadCache))
</span><span class="cx"> || profiledBlock->hasExitSite(locker, DFG::FrequentExitSite(bytecodeIndex, BadCacheWatchpoint))
</span><span class="cx"> || profiledBlock->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& locker, CodeBlock* profiledBlock, unsigned bytecodeIndex, ExitingJITType jitType)
</span><span class="cx"> {
</span><span class="cx"> return profiledBlock->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&, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
+#endif
</ins><span class="cx"> #if ENABLE(JIT)
</span><del>- static bool hasExitSite(const ConcurrentJITLocker&, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
</del><span class="cx"> static GetByIdStatus computeForStubInfo(const ConcurrentJITLocker&, CodeBlock*, StructureStubInfo*, StringImpl* uid);
</span><span class="cx"> #endif
</span><span class="cx"> static void computeForChain(GetByIdStatus& 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& locker, CodeBlock* profiledBlock, unsigned bytecodeIndex, ExitingJITType exitType)
</span><span class="cx"> {
</span><span class="cx"> return profiledBlock->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->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& baselineMap, StubInfoMap& 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->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&, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
+#endif
</ins><span class="cx"> #if ENABLE(JIT)
</span><del>- static bool hasExitSite(const ConcurrentJITLocker&, CodeBlock*, unsigned bytecodeIndex, ExitingJITType = ExitFromAnything);
</del><span class="cx"> static PutByIdStatus computeForStubInfo(const ConcurrentJITLocker&, 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<Opcode>(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 "C" 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 "C" SlowPathReturnType llint_stack_check_at_vm_entry(VM*, Register*) WTF_INTERNAL;
</span><span class="cx"> #endif
</span><ins>+extern "C" 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 = ""
</ins><span class="cx"> end
</span><del>-
</del><ins>+
</ins><span class="cx"> def enterAsm
</span><del>- @outp.puts "OFFLINE_ASM_BEGIN"
</del><ins>+ @outp.puts "OFFLINE_ASM_BEGIN" 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 "OFFLINE_ASM_END"
</del><ins>+ @outp.puts "OFFLINE_ASM_END" 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 += "#{@codeOrigin}"
</span><span class="cx"> end
</span><span class="cx"> if result != ""
</span><del>- result = "// " + result
</del><ins>+ result = $commentPrefix + " " + 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(" \"\\t" + line.join('') + "\\n\"", lastComment))
</del><ins>+ if !$emitWinAsm
+ @outp.puts(formatDump(" \"\\t" + line.join('') + "\\n\"", lastComment))
+ else
+ @outp.puts(formatDump(" " + 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("#{label} PROC PUBLIC", comment))
+ @lastlabel = label
+ end
+
+ def putsProcEndIfNeeded
+ raise unless $emitWinAsm
+ if @lastlabel != ""
+ @outp.puts("#{@lastlabel} ENDP")
+ end
+ @lastlabel = ""
+ 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 ? "Global Label #{@numGlobalLabels}" : nil
</span><span class="cx"> if /\Allint_op_/.match(labelName)
</span><del>- @outp.puts(formatDump("OFFLINE_ASM_OPCODE_LABEL(op_#{$~.post_match})", lastComment))
</del><ins>+ if !$emitWinAsm
+ @outp.puts(formatDump("OFFLINE_ASM_OPCODE_LABEL(op_#{$~.post_match})", lastComment))
+ else
+ label = "llint_" + "op_#{$~.post_match}"
+ putsProc(label, lastComment)
+ end
</ins><span class="cx"> else
</span><del>- @outp.puts(formatDump("OFFLINE_ASM_GLUE_LABEL(#{labelName})", lastComment))
</del><ins>+ if !$emitWinAsm
+ @outp.puts(formatDump("OFFLINE_ASM_GLUE_LABEL(#{labelName})", 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("\n")
</span><span class="cx"> @internalComment = $enableLabelCountComments ? "Local Label #{@numLocalLabels}" : nil
</span><del>- @outp.puts(formatDump(" OFFLINE_ASM_LOCAL_LABEL(#{labelName})", lastComment))
</del><ins>+ if !$emitWinAsm
+ @outp.puts(formatDump(" OFFLINE_ASM_LOCAL_LABEL(#{labelName})", lastComment))
+ else
+ @outp.puts(formatDump(" #{labelName}:", lastComment))
+ end
</ins><span class="cx"> end
</span><span class="cx">
</span><span class="cx"> def self.labelReference(labelName)
</span><del>- "\" LOCAL_REFERENCE(#{labelName}) \""
</del><ins>+ if !$emitWinAsm
+ "\" LOCAL_REFERENCE(#{labelName}) \""
+ else
+ "#{labelName}"
+ end
</ins><span class="cx"> end
</span><span class="cx">
</span><span class="cx"> def self.localLabelReference(labelName)
</span><del>- "\" LOCAL_LABEL_STRING(#{labelName}) \""
</del><ins>+ if !$emitWinAsm
+ "\" LOCAL_LABEL_STRING(#{labelName}) \""
+ else
+ "#{labelName}"
+ 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 " // #{@codeOrigin}"
- @outp.puts " // #{text}"
</del><ins>+ @outp.puts " " + $commentPrefix + " #{@codeOrigin}"
+ @outp.puts " " + $commentPrefix + " #{text}"
</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(".asm") != nil : false
+$commentPrefix = $emitWinAsm ? ";" : "//"
+
</ins><span class="cx"> inputHash =
</span><del>- "// offlineasm input hash: " + parseHash(asmFile) +
</del><ins>+ $commentPrefix + " offlineasm input hash: " + parseHash(asmFile) +
</ins><span class="cx"> " " + Digest::SHA1.hexdigest(configurationList.map{|v| (v[0] + [v[1]]).join(' ')}.join(' ')) +
</span><span class="cx"> " " + 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 ".MODEL FLAT, C"
+ $output.puts "INCLUDE #{File.basename($output.path)}.sym"
+ $output.puts "_TEXT SEGMENT"
+ end
</ins><span class="cx">
</span><span class="cx"> if isASTErroneous(ast)
</span><span class="cx"> $output.puts "#error \"Invalid configuration.\""
</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 "#endif"
</del><ins>+ if !$emitWinAsm
+ $output.puts "#endif"
+ else
+ $output.puts "_TEXT ENDS"
+ $output.puts "END"
+ 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 : "%" + name
+end
+
+def offsetRegister(off, register)
+ isIntelSyntax ? "[#{off} + #{register}]" : "#{off}(#{register})"
+end
+
+def callPrefix
+ isIntelSyntax ? "" : "*"
+end
+
+def orderOperands(opA, opB)
+ isIntelSyntax ? "#{opB}, #{opA}" : "#{opA}, #{opB}"
+end
+
+def const(c)
+ isIntelSyntax ? "#{c}" : "$#{c}"
+end
+
+def getSizeString(kind)
+ if !isIntelSyntax
+ return ""
+ end
+
+ size = ""
+ case kind
+ when :byte
+ size = "byte"
+ when :half
+ size = "word"
+ when :int
+ size = "dword"
+ when :ptr
+ size = "dword"
+ else
+ raise
+ end
+
+ return size + " " + "ptr" + " ";
+end
+
</ins><span class="cx"> class SpecialRegister < 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>- "*#{x86Operand(:quad)}"
</del><ins>+ "#{callPrefix}#{x86Operand(:quad)}"
</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 "t0", "a0", "r0"
</span><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><del>- "%al"
</del><ins>+ register("al")
</ins><span class="cx"> when :half
</span><del>- "%ax"
</del><ins>+ register("ax")
</ins><span class="cx"> when :int
</span><del>- "%eax"
</del><ins>+ register("eax")
</ins><span class="cx"> when :ptr
</span><del>- isX64 ? "%rax" : "%eax"
</del><ins>+ isX64 ? register("rax") : register("eax")
</ins><span class="cx"> when :quad
</span><del>- isX64 ? "%rax" : raise
</del><ins>+ isX64 ? register("rax") : raise
</ins><span class="cx"> else
</span><span class="cx"> raise "Invalid kind #{kind} for name #{name}"
</span><span class="cx"> end
</span><span class="cx"> when "t1", "a1", "r1"
</span><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><del>- "%dl"
</del><ins>+ register("dl")
</ins><span class="cx"> when :half
</span><del>- "%dx"
</del><ins>+ register("dx")
</ins><span class="cx"> when :int
</span><del>- "%edx"
</del><ins>+ register("edx")
</ins><span class="cx"> when :ptr
</span><del>- isX64 ? "%rdx" : "%edx"
</del><ins>+ isX64 ? register("rdx") : register("edx")
</ins><span class="cx"> when :quad
</span><del>- isX64 ? "%rdx" : raise
</del><ins>+ isX64 ? register("rdx") : raise
</ins><span class="cx"> else
</span><span class="cx"> raise
</span><span class="cx"> end
</span><span class="cx"> when "t2"
</span><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><del>- "%cl"
</del><ins>+ register("cl")
</ins><span class="cx"> when :half
</span><del>- "%cx"
</del><ins>+ register("cx")
</ins><span class="cx"> when :int
</span><del>- "%ecx"
</del><ins>+ register("ecx")
</ins><span class="cx"> when :ptr
</span><del>- isX64 ? "%rcx" : "%ecx"
</del><ins>+ isX64 ? register("rcx") : register("ecx")
</ins><span class="cx"> when :quad
</span><del>- isX64 ? "%rcx" : raise
</del><ins>+ isX64 ? register("rcx") : raise
</ins><span class="cx"> else
</span><span class="cx"> raise
</span><span class="cx"> end
</span><span class="cx"> when "t3"
</span><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><del>- "%bl"
</del><ins>+ register("bl")
</ins><span class="cx"> when :half
</span><del>- "%bx"
</del><ins>+ register("bx")
</ins><span class="cx"> when :int
</span><del>- "%ebx"
</del><ins>+ register("ebx")
</ins><span class="cx"> when :ptr
</span><del>- isX64 ? "%rbx" : "%ebx"
</del><ins>+ isX64 ? register("rbx") : register("ebx")
</ins><span class="cx"> when :quad
</span><del>- isX64 ? "%rbx" : raise
</del><ins>+ isX64 ? register("rbx") : raise
</ins><span class="cx"> else
</span><span class="cx"> raise
</span><span class="cx"> end
</span><span class="cx"> when "t4"
</span><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><del>- "%dil"
</del><ins>+ register("dil")
</ins><span class="cx"> when :half
</span><del>- "%di"
</del><ins>+ register("di")
</ins><span class="cx"> when :int
</span><del>- "%edi"
</del><ins>+ register("edi")
</ins><span class="cx"> when :ptr
</span><del>- isX64 ? "%rdi" : "%edi"
</del><ins>+ isX64 ? register("rdi") : register("edi")
</ins><span class="cx"> when :quad
</span><del>- isX64 ? "%rdi" : raise
</del><ins>+ isX64 ? register("rdi") : 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>- "%bp"
</del><ins>+ register("bp")
</ins><span class="cx"> when :int
</span><del>- "%ebp"
</del><ins>+ register("ebp")
</ins><span class="cx"> when :ptr
</span><del>- "%rbp"
</del><ins>+ register("rbp")
</ins><span class="cx"> when :quad
</span><del>- "%rbp"
</del><ins>+ register("rbp")
</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>- "%bp"
</del><ins>+ register("bp")
</ins><span class="cx"> when :int
</span><del>- "%ebp"
</del><ins>+ register("ebp")
</ins><span class="cx"> when :ptr
</span><del>- "%ebp"
</del><ins>+ register("ebp")
</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 "sp"
</span><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><del>- "%spl"
</del><ins>+ register("spl")
</ins><span class="cx"> when :half
</span><del>- "%sp"
</del><ins>+ register("sp")
</ins><span class="cx"> when :int
</span><del>- "%esp"
</del><ins>+ register("esp")
</ins><span class="cx"> when :ptr
</span><del>- isX64 ? "%rsp" : "%esp"
</del><ins>+ isX64 ? register("rsp") : register("esp")
</ins><span class="cx"> when :quad
</span><del>- isX64 ? "%rsp" : raise
</del><ins>+ isX64 ? register("rsp") : raise
</ins><span class="cx"> else
</span><span class="cx"> raise
</span><span class="cx"> end
</span><span class="cx"> when "t5"
</span><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><del>- "%sil"
</del><ins>+ register("sil")
</ins><span class="cx"> when :half
</span><del>- "%si"
</del><ins>+ register("si")
</ins><span class="cx"> when :int
</span><del>- "%esi"
</del><ins>+ register("esi")
</ins><span class="cx"> when :ptr
</span><del>- isX64 ? "%rsi" : "%esi"
</del><ins>+ isX64 ? register("rsi") : register("esi")
</ins><span class="cx"> when :quad
</span><del>- isX64 ? "%rsi" : raise
</del><ins>+ isX64 ? register("rsi") : raise
</ins><span class="cx"> end
</span><span class="cx"> when "t6"
</span><span class="cx"> raise "Cannot use #{name} in 32-bit X86 at #{codeOriginString}" 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 ? "*#{x86Operand(:quad)}" : "*#{x86Operand(:ptr)}"
</del><ins>+ isX64 ? "#{callPrefix}#{x86Operand(:quad)}" : "#{callPrefix}#{x86Operand(:ptr)}"
</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>- "%st(#{x87DefaultStackPosition + offset})"
</del><ins>+ "#{register("st")}(#{x87DefaultStackPosition + offset})"
</ins><span class="cx"> end
</span><span class="cx"> def x86CallOperand(kind)
</span><del>- "*#{x86Operand(kind)}"
</del><ins>+ "#{callPrefix}#{x86Operand(kind)}"
</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>- "$#{value}"
</del><ins>+ "#{const(value)}"
</ins><span class="cx"> end
</span><span class="cx"> def x86CallOperand(kind)
</span><span class="cx"> "#{value}"
</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>- "#{offset.value}(#{base.x86Operand(addressKind)})"
</del><ins>+ "#{offsetRegister(offset.value, base.x86Operand(addressKind))}"
</ins><span class="cx"> end
</span><span class="cx"> def x86Operand(kind)
</span><del>- x86AddressOperand(:ptr)
</del><ins>+ "#{getSizeString(kind)}#{x86AddressOperand(:ptr)}"
</ins><span class="cx"> end
</span><span class="cx"> def x86CallOperand(kind)
</span><del>- "*#{x86Operand(kind)}"
</del><ins>+ "#{callPrefix}#{x86Operand(kind)}"
</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>- "#{offset.value}(#{base.x86Operand(addressKind)}, #{index.x86Operand(addressKind)}, #{scale})"
</del><ins>+ if !isIntelSyntax
+ "#{offset.value}(#{base.x86Operand(addressKind)}, #{index.x86Operand(addressKind)}, #{scale})"
+ else
+ "#{getSizeString(addressKind)}[#{offset.value} + #{base.x86Operand(addressKind)} + #{index.x86Operand(addressKind)} * #{scale}]"
+ 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>- "*#{x86Operand(kind)}"
</del><ins>+ "#{callPrefix}#{x86Operand(kind)}"
</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>- "*#{address.value}"
</del><ins>+ "#{callPrefix}#{address.value}"
</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 ? "st(0), " : ""
+ @@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 << operands[idx].x86Operand(kinds[idx])
</del><ins>+ i = isIntelSyntax ? (kinds.size - idx - 1) : idx
+ result << operands[i].x86Operand(kinds[i])
</ins><span class="cx"> }
</span><span class="cx"> result.join(", ")
</span><span class="cx"> end
</span><span class="cx">
</span><span class="cx"> def x86Suffix(kind)
</span><ins>+ if isIntelSyntax
+ return ""
+ end
+
</ins><span class="cx"> case kind
</span><span class="cx"> when :byte
</span><span class="cx"> "b"
</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 "#{opcode} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "#{opcode} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}"
</ins><span class="cx"> elsif operands[1] == operands[2]
</span><del>- $asm.puts "#{opcode} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "#{opcode} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}"
</ins><span class="cx"> else
</span><del>- $asm.puts "mov#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
- $asm.puts "#{opcode} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}"
+ $asm.puts "#{opcode} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}"
</ins><span class="cx"> end
</span><span class="cx"> else
</span><del>- $asm.puts "#{opcode} #{operands[0].x86Operand(kind)}, #{operands[1].x86Operand(kind)}"
</del><ins>+ $asm.puts "#{opcode} #{orderOperands(operands[0].x86Operand(kind), operands[1].x86Operand(kind))}"
</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, "t2")
</span><del>- $asm.puts "#{opcode} #{operands[0].x86Operand(:byte)}, #{operands[1].x86Operand(kind)}"
</del><ins>+ $asm.puts "#{opcode} #{orderOperands(operands[0].x86Operand(:byte), operands[1].x86Operand(kind))}"
</ins><span class="cx"> else
</span><span class="cx"> cx = RegisterID.forName(nil, "t2")
</span><span class="cx"> $asm.puts "xchg#{x86Suffix(:ptr)} #{operands[0].x86Operand(:ptr)}, #{cx.x86Operand(:ptr)}"
</span><del>- $asm.puts "#{opcode} %cl, #{operands[1].x86Operand(kind)}"
</del><ins>+ $asm.puts "#{opcode} #{orderOperands(register("cl"), operands[1].x86Operand(kind))}"
</ins><span class="cx"> $asm.puts "xchg#{x86Suffix(:ptr)} #{operands[0].x86Operand(:ptr)}, #{cx.x86Operand(:ptr)}"
</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 == "e" or opcodeSuffix == "ne")
</span><del>- $asm.puts "test#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[1].x86Operand(kind)}"
</del><ins>+ $asm.puts "test#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[1].x86Operand(kind))}"
</ins><span class="cx"> elsif operands[1].is_a? Immediate and operands[1].value == 0 and operands[0].is_a? RegisterID and (opcodeSuffix == "e" or opcodeSuffix == "ne")
</span><del>- $asm.puts "test#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[0].x86Operand(kind)}"
</del><ins>+ $asm.puts "test#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[0].x86Operand(kind))}"
</ins><span class="cx"> else
</span><del>- $asm.puts "cmp#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[0].x86Operand(kind)}"
</del><ins>+ $asm.puts "cmp#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[0].x86Operand(kind))}"
</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 "#{setOpcode} #{operand.x86Operand(:byte)}"
</span><del>- $asm.puts "movzbl #{operand.x86Operand(:byte)}, #{operand.x86Operand(:int)}"
</del><ins>+ if !isIntelSyntax
+ $asm.puts "movzbl #{orderOperands(operand.x86Operand(:byte), operand.x86Operand(:int))}"
+ else
+ $asm.puts "movzx #{orderOperands(operand.x86Operand(:byte), operand.x86Operand(:int))}"
+ end
</ins><span class="cx"> else
</span><span class="cx"> ax = RegisterID.new(nil, "t0")
</span><span class="cx"> $asm.puts "xchg#{x86Suffix(:ptr)} #{operand.x86Operand(:ptr)}, #{ax.x86Operand(:ptr)}"
</span><span class="lines">@@ -568,10 +642,10 @@
</span><span class="cx"> if value.is_a? RegisterID
</span><span class="cx"> $asm.puts "test#{x86Suffix(kind)} #{value.x86Operand(kind)}, #{value.x86Operand(kind)}"
</span><span class="cx"> else
</span><del>- $asm.puts "cmp#{x86Suffix(kind)} $0, #{value.x86Operand(kind)}"
</del><ins>+ $asm.puts "cmp#{x86Suffix(kind)} #{orderOperands(const(0), value.x86Operand(kind))}"
</ins><span class="cx"> end
</span><span class="cx"> else
</span><del>- $asm.puts "test#{x86Suffix(kind)} #{mask.x86Operand(kind)}, #{value.x86Operand(kind)}"
</del><ins>+ $asm.puts "test#{x86Suffix(kind)} #{orderOperands(mask.x86Operand(kind), value.x86Operand(kind))}"
</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 "neg#{x86Suffix(kind)} #{operands[2].x86Operand(kind)}"
</span><del>- $asm.puts "add#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "add#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}"
</ins><span class="cx"> else
</span><span class="cx"> handleX86OpWithNumOperands("sub#{x86Suffix(kind)}", 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 "add#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "add#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}"
</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 "mov#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}"
</ins><span class="cx"> end
</span><span class="cx"> else
</span><del>- $asm.puts "lea#{x86Suffix(kind)} #{operands[0].value}(#{operands[1].x86Operand(kind)}), #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "lea#{x86Suffix(kind)} #{orderOperands(offsetRegister(operands[0].value, operands[1].x86Operand(kind)), operands[2].x86Operand(kind))}"
</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 "add#{x86Suffix(kind)} #{operands[1].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "add#{x86Suffix(kind)} #{orderOperands(operands[1].x86Operand(kind), operands[2].x86Operand(kind))}"
</ins><span class="cx"> else
</span><del>- $asm.puts "lea#{x86Suffix(kind)} (#{operands[0].x86Operand(kind)}, #{operands[1].x86Operand(kind)}), #{operands[2].x86Operand(kind)}"
</del><ins>+ if !isIntelSyntax
+ $asm.puts "lea#{x86Suffix(kind)} (#{operands[0].x86Operand(kind)}, #{operands[1].x86Operand(kind)}), #{operands[2].x86Operand(kind)}"
+ else
+ $asm.puts "lea#{x86Suffix(kind)} #{operands[2].x86Operand(kind)}, [#{operands[0].x86Operand(kind)} + #{operands[1].x86Operand(kind)}]"
+ 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 "neg#{x86Suffix(kind)} #{operands[2].x86Operand(kind)}"
</span><del>- $asm.puts "add#{x86Suffix(kind)} #{operands[0].x86Operand(kind)}, #{operands[2].x86Operand(kind)}"
</del><ins>+ $asm.puts "add#{x86Suffix(kind)} #{orderOperands(operands[0].x86Operand(kind), operands[2].x86Operand(kind))}"
</ins><span class="cx"> else
</span><span class="cx"> handleX86Op("sub#{x86Suffix(kind)}", 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, "sp")
+ opA = offsetRegister(operands[0].value * x86Bytes(:ptr), sp.x86Operand(:ptr))
+ opB = operands[1].x86Operand(:ptr)
+ $asm.puts "mov#{x86Suffix(:ptr)} #{orderOperands(opA, opB)}"
+ end
+
+ def handleX86Poke()
+ sp = RegisterID.new(nil, "sp")
+ opA = operands[0].x86Operand(:ptr)
+ opB = offsetRegister(operands[1].value * x86Bytes(:ptr), sp.x86Operand(:ptr))
+ $asm.puts "mov#{x86Suffix(:ptr)} #{orderOperands(opA, opB)}"
+ 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 "fucomi #{operands[1].x87Operand(0)}"
</del><ins>+ $asm.puts "fucomi #{@@floatingPointCompareImplicitOperand}#{operands[1].x87Operand(0)}"
</ins><span class="cx"> else
</span><span class="cx"> $asm.puts "fld #{operands[0].x87Operand(0)}"
</span><del>- $asm.puts "fucomip #{operands[1].x87Operand(1)}"
</del><ins>+ $asm.puts "fucomip #{@@floatingPointCompareImplicitOperand}#{operands[1].x87Operand(1)}"
</ins><span class="cx"> end
</span><span class="cx"> when :reverse
</span><span class="cx"> if (operands[1].x87DefaultStackPosition == 0)
</span><del>- $asm.puts "fucomi #{operands[0].x87Operand(0)}"
</del><ins>+ $asm.puts "fucomi #{@@floatingPointCompareImplicitOperand}#{operands[0].x87Operand(0)}"
</ins><span class="cx"> else
</span><span class="cx"> $asm.puts "fld #{operands[1].x87Operand(0)}"
</span><del>- $asm.puts "fucomip #{operands[0].x87Operand(1)}"
</del><ins>+ $asm.puts "fucomip #{@@floatingPointCompareImplicitOperand}#{operands[0].x87Operand(1)}"
</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 "#{opcode} #{operands[0].x87Operand(0)}, %st"
</del><ins>+ $asm.puts "#{opcode} #{operands[0].x87Operand(0)}, #{register("st")}"
</ins><span class="cx"> elsif (operands[0].x87DefaultStackPosition == 0)
</span><del>- $asm.puts "#{opcodereverse} %st, #{operands[1].x87Operand(0)}"
</del><ins>+ $asm.puts "#{opcodereverse} #{register("st")}, #{operands[1].x87Operand(0)}"
</ins><span class="cx"> else
</span><span class="cx"> $asm.puts "fld #{operands[0].x87Operand(0)}"
</span><del>- $asm.puts "#{opcodereverse}p %st, #{operands[1].x87Operand(1)}"
</del><ins>+ $asm.puts "#{opcodereverse}p #{register("st")}, #{operands[1].x87Operand(1)}"
</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 == "X86_64"
</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("#{File.basename($output.path)}.sym", "a") {
+ | outp |
+ outp.puts "EXTERN #{symbol} : near"
+ }
+ 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 "addq"
</span><span class="cx"> handleX86Add(:quad)
</span><span class="cx"> when "andi"
</span><del>- handleX86Op("andl", :int)
</del><ins>+ handleX86Op("and#{x86Suffix(:int)}", :int)
</ins><span class="cx"> when "andp"
</span><span class="cx"> handleX86Op("and#{x86Suffix(:ptr)}", :ptr)
</span><span class="cx"> when "andq"
</span><span class="cx"> handleX86Op("and#{x86Suffix(:quad)}", :quad)
</span><span class="cx"> when "lshifti"
</span><del>- handleX86Shift("sall", :int)
</del><ins>+ handleX86Shift("sal#{x86Suffix(:int)}", :int)
</ins><span class="cx"> when "lshiftp"
</span><span class="cx"> handleX86Shift("sal#{x86Suffix(:ptr)}", :ptr)
</span><span class="cx"> when "lshiftq"
</span><span class="lines">@@ -753,27 +861,27 @@
</span><span class="cx"> when "mulq"
</span><span class="cx"> handleX86Mul(:quad)
</span><span class="cx"> when "negi"
</span><del>- $asm.puts "negl #{x86Operands(:int)}"
</del><ins>+ $asm.puts "neg#{x86Suffix(:int)} #{x86Operands(:int)}"
</ins><span class="cx"> when "negp"
</span><span class="cx"> $asm.puts "neg#{x86Suffix(:ptr)} #{x86Operands(:ptr)}"
</span><span class="cx"> when "negq"
</span><span class="cx"> $asm.puts "neg#{x86Suffix(:quad)} #{x86Operands(:quad)}"
</span><span class="cx"> when "noti"
</span><del>- $asm.puts "notl #{x86Operands(:int)}"
</del><ins>+ $asm.puts "not#{x86Suffix(:int)} #{x86Operands(:int)}"
</ins><span class="cx"> when "ori"
</span><del>- handleX86Op("orl", :int)
</del><ins>+ handleX86Op("or#{x86Suffix(:int)}", :int)
</ins><span class="cx"> when "orp"
</span><span class="cx"> handleX86Op("or#{x86Suffix(:ptr)}", :ptr)
</span><span class="cx"> when "orq"
</span><span class="cx"> handleX86Op("or#{x86Suffix(:quad)}", :quad)
</span><span class="cx"> when "rshifti"
</span><del>- handleX86Shift("sarl", :int)
</del><ins>+ handleX86Shift("sar#{x86Suffix(:int)}", :int)
</ins><span class="cx"> when "rshiftp"
</span><span class="cx"> handleX86Shift("sar#{x86Suffix(:ptr)}", :ptr)
</span><span class="cx"> when "rshiftq"
</span><span class="cx"> handleX86Shift("sar#{x86Suffix(:quad)}", :quad)
</span><span class="cx"> when "urshifti"
</span><del>- handleX86Shift("shrl", :int)
</del><ins>+ handleX86Shift("shr#{x86Suffix(:int)}", :int)
</ins><span class="cx"> when "urshiftp"
</span><span class="cx"> handleX86Shift("shr#{x86Suffix(:ptr)}", :ptr)
</span><span class="cx"> when "urshiftq"
</span><span class="lines">@@ -785,36 +893,48 @@
</span><span class="cx"> when "subq"
</span><span class="cx"> handleX86Sub(:quad)
</span><span class="cx"> when "xori"
</span><del>- handleX86Op("xorl", :int)
</del><ins>+ handleX86Op("xor#{x86Suffix(:int)}", :int)
</ins><span class="cx"> when "xorp"
</span><span class="cx"> handleX86Op("xor#{x86Suffix(:ptr)}", :ptr)
</span><span class="cx"> when "xorq"
</span><span class="cx"> handleX86Op("xor#{x86Suffix(:quad)}", :quad)
</span><span class="cx"> when "loadi", "storei"
</span><del>- $asm.puts "movl #{x86Operands(:int, :int)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(:int)} #{x86Operands(:int, :int)}"
</ins><span class="cx"> when "loadis"
</span><span class="cx"> if isX64
</span><span class="cx"> $asm.puts "movslq #{x86Operands(:int, :quad)}"
</span><span class="cx"> else
</span><del>- $asm.puts "movl #{x86Operands(:int, :int)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(:int)} #{x86Operands(:int, :int)}"
</ins><span class="cx"> end
</span><span class="cx"> when "loadp", "storep"
</span><span class="cx"> $asm.puts "mov#{x86Suffix(:ptr)} #{x86Operands(:ptr, :ptr)}"
</span><span class="cx"> when "loadq", "storeq"
</span><span class="cx"> $asm.puts "mov#{x86Suffix(:quad)} #{x86Operands(:quad, :quad)}"
</span><span class="cx"> when "loadb"
</span><del>- $asm.puts "movzbl #{operands[0].x86Operand(:byte)}, #{operands[1].x86Operand(:int)}"
</del><ins>+ if !isIntelSyntax
+ $asm.puts "movzbl #{orderOperands(operands[0].x86Operand(:byte), operands[1].x86Operand(:int))}"
+ else
+ $asm.puts "movzx #{orderOperands(operands[0].x86Operand(:byte), operands[1].x86Operand(:int))}"
+ end
</ins><span class="cx"> when "loadbs"
</span><span class="cx"> $asm.puts "movsbl #{operands[0].x86Operand(:byte)}, #{operands[1].x86Operand(:int)}"
</span><span class="cx"> when "loadh"
</span><del>- $asm.puts "movzwl #{operands[0].x86Operand(:half)}, #{operands[1].x86Operand(:int)}"
</del><ins>+ if !isIntelSyntax
+ $asm.puts "movzwl #{orderOperands(operands[0].x86Operand(:half), operands[1].x86Operand(:int))}"
+ else
+ $asm.puts "movzx #{orderOperands(operands[0].x86Operand(:half), operands[1].x86Operand(:int))}"
+ end
</ins><span class="cx"> when "loadhs"
</span><span class="cx"> $asm.puts "movswl #{operands[0].x86Operand(:half)}, #{operands[1].x86Operand(:int)}"
</span><span class="cx"> when "storeb"
</span><del>- $asm.puts "movb #{x86Operands(:byte, :byte)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(:byte)} #{x86Operands(:byte, :byte)}"
</ins><span class="cx"> when "loadd"
</span><span class="cx"> if useX87
</span><del>- $asm.puts "fldl #{operands[0].x86Operand(:double)}"
</del><ins>+ if !isIntelSyntax
+ $asm.puts "fldl #{operands[0].x86Operand(:double)}"
+ else
+ $asm.puts "fld #{operands[0].x86Operand(:double)}"
+ end
</ins><span class="cx"> $asm.puts "fstp #{operands[1].x87Operand(1)}"
</span><span class="cx"> else
</span><span class="cx"> $asm.puts "movsd #{x86Operands(:double, :double)}"
</span><span class="lines">@@ -833,10 +953,14 @@
</span><span class="cx"> when "stored"
</span><span class="cx"> if useX87
</span><span class="cx"> if (operands[0].x87DefaultStackPosition == 0)
</span><del>- $asm.puts "fstl #{operands[1].x86Operand(:double)}"
</del><ins>+ $asm.puts "fst#{x86Suffix(:int)} #{operands[1].x86Operand(:double)}"
</ins><span class="cx"> else
</span><span class="cx"> $asm.puts "fld #{operands[0].x87Operand(0)}"
</span><del>- $asm.puts "fstpl #{operands[1].x86Operand(:double)}"
</del><ins>+ if !isIntelSyntax
+ $asm.puts "fstpl #{operands[1].x86Operand(:double)}"
+ else
+ $asm.puts "fstp #{operands[1].x86Operand(:double)}"
+ end
</ins><span class="cx"> end
</span><span class="cx"> else
</span><span class="cx"> $asm.puts "movsd #{x86Operands(:double, :double)}"
</span><span class="lines">@@ -876,8 +1000,8 @@
</span><span class="cx"> when "ci2d"
</span><span class="cx"> if useX87
</span><span class="cx"> sp = RegisterID.new(nil, "sp")
</span><del>- $asm.puts "movl #{operands[0].x86Operand(:int)}, -4(#{sp.x86Operand(:ptr)})"
- $asm.puts "fildl -4(#{sp.x86Operand(:ptr)})"
</del><ins>+ $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), offsetRegister(-4, sp.x86Operand(:ptr)))}"
+ $asm.puts "fild#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-4, sp.x86Operand(:ptr))}"
</ins><span class="cx"> $asm.puts "fstp #{operands[1].x87Operand(1)}"
</span><span class="cx"> else
</span><span class="cx"> $asm.puts "cvtsi2sd #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:double)}"
</span><span class="lines">@@ -952,18 +1076,18 @@
</span><span class="cx"> $asm.puts "fistl -4(#{sp.x86Operand(:ptr)})"
</span><span class="cx"> else
</span><span class="cx"> $asm.puts "fld #{operands[0].x87Operand(0)}"
</span><del>- $asm.puts "fistpl -4(#{sp.x86Operand(:ptr)})"
</del><ins>+ $asm.puts "fistp#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-4, sp.x86Operand(:ptr))}"
</ins><span class="cx"> end
</span><del>- $asm.puts "movl -4(#{sp.x86Operand(:ptr)}), #{operands[1].x86Operand(:int)}"
- $asm.puts "testl #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(offsetRegister(-4, sp.x86Operand(:ptr)), operands[1].x86Operand(:int))}"
+ $asm.puts "test#{x86Suffix(:int)} #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}"
</ins><span class="cx"> $asm.puts "je #{operands[2].asmLabel}"
</span><del>- $asm.puts "fildl -4(#{sp.x86Operand(:ptr)})"
- $asm.puts "fucomip #{operands[0].x87Operand(1)}"
</del><ins>+ $asm.puts "fild#{x86Suffix(:int)} #{getSizeString(:int)}#{offsetRegister(-4, sp.x86Operand(:ptr))}"
+ $asm.puts "fucomip #{@@floatingPointCompareImplicitOperand}#{operands[0].x87Operand(1)}"
</ins><span class="cx"> $asm.puts "jp #{operands[2].asmLabel}"
</span><span class="cx"> $asm.puts "jne #{operands[2].asmLabel}"
</span><span class="cx"> else
</span><span class="cx"> $asm.puts "cvttsd2si #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:int)}"
</span><del>- $asm.puts "testl #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}"
</del><ins>+ $asm.puts "test#{x86Suffix(:int)} #{operands[1].x86Operand(:int)}, #{operands[1].x86Operand(:int)}"
</ins><span class="cx"> $asm.puts "je #{operands[2].asmLabel}"
</span><span class="cx"> $asm.puts "cvtsi2sd #{operands[1].x86Operand(:int)}, %xmm7"
</span><span class="cx"> $asm.puts "ucomisd #{operands[0].x86Operand(:double)}, %xmm7"
</span><span class="lines">@@ -995,9 +1119,9 @@
</span><span class="cx"> $asm.puts "pop %r13"
</span><span class="cx"> $asm.puts "pop %r12"
</span><span class="cx"> else
</span><del>- $asm.puts "pop %ebx"
- $asm.puts "pop %edi"
- $asm.puts "pop %esi"
</del><ins>+ $asm.puts "pop " + register("ebx")
+ $asm.puts "pop " + register("edi")
+ $asm.puts "pop " + register("esi")
</ins><span class="cx"> end
</span><span class="cx"> when "pushCalleeSaves"
</span><span class="cx"> if isX64
</span><span class="lines">@@ -1007,16 +1131,16 @@
</span><span class="cx"> $asm.puts "push %r15"
</span><span class="cx"> $asm.puts "push %rbx"
</span><span class="cx"> else
</span><del>- $asm.puts "push %esi"
- $asm.puts "push %edi"
- $asm.puts "push %ebx"
</del><ins>+ $asm.puts "push " + register("esi")
+ $asm.puts "push " + register("edi")
+ $asm.puts "push " + register("ebx")
</ins><span class="cx"> end
</span><span class="cx"> when "move"
</span><span class="cx"> handleMove
</span><span class="cx"> when "sxi2q"
</span><span class="cx"> $asm.puts "movslq #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:quad)}"
</span><span class="cx"> when "zxi2q"
</span><del>- $asm.puts "movl #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:int)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), operands[1].x86Operand(:int))}"
</ins><span class="cx"> when "nop"
</span><span class="cx"> $asm.puts "nop"
</span><span class="cx"> when "bieq"
</span><span class="lines">@@ -1126,25 +1250,25 @@
</span><span class="cx"> when "jmp"
</span><span class="cx"> $asm.puts "jmp #{operands[0].x86CallOperand(:ptr)}"
</span><span class="cx"> when "baddio"
</span><del>- handleX86OpBranch("addl", "jo", :int)
</del><ins>+ handleX86OpBranch("add#{x86Suffix(:int)}", "jo", :int)
</ins><span class="cx"> when "baddpo"
</span><span class="cx"> handleX86OpBranch("add#{x86Suffix(:ptr)}", "jo", :ptr)
</span><span class="cx"> when "baddqo"
</span><span class="cx"> handleX86OpBranch("add#{x86Suffix(:quad)}", "jo", :quad)
</span><span class="cx"> when "baddis"
</span><del>- handleX86OpBranch("addl", "js", :int)
</del><ins>+ handleX86OpBranch("add#{x86Suffix(:int)}", "js", :int)
</ins><span class="cx"> when "baddps"
</span><span class="cx"> handleX86OpBranch("add#{x86Suffix(:ptr)}", "js", :ptr)
</span><span class="cx"> when "baddqs"
</span><span class="cx"> handleX86OpBranch("add#{x86Suffix(:quad)}", "js", :quad)
</span><span class="cx"> when "baddiz"
</span><del>- handleX86OpBranch("addl", "jz", :int)
</del><ins>+ handleX86OpBranch("add#{x86Suffix(:int)}", "jz", :int)
</ins><span class="cx"> when "baddpz"
</span><span class="cx"> handleX86OpBranch("add#{x86Suffix(:ptr)}", "jz", :ptr)
</span><span class="cx"> when "baddqz"
</span><span class="cx"> handleX86OpBranch("add#{x86Suffix(:quad)}", "jz", :quad)
</span><span class="cx"> when "baddinz"
</span><del>- handleX86OpBranch("addl", "jnz", :int)
</del><ins>+ handleX86OpBranch("add#{x86Suffix(:int)}", "jnz", :int)
</ins><span class="cx"> when "baddpnz"
</span><span class="cx"> handleX86OpBranch("add#{x86Suffix(:ptr)}", "jnz", :ptr)
</span><span class="cx"> when "baddqnz"
</span><span class="lines">@@ -1158,13 +1282,13 @@
</span><span class="cx"> when "bsubinz"
</span><span class="cx"> handleX86SubBranch("jnz", :int)
</span><span class="cx"> when "bmulio"
</span><del>- handleX86OpBranch("imull", "jo", :int)
</del><ins>+ handleX86OpBranch("imul#{x86Suffix(:int)}", "jo", :int)
</ins><span class="cx"> when "bmulis"
</span><del>- handleX86OpBranch("imull", "js", :int)
</del><ins>+ handleX86OpBranch("imul#{x86Suffix(:int)}", "js", :int)
</ins><span class="cx"> when "bmuliz"
</span><del>- handleX86OpBranch("imull", "jz", :int)
</del><ins>+ handleX86OpBranch("imul#{x86Suffix(:int)}", "jz", :int)
</ins><span class="cx"> when "bmulinz"
</span><del>- handleX86OpBranch("imull", "jnz", :int)
</del><ins>+ handleX86OpBranch("imul#{x86Suffix(:int)}", "jnz", :int)
</ins><span class="cx"> when "borio"
</span><span class="cx"> handleX86OpBranch("orl", "jo", :int)
</span><span class="cx"> when "boris"
</span><span class="lines">@@ -1174,15 +1298,19 @@
</span><span class="cx"> when "borinz"
</span><span class="cx"> handleX86OpBranch("orl", "jnz", :int)
</span><span class="cx"> when "break"
</span><del>- $asm.puts "int $3"
</del><ins>+ $asm.puts "int #{const(3)}"
</ins><span class="cx"> when "call"
</span><span class="cx"> if useX87
</span><span class="cx"> 2.times {
</span><span class="cx"> | offset |
</span><del>- $asm.puts "ffree %st(#{offset})"
</del><ins>+ $asm.puts "ffree #{register("st")}(#{offset})"
</ins><span class="cx"> }
</span><span class="cx"> end
</span><del>- $asm.puts "call #{operands[0].x86CallOperand(:ptr)}"
</del><ins>+ op = operands[0].x86CallOperand(:ptr)
+ if isMSVC && (/\Allint_/.match(op) || /\Aslow_path/.match(op))
+ writeSymbolToFile(op)
+ end
+ $asm.puts "call #{op}"
</ins><span class="cx"> when "ret"
</span><span class="cx"> $asm.puts "ret"
</span><span class="cx"> when "cieq"
</span><span class="lines">@@ -1290,11 +1418,9 @@
</span><span class="cx"> when "tbnz"
</span><span class="cx"> handleX86SetTest("setnz", :byte)
</span><span class="cx"> when "peek"
</span><del>- sp = RegisterID.new(nil, "sp")
- $asm.puts "mov#{x86Suffix(:ptr)} #{operands[0].value * x86Bytes(:ptr)}(#{sp.x86Operand(:ptr)}), #{operands[1].x86Operand(:ptr)}"
</del><ins>+ handleX86Peek()
</ins><span class="cx"> when "poke"
</span><del>- sp = RegisterID.new(nil, "sp")
- $asm.puts "mov#{x86Suffix(:ptr)} #{operands[0].x86Operand(:ptr)}, #{operands[1].value * x86Bytes(:ptr)}(#{sp.x86Operand(:ptr)})"
</del><ins>+ handleX86Poke()
</ins><span class="cx"> when "cdqi"
</span><span class="cx"> $asm.puts "cdq"
</span><span class="cx"> when "idivi"
</span><span class="lines">@@ -1302,9 +1428,9 @@
</span><span class="cx"> when "fii2d"
</span><span class="cx"> if useX87
</span><span class="cx"> sp = RegisterID.new(nil, "sp")
</span><del>- $asm.puts "movl #{operands[0].x86Operand(:int)}, -8(#{sp.x86Operand(:ptr)})"
- $asm.puts "movl #{operands[1].x86Operand(:int)}, -4(#{sp.x86Operand(:ptr)})"
- $asm.puts "fldl -8(#{sp.x86Operand(:ptr)})"
</del><ins>+ $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), offsetRegister(-8, sp.x86Operand(:ptr)))}"
+ $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(operands[1].x86Operand(:int), offsetRegister(-4, sp.x86Operand(:ptr)))}"
+ $asm.puts "fld#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-8, sp.x86Operand(:ptr))}"
</ins><span class="cx"> $asm.puts "fstp #{operands[2].x87Operand(1)}"
</span><span class="cx"> else
</span><span class="cx"> $asm.puts "movd #{operands[0].x86Operand(:int)}, #{operands[2].x86Operand(:double)}"
</span><span class="lines">@@ -1316,13 +1442,13 @@
</span><span class="cx"> if useX87
</span><span class="cx"> sp = RegisterID.new(nil, "sp")
</span><span class="cx"> if (operands[0].x87DefaultStackPosition == 0)
</span><del>- $asm.puts "fstl -8(#{sp.x86Operand(:ptr)})"
</del><ins>+ $asm.puts "fst#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-8, sp.x86Operand(:ptr))}"
</ins><span class="cx"> else
</span><span class="cx"> $asm.puts "fld #{operands[0].x87Operand(0)}"
</span><span class="cx"> $asm.puts "fstpl -8(#{sp.x86Operand(:ptr)})"
</span><span class="cx"> end
</span><del>- $asm.puts "movl -8(#{sp.x86Operand(:ptr)}), #{operands[1].x86Operand(:int)}"
- $asm.puts "movl -4(#{sp.x86Operand(:ptr)}), #{operands[2].x86Operand(:int)}"
</del><ins>+ $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(offsetRegister(-8, sp.x86Operand(:ptr)), operands[1].x86Operand(:int))}"
+ $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(offsetRegister(-4, sp.x86Operand(:ptr)), operands[2].x86Operand(:int))}"
</ins><span class="cx"> else
</span><span class="cx"> $asm.puts "movd #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:int)}"
</span><span class="cx"> $asm.puts "movsd #{operands[0].x86Operand(:double)}, %xmm7"
</span><span class="lines">@@ -1342,7 +1468,7 @@
</span><span class="cx"> if useX87
</span><span class="cx"> sp = RegisterID.new(nil, "sp")
</span><span class="cx"> if (operands[0].x87DefaultStackPosition == 0)
</span><del>- $asm.puts "fstl -8(#{sp.x86Operand(:ptr)})"
</del><ins>+ $asm.puts "fst#{x86Suffix(:int)} #{getSizeString(:int)}#{offsetRegister(-8, sp.x86Operand(:ptr))}"
</ins><span class="cx"> else
</span><span class="cx"> $asm.puts "fld #{operands[0].x87Operand(0)}"
</span><span class="cx"> $asm.puts "fstpl -8(#{sp.x86Operand(:ptr)})"
</span><span class="lines">@@ -1360,9 +1486,9 @@
</span><span class="cx"> when "bnz"
</span><span class="cx"> $asm.puts "jnz #{operands[0].asmLabel}"
</span><span class="cx"> when "leai"
</span><del>- $asm.puts "leal #{operands[0].x86AddressOperand(:int)}, #{operands[1].x86Operand(:int)}"
</del><ins>+ $asm.puts "lea#{x86Suffix(:int)} #{orderOperands(operands[0].x86AddressOperand(:int), operands[1].x86Operand(:int))}"
</ins><span class="cx"> when "leap"
</span><del>- $asm.puts "lea#{x86Suffix(:ptr)} #{operands[0].x86AddressOperand(:ptr)}, #{operands[1].x86Operand(:ptr)}"
</del><ins>+ $asm.puts "lea#{x86Suffix(:ptr)} #{orderOperands(operands[0].x86AddressOperand(:ptr), operands[1].x86Operand(:ptr))}"
</ins><span class="cx"> when "memfence"
</span><span class="cx"> $asm.puts "mfence"
</span><span class="cx"> else
</span></span></pre>
</div>
</div>
</body>
</html>