<!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>[170428] trunk/Source</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/170428">170428</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-06-25 09:37:19 -0700 (Wed, 25 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Win64] ASM LLINT is not enabled.
https://bugs.webkit.org/show_bug.cgi?id=130638

Source/JavaScriptCore:
This patch adds a new LLINT assembler backend for Win64, and implements it.
It makes adjustments to follow the Win64 ABI spec. where it's found to be needed.
Also, LLINT and JIT is enabled for Win64.

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

* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added JITStubsMSVC64.asm.
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
* JavaScriptCore/JavaScriptCore.vcxproj/jsc/jscCommon.props: Increased stack size to avoid stack overflow in tests.
* JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh: Generate assembler source file for Win64.
* assembler/MacroAssemblerX86_64.h:
(JSC::MacroAssemblerX86_64::call): Follow Win64 ABI spec.
* jit/JITStubsMSVC64.asm: Added.
* jit/Repatch.cpp:
(JSC::emitPutTransitionStub): Compile fix.
* jit/ThunkGenerators.cpp:
(JSC::nativeForGenerator): Follow Win64 ABI spec.
* llint/LLIntData.cpp:
(JSC::LLInt::Data::performAssertions): Ditto.
* llint/LLIntOfflineAsmConfig.h: Enable new llint backend for Win64.
* llint/LowLevelInterpreter.asm: Implement new Win64 backend, and follow Win64 ABI spec.
* llint/LowLevelInterpreter64.asm: Ditto.
* offlineasm/asm.rb: Compile fix.
* offlineasm/backends.rb: Add new llint backend for Win64.
* offlineasm/settings.rb: Compile fix.
* offlineasm/x86.rb: Implement new llint Win64 backend.

Source/WTF:
Patch by peavo@outlook.com &lt;peavo@outlook.com&gt; on 2014-06-25
Reviewed by Mark Lam.

* wtf/Platform.h: Enable LLINT and JIT for Win64.</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="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojjscjscCommonprops">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/jsc/jscCommon.props</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerMacroAssemblerX86_64h">trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitRepatchcpp">trunk/Source/JavaScriptCore/jit/Repatch.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitThunkGeneratorscpp">trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntDatacpp">trunk/Source/JavaScriptCore/llint/LLIntData.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLLIntOfflineAsmConfigh">trunk/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreterasm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreter64asm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmasmrb">trunk/Source/JavaScriptCore/offlineasm/asm.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmbackendsrb">trunk/Source/JavaScriptCore/offlineasm/backends.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>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfPlatformh">trunk/Source/WTF/wtf/Platform.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCorejitJITStubsMSVC64asm">trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2014-06-25  peavo@outlook.com  &lt;peavo@outlook.com&gt;
+
+        [Win64] ASM LLINT is not enabled.
+        https://bugs.webkit.org/show_bug.cgi?id=130638
+
+        This patch adds a new LLINT assembler backend for Win64, and implements it.
+        It makes adjustments to follow the Win64 ABI spec. where it's found to be needed.
+        Also, LLINT and JIT is enabled for Win64.
+
+        Reviewed by Mark Lam.
+
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added JITStubsMSVC64.asm.
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
+        * JavaScriptCore/JavaScriptCore.vcxproj/jsc/jscCommon.props: Increased stack size to avoid stack overflow in tests.
+        * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh: Generate assembler source file for Win64.
+        * assembler/MacroAssemblerX86_64.h: 
+        (JSC::MacroAssemblerX86_64::call): Follow Win64 ABI spec.
+        * jit/JITStubsMSVC64.asm: Added.
+        * jit/Repatch.cpp:
+        (JSC::emitPutTransitionStub): Compile fix.
+        * jit/ThunkGenerators.cpp:
+        (JSC::nativeForGenerator): Follow Win64 ABI spec.
+        * llint/LLIntData.cpp:
+        (JSC::LLInt::Data::performAssertions): Ditto.
+        * llint/LLIntOfflineAsmConfig.h: Enable new llint backend for Win64.
+        * llint/LowLevelInterpreter.asm: Implement new Win64 backend, and follow Win64 ABI spec.
+        * llint/LowLevelInterpreter64.asm: Ditto.
+        * offlineasm/asm.rb: Compile fix.
+        * offlineasm/backends.rb: Add new llint backend for Win64.
+        * offlineasm/settings.rb: Compile fix.
+        * offlineasm/x86.rb: Implement new llint Win64 backend.
+
</ins><span class="cx"> 2014-06-25  Laszlo Gombos  &lt;l.gombos@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove build guard for progress element
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -1591,9 +1591,17 @@
</span><span class="cx">       &lt;UseSafeExceptionHandlers Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'&quot;&gt;true&lt;/UseSafeExceptionHandlers&gt;
</span><span class="cx">       &lt;UseSafeExceptionHandlers Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'&quot;&gt;true&lt;/UseSafeExceptionHandlers&gt;
</span><span class="cx">     &lt;/MASM&gt;
</span><ins>+    &lt;MASM Include=&quot;..\jit\JITStubsMSVC64.asm&quot;&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Debug|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Production|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+      &lt;ExcludedFromBuild Condition=&quot;'$(Configuration)|$(Platform)'=='Release|Win32'&quot;&gt;true&lt;/ExcludedFromBuild&gt;
+    &lt;/MASM&gt;
</ins><span class="cx">   &lt;/ItemGroup&gt;
</span><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 (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -3714,5 +3714,8 @@
</span><span class="cx">   &lt;/ItemGroup&gt;
</span><span class="cx">   &lt;ItemGroup&gt;
</span><span class="cx">     &lt;MASM Include=&quot;$(ConfigurationBuildDir)\obj$(PlatformArchitecture)\$(ProjectName)\DerivedSources\LowLevelInterpreterWin.asm&quot; /&gt;
</span><ins>+    &lt;MASM Include=&quot;..\jit\JITStubsMSVC64.asm&quot;&gt;
+      &lt;Filter&gt;jit&lt;/Filter&gt;
+    &lt;/MASM&gt;
</ins><span class="cx">   &lt;/ItemGroup&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="trunkSourceJavaScriptCoreJavaScriptCorevcxprojLLIntLLIntAssemblybuildLLIntAssemblysh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/LLInt/LLIntAssembly/build-LLIntAssembly.sh        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -25,13 +25,8 @@
</span><span class="cx"> 
</span><span class="cx"> printf &quot;END&quot; &gt; LowLevelInterpreterWin.asm
</span><span class="cx"> 
</span><del>-# Win32 is using the LLINT x86 backend, and should generate an assembler file.
-# Win64 is using the LLINT C backend, and should generate a header file.
</del><ins>+# If you want to enable the LLINT C loop, set OUTPUTFILENAME to &quot;LLIntAssembly.h&quot;
</ins><span class="cx"> 
</span><del>-if [ &quot;${PLATFORMARCHITECTURE}&quot; == &quot;32&quot; ]; then
-    OUTPUTFILENAME=&quot;LowLevelInterpreterWin.asm&quot;
-else
-    OUTPUTFILENAME=&quot;LLIntAssembly.h&quot;
-fi
</del><ins>+OUTPUTFILENAME=&quot;LowLevelInterpreterWin.asm&quot;
</ins><span class="cx"> 
</span><span class="cx"> /usr/bin/env ruby &quot;${SRCROOT}/offlineasm/asm.rb&quot; &quot;-I.&quot; &quot;${SRCROOT}/llint/LowLevelInterpreter.asm&quot; &quot;${BUILT_PRODUCTS_DIR}/LLIntOffsetsExtractor/LLIntOffsetsExtractor${3}.exe&quot; &quot;${OUTPUTFILENAME}&quot; || exit 1
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojjscjscCommonprops"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/jsc/jscCommon.props (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/jsc/jscCommon.props        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/jsc/jscCommon.props        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -16,6 +16,7 @@
</span><span class="cx">       &lt;ModuleDefinitionFile&gt;
</span><span class="cx">       &lt;/ModuleDefinitionFile&gt;
</span><span class="cx">       &lt;SubSystem&gt;Console&lt;/SubSystem&gt;
</span><ins>+      &lt;StackReserveSize&gt;2097152&lt;/StackReserveSize&gt;
</ins><span class="cx">     &lt;/Link&gt;
</span><span class="cx">   &lt;/ItemDefinitionGroup&gt;
</span><span class="cx">   &lt;ItemGroup /&gt;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerMacroAssemblerX86_64h"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -153,8 +153,33 @@
</span><span class="cx"> 
</span><span class="cx">     Call call()
</span><span class="cx">     {
</span><ins>+#if OS(WINDOWS)
+        // JIT relies on the CallerFrame (frame pointer) being put on the stack,
+        // On Win64 we need to manually copy the frame pointer to the stack, since MSVC may not maintain a frame pointer on 64-bit.
+        // See http://msdn.microsoft.com/en-us/library/9z1stfyw.aspx where it's stated that rbp MAY be used as a frame pointer.
+        store64(X86Registers::ebp, Address(X86Registers::esp, -16));
+
+        // On Windows we need to copy the arguments that don't fit in registers to the stack location where the callee expects to find them.
+        // We don't know the number of arguments at this point, so the arguments (5, 6, ...) should always be copied.
+
+        // Copy argument 5
+        load64(Address(X86Registers::esp, 4 * sizeof(int64_t)), scratchRegister);
+        store64(scratchRegister, Address(X86Registers::esp, -4 * sizeof(int64_t)));
+
+        // Copy argument 6
+        load64(Address(X86Registers::esp, 5 * sizeof(int64_t)), scratchRegister);
+        store64(scratchRegister, Address(X86Registers::esp, -3 * sizeof(int64_t)));
+
+        // We also need to allocate the shadow space on the stack for the 4 parameter registers.
+        // Also, we should allocate 16 bytes for the frame pointer, and return address (not populated).
+        // In addition, we need to allocate 16 bytes for two more parameters, since the call can have up to 6 parameters.
+        sub64(TrustedImm32(8 * sizeof(int64_t)), X86Registers::esp);
+#endif
</ins><span class="cx">         DataLabelPtr label = moveWithPatch(TrustedImmPtr(0), scratchRegister);
</span><span class="cx">         Call result = Call(m_assembler.call(scratchRegister), Call::Linkable);
</span><ins>+#if OS(WINDOWS)
+        add64(TrustedImm32(8 * sizeof(int64_t)), X86Registers::esp);
+#endif
</ins><span class="cx">         ASSERT_UNUSED(label, differenceBetween(label, result) == REPTACH_OFFSET_CALL_R11);
</span><span class="cx">         return result;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitJITStubsMSVC64asm"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm (0 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm                                (rev 0)
+++ trunk/Source/JavaScriptCore/jit/JITStubsMSVC64.asm        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -0,0 +1,44 @@
</span><ins>+;/*
+; Copyright (C) 2014 Apple Inc. All rights reserved.
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions
+; are met:
+; 1. Redistributions of source code must retain the above copyright
+;    notice, this list of conditions and the following disclaimer.
+; 2. Redistributions in binary form must reproduce the above copyright
+;    notice, this list of conditions and the following disclaimer in the
+;    documentation and/or other materials provided with the distribution.
+;
+; THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+; PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+; OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+;*/
+
+EXTERN getHostCallReturnValueWithExecState : near
+
+PUBLIC getHostCallReturnValue
+
+_TEXT   SEGMENT
+
+getHostCallReturnValue PROC
+    mov rcx, rbp
+    ; Allocate space for all 4 parameter registers, and align stack pointer to 16 bytes boundary by allocating another 8 bytes.
+    ; The stack alignment is needed to fix a crash in the CRT library on a floating point instruction.
+    sub rsp, 40
+    call getHostCallReturnValueWithExecState
+    add rsp, 40
+    ret
+getHostCallReturnValue ENDP
+
+_TEXT   ENDS
+
+END
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorejitRepatchcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/Repatch.cpp (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/Repatch.cpp        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/jit/Repatch.cpp        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -1082,8 +1082,13 @@
</span><span class="cx">     ASSERT(oldStructure-&gt;typeInfo().type() == structure-&gt;typeInfo().type());
</span><span class="cx">     ASSERT(oldStructure-&gt;typeInfo().inlineTypeFlags() == structure-&gt;typeInfo().inlineTypeFlags());
</span><span class="cx">     ASSERT(oldStructure-&gt;indexingType() == structure-&gt;indexingType());
</span><del>-    stubJit.store32(MacroAssembler::TrustedImm32(reinterpret_cast&lt;uint32_t&gt;(structure-&gt;id())), MacroAssembler::Address(baseGPR, JSCell::structureIDOffset()));
</del><span class="cx"> #if USE(JSVALUE64)
</span><ins>+    uint32_t val = structure-&gt;id();
+#else
+    uint32_t val = reinterpret_cast&lt;uint32_t&gt;(structure-&gt;id());
+#endif
+    stubJit.store32(MacroAssembler::TrustedImm32(val), MacroAssembler::Address(baseGPR, JSCell::structureIDOffset()));
+#if USE(JSVALUE64)
</ins><span class="cx">     if (isInlineOffset(slot.cachedOffset()))
</span><span class="cx">         stubJit.store64(valueGPR, MacroAssembler::Address(baseGPR, JSObject::offsetOfInlineStorage() + offsetInInlineStorage(slot.cachedOffset()) * sizeof(JSValue)));
</span><span class="cx">     else {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitThunkGeneratorscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -315,14 +315,15 @@
</span><span class="cx">     // Host function signature: f(ExecState*);
</span><span class="cx">     jit.move(JSInterfaceJIT::callFrameRegister, X86Registers::ecx);
</span><span class="cx"> 
</span><del>-    // Leave space for the callee parameter home addresses and align the stack.
-    jit.subPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t) + 16 - sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister);
</del><ins>+    // Leave space for the callee parameter home addresses.
+    // At this point the stack is aligned to 16 bytes, but if this changes at some point, we need to emit code to align it.
+    jit.subPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister);
</ins><span class="cx"> 
</span><span class="cx">     jit.emitGetFromCallFrameHeaderPtr(JSStack::Callee, X86Registers::edx);
</span><span class="cx">     jit.loadPtr(JSInterfaceJIT::Address(X86Registers::edx, JSFunction::offsetOfExecutable()), X86Registers::r9);
</span><span class="cx">     jit.call(JSInterfaceJIT::Address(X86Registers::r9, executableOffsetToFunction));
</span><span class="cx"> 
</span><del>-    jit.addPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t) + 16 - sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister);
</del><ins>+    jit.addPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #elif CPU(ARM64)
</span><span class="lines">@@ -398,12 +399,18 @@
</span><span class="cx">     jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::callFrameRegister), JSInterfaceJIT::regT0);
</span><span class="cx">     jit.push(JSInterfaceJIT::regT0);
</span><span class="cx"> #else
</span><ins>+#if OS(WINDOWS)
+    // Allocate space on stack for the 4 parameter registers.
+    jit.subPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister);
+#endif
</ins><span class="cx">     jit.loadPtr(JSInterfaceJIT::Address(JSInterfaceJIT::callFrameRegister), JSInterfaceJIT::argumentGPR0);
</span><span class="cx"> #endif
</span><span class="cx">     jit.move(JSInterfaceJIT::TrustedImmPtr(FunctionPtr(operationVMHandleException).value()), JSInterfaceJIT::regT3);
</span><span class="cx">     jit.call(JSInterfaceJIT::regT3);
</span><span class="cx"> #if CPU(X86) &amp;&amp; USE(JSVALUE32_64)
</span><span class="cx">     jit.addPtr(JSInterfaceJIT::TrustedImm32(16), JSInterfaceJIT::stackPointerRegister);
</span><ins>+#elif OS(WINDOWS)
+    jit.addPtr(JSInterfaceJIT::TrustedImm32(4 * sizeof(int64_t)), JSInterfaceJIT::stackPointerRegister);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     jit.jumpToExceptionHandler();
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntData.cpp (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntData.cpp        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/llint/LLIntData.cpp        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -123,12 +123,14 @@
</span><span class="cx">     ASSERT(ValueUndefined == (TagBitTypeOther | TagBitUndefined));
</span><span class="cx">     ASSERT(ValueNull == TagBitTypeOther);
</span><span class="cx"> #endif
</span><del>-#if CPU(X86_64) || CPU(ARM64) || !ENABLE(JIT)
</del><ins>+#if (CPU(X86_64) &amp;&amp; !OS(WINDOWS)) || CPU(ARM64) || !ENABLE(JIT)
</ins><span class="cx">     ASSERT(!maxFrameExtentForSlowPathCall);
</span><span class="cx"> #elif CPU(ARM) || CPU(SH4)
</span><span class="cx">     ASSERT(maxFrameExtentForSlowPathCall == 24);
</span><span class="cx"> #elif CPU(X86) || CPU(MIPS)
</span><span class="cx">     ASSERT(maxFrameExtentForSlowPathCall == 40);
</span><ins>+#elif CPU(X86_64) &amp;&amp; OS(WINDOWS)
+    ASSERT(maxFrameExtentForSlowPathCall == 64);
</ins><span class="cx"> #endif
</span><span class="cx">     ASSERT(StringType == 5);
</span><span class="cx">     ASSERT(ObjectType == 18);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLLIntOfflineAsmConfigh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> #define OFFLINE_ASM_ARMv7_TRADITIONAL 0
</span><span class="cx"> #define OFFLINE_ASM_ARM64 0
</span><span class="cx"> #define OFFLINE_ASM_X86_64 0
</span><ins>+#define OFFLINE_ASM_X86_64_WIN 0
</ins><span class="cx"> #define OFFLINE_ASM_ARMv7s 0
</span><span class="cx"> #define OFFLINE_ASM_MIPS 0
</span><span class="cx"> #define OFFLINE_ASM_SH4 0
</span><span class="lines">@@ -84,12 +85,18 @@
</span><span class="cx"> #define OFFLINE_ASM_ARM 0
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-#if CPU(X86_64)
</del><ins>+#if CPU(X86_64) &amp;&amp; !PLATFORM(WIN)
</ins><span class="cx"> #define OFFLINE_ASM_X86_64 1
</span><span class="cx"> #else
</span><span class="cx"> #define OFFLINE_ASM_X86_64 0
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if CPU(X86_64) &amp;&amp; PLATFORM(WIN)
+#define OFFLINE_ASM_X86_64_WIN 1
+#else
+#define OFFLINE_ASM_X86_64_WIN 0
+#endif
+
</ins><span class="cx"> #if CPU(MIPS)
</span><span class="cx"> #define OFFLINE_ASM_MIPS 1
</span><span class="cx"> #else
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -84,6 +84,8 @@
</span><span class="cx"> const maxFrameExtentForSlowPathCall = 40
</span><span class="cx"> elsif MIPS
</span><span class="cx"> const maxFrameExtentForSlowPathCall = 40
</span><ins>+elsif X86_64_WIN
+const maxFrameExtentForSlowPathCall = 64
</ins><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> # Watchpoint states
</span><span class="lines">@@ -248,7 +250,7 @@
</span><span class="cx">     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
</span><span class="cx">         push lr
</span><span class="cx">         push cfr
</span><del>-    elsif X86 or X86_WIN or X86_64
</del><ins>+    elsif X86 or X86_WIN or X86_64 or X86_64_WIN
</ins><span class="cx">         push cfr
</span><span class="cx">     elsif ARM64
</span><span class="cx">         pushLRAndFP
</span><span class="lines">@@ -263,7 +265,7 @@
</span><span class="cx">     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
</span><span class="cx">         pop cfr
</span><span class="cx">         pop lr
</span><del>-    elsif X86 or X86_WIN or X86_64
</del><ins>+    elsif X86 or X86_WIN or X86_64 or X86_64_WIN
</ins><span class="cx">         pop cfr
</span><span class="cx">     elsif ARM64
</span><span class="cx">         popLRAndFP
</span><span class="lines">@@ -274,7 +276,7 @@
</span><span class="cx">     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or ARM64 or MIPS or SH4
</span><span class="cx">         # In C_LOOP case, we're only preserving the bytecode vPC.
</span><span class="cx">         move lr, destinationRegister
</span><del>-    elsif X86 or X86_WIN or X86_64
</del><ins>+    elsif X86 or X86_WIN or X86_64 or X86_64_WIN
</ins><span class="cx">         pop destinationRegister
</span><span class="cx">     else
</span><span class="cx">         error
</span><span class="lines">@@ -285,7 +287,7 @@
</span><span class="cx">     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or ARM64 or MIPS or SH4
</span><span class="cx">         # In C_LOOP case, we're only restoring the bytecode vPC.
</span><span class="cx">         move sourceRegister, lr
</span><del>-    elsif X86 or X86_WIN or X86_64
</del><ins>+    elsif X86 or X86_WIN or X86_64 or X86_64_WIN
</ins><span class="cx">         push sourceRegister
</span><span class="cx">     else
</span><span class="cx">         error
</span><span class="lines">@@ -293,7 +295,7 @@
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> macro functionPrologue()
</span><del>-    if X86 or X86_WIN or X86_64
</del><ins>+    if X86 or X86_WIN or X86_64 or X86_64_WIN
</ins><span class="cx">         push cfr
</span><span class="cx">     elsif ARM64
</span><span class="cx">         pushLRAndFP
</span><span class="lines">@@ -305,7 +307,7 @@
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> macro functionEpilogue()
</span><del>-    if X86 or X86_WIN or X86_64
</del><ins>+    if X86 or X86_WIN or X86_64 or X86_64_WIN
</ins><span class="cx">         pop cfr
</span><span class="cx">     elsif ARM64
</span><span class="cx">         popLRAndFP
</span><span class="lines">@@ -316,7 +318,7 @@
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> macro callToJavaScriptPrologue()
</span><del>-    if X86_64
</del><ins>+    if X86_64 or X86_64_WIN
</ins><span class="cx">         push cfr
</span><span class="cx">         push t0
</span><span class="cx">     elsif X86 or X86_WIN
</span><span class="lines">@@ -371,7 +373,7 @@
</span><span class="cx">     end
</span><span class="cx"> 
</span><span class="cx">     popCalleeSaves
</span><del>-    if X86_64
</del><ins>+    if X86_64 or X86_64_WIN
</ins><span class="cx">         pop t2
</span><span class="cx">         pop cfr
</span><span class="cx">     elsif X86 or X86_WIN
</span><span class="lines">@@ -656,6 +658,10 @@
</span><span class="cx">         const vm = t4
</span><span class="cx">         const address = t1
</span><span class="cx">         const zeroValue = t0
</span><ins>+    elsif X86_64_WIN
+        const vm = t2
+        const address = t1
+        const zeroValue = t0
</ins><span class="cx">     elsif X86 or X86_WIN
</span><span class="cx">         const vm = t2
</span><span class="cx">         const address = t1
</span><span class="lines">@@ -692,7 +698,7 @@
</span><span class="cx">     crash()
</span><span class="cx"> else
</span><span class="cx"> macro initPCRelative(pcBase)
</span><del>-    if X86_64
</del><ins>+    if X86_64 or X86_64_WIN
</ins><span class="cx">         call _relativePCBase
</span><span class="cx">     _relativePCBase:
</span><span class="cx">         pop pcBase
</span><span class="lines">@@ -725,6 +731,10 @@
</span><span class="cx">         leap (label - _relativePCBase)[t1], t0
</span><span class="cx">         move index, t2
</span><span class="cx">         storep t0, [t4, t2, 8]
</span><ins>+    elsif X86_64_WIN
+        leap (label - _relativePCBase)[t1], t0
+        move index, t4
+        storep t0, [t2, t4, 8]
</ins><span class="cx">     elsif X86 or X86_WIN
</span><span class="cx">         leap (label - _relativePCBase)[t1], t0
</span><span class="cx">         move index, t2
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -57,6 +57,24 @@
</span><span class="cx">         move arg1, t4
</span><span class="cx">         move arg2, t5
</span><span class="cx">         call function
</span><ins>+    elsif X86_64_WIN
+        # Note: this implementation is only correct if the return type size is &gt; 8 bytes.
+        # See macro cCall2Void for an implementation when the return type &lt;= 8 bytes.
+        # On Win64, when the return type is larger than 8 bytes, we need to allocate space on the stack for the return value.
+        # On entry rcx (t2), should contain a pointer to this stack space. The other parameters are shifted to the right,
+        # rdx (t1) should contain the first argument, and r8 (t6) should contain the second argument.
+        # On return, rax contains a pointer to this stack value, and we then need to copy the 16 byte return value into rax (t0) and rdx (t1)
+        # since the return value is expected to be split between the two.
+        # See http://msdn.microsoft.com/en-us/library/7572ztz4.aspx
+        move arg1, t1
+        move arg2, t6
+        subp 48, sp
+        move sp, t2
+        addp 32, t2
+        call function
+        addp 48, sp
+        move 8[t0], t1
+        move [t0], t0
</ins><span class="cx">     elsif ARM64
</span><span class="cx">         move arg1, t0
</span><span class="cx">         move arg2, t1
</span><span class="lines">@@ -71,6 +89,17 @@
</span><span class="cx"> macro cCall2Void(function, arg1, arg2)
</span><span class="cx">     if C_LOOP
</span><span class="cx">         cloopCallSlowPathVoid function, arg1, arg2
</span><ins>+    elsif X86_64_WIN
+        # Note: we cannot use the cCall2 macro for Win64 in this case,
+        # as the Win64 cCall2 implemenation is only correct when the return type size is &gt; 8 bytes.
+        # On Win64, rcx and rdx are used for passing the first two parameters.
+        # We also need to make room on the stack for all four parameter registers.
+        # See http://msdn.microsoft.com/en-us/library/ms235286.aspx
+        move arg2, t1
+        move arg1, t2
+        subp 32, sp 
+        call function
+        addp 32, sp 
</ins><span class="cx">     else
</span><span class="cx">         cCall2(function, arg1, arg2)
</span><span class="cx">     end
</span><span class="lines">@@ -85,6 +114,17 @@
</span><span class="cx">         move arg3, t1
</span><span class="cx">         move arg4, t2
</span><span class="cx">         call function
</span><ins>+    elsif X86_64_WIN
+        # On Win64, rcx, rdx, r8, and r9 are used for passing the first four parameters.
+        # We also need to make room on the stack for all four parameter registers.
+        # See http://msdn.microsoft.com/en-us/library/ms235286.aspx
+        move arg1, t2
+        move arg2, t1
+        move arg3, t6
+        move arg4, t7
+        subp 32, sp 
+        call function
+        addp 32, sp 
</ins><span class="cx">     elsif ARM64
</span><span class="cx">         move arg1, t0
</span><span class="cx">         move arg2, t1
</span><span class="lines">@@ -109,6 +149,16 @@
</span><span class="cx">         const temp1 = t0
</span><span class="cx">         const temp2 = t3
</span><span class="cx">         const temp3 = t6
</span><ins>+    elsif X86_64_WIN
+        const entry = t2
+        const vm = t1
+        const protoCallFrame = t6
+
+        const previousCFR = t0
+        const previousPC = t4
+        const temp1 = t0
+        const temp2 = t3
+        const temp3 = t7
</ins><span class="cx">     elsif ARM64 or C_LOOP
</span><span class="cx">         const entry = a0
</span><span class="cx">         const vm = a1
</span><span class="lines">@@ -126,6 +176,10 @@
</span><span class="cx">     if X86_64
</span><span class="cx">         loadp 7*8[sp], previousPC
</span><span class="cx">         move 6*8[sp], previousCFR
</span><ins>+    elsif X86_64_WIN
+        # Win64 pushes two more registers
+        loadp 9*8[sp], previousPC
+        move 8*8[sp], previousCFR
</ins><span class="cx">     elsif ARM64
</span><span class="cx">         move cfr, previousCFR
</span><span class="cx">     end
</span><span class="lines">@@ -142,10 +196,7 @@
</span><span class="cx">     loadp VM::topCallFrame[vm], temp2
</span><span class="cx">     storep temp2, ScopeChain[cfr]
</span><span class="cx">     storep 1, CodeBlock[cfr]
</span><del>-    if X86_64
-        loadp 7*8[sp], previousPC
-        loadp 6*8[sp], previousCFR
-    end
</del><ins>+
</ins><span class="cx">     storep previousPC, ReturnPC[cfr]
</span><span class="cx">     storep previousCFR, CallerFrame[cfr]
</span><span class="cx"> 
</span><span class="lines">@@ -238,7 +289,7 @@
</span><span class="cx"> 
</span><span class="cx">     checkStackPointerAlignment(temp3, 0xbad0dc04)
</span><span class="cx"> 
</span><del>-    if X86_64
</del><ins>+    if X86_64 or X86_64_WIN
</ins><span class="cx">         pop t5
</span><span class="cx">     end
</span><span class="cx">     callToJavaScriptEpilogue()
</span><span class="lines">@@ -262,6 +313,8 @@
</span><span class="cx">     move entry, temp
</span><span class="cx">     if X86_64
</span><span class="cx">         move sp, t4
</span><ins>+    elsif X86_64_WIN
+        move sp, t2
</ins><span class="cx">     elsif ARM64 or C_LOOP
</span><span class="cx">         move sp, a0
</span><span class="cx">     end
</span><span class="lines">@@ -269,8 +322,18 @@
</span><span class="cx">         storep cfr, [sp]
</span><span class="cx">         storep lr, 8[sp]
</span><span class="cx">         cloopCallNative temp
</span><ins>+    elsif X86_64_WIN
+        # For a host function call, JIT relies on that the CallerFrame (frame pointer) is put on the stack,
+        # On Win64 we need to manually copy the frame pointer to the stack, since MSVC may not maintain a frame pointer on 64-bit.
+        # See http://msdn.microsoft.com/en-us/library/9z1stfyw.aspx where it's stated that rbp MAY be used as a frame pointer.
+        storep cfr, [sp]
+
+        # We need to allocate 32 bytes on the stack for the shadow space.
+        subp 32, sp
+        call temp
+        addp 32, sp
</ins><span class="cx">     else
</span><del>-        addp 16, sp 
</del><ins>+        addp 16, sp
</ins><span class="cx">         call temp
</span><span class="cx">         subp 16, sp
</span><span class="cx">     end
</span><span class="lines">@@ -957,7 +1020,7 @@
</span><span class="cx"> 
</span><span class="cx"> _llint_op_div:
</span><span class="cx">     traceExecution()
</span><del>-    if X86_64
</del><ins>+    if X86_64 or X86_64_WIN
</ins><span class="cx">         binaryOpCustomStore(
</span><span class="cx">             macro (left, right, slow, index)
</span><span class="cx">                 # Assume t3 is scratchable.
</span><span class="lines">@@ -1968,7 +2031,16 @@
</span><span class="cx"> 
</span><span class="cx">     functionPrologue()
</span><span class="cx">     storep 0, CodeBlock[cfr]
</span><del>-    if X86_64
</del><ins>+    if X86_64 or X86_64_WIN
+        if X86_64
+            const arg1 = t4  # t4 = rdi
+            const arg2 = t5  # t5 = rsi
+            const temp = t1
+        elsif X86_64_WIN
+            const arg1 = t2  # t2 = rcx
+            const arg2 = t1  # t1 = rdx
+            const temp = t0
+        end
</ins><span class="cx">         loadp ScopeChain[cfr], t0
</span><span class="cx">         andp MarkedBlockMask, t0
</span><span class="cx">         loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t0], t0
</span><span class="lines">@@ -1976,11 +2048,17 @@
</span><span class="cx">         loadp CallerFrame[cfr], t0
</span><span class="cx">         loadq ScopeChain[t0], t1
</span><span class="cx">         storeq t1, ScopeChain[cfr]
</span><del>-        move cfr, t4  # t4 = rdi
-        loadp Callee[cfr], t5 # t5 = rsi
-        loadp JSFunction::m_executable[t5], t1
</del><ins>+        move cfr, arg1
+        loadp Callee[cfr], arg2
+        loadp JSFunction::m_executable[arg2], temp
</ins><span class="cx">         checkStackPointerAlignment(t3, 0xdead0001)
</span><del>-        call executableOffsetToFunction[t1]
</del><ins>+        if X86_64_WIN
+            subp 32, sp
+        end
+        call executableOffsetToFunction[temp]
+        if X86_64_WIN
+            addp 32, sp
+        end
</ins><span class="cx">         loadp ScopeChain[cfr], t3
</span><span class="cx">         andp MarkedBlockMask, t3
</span><span class="cx">         loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmasmrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/asm.rb (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/asm.rb        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/offlineasm/asm.rb        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -262,7 +262,7 @@
</span><span class="cx">             @codeOrigin = nil
</span><span class="cx">             @commentState = :many
</span><span class="cx">         when :many
</span><del>-            @outp.puts &quot;// #{text}&quot; if $enableCodeOriginComments
</del><ins>+            @outp.puts $commentPrefix + &quot; #{text}&quot; if $enableCodeOriginComments
</ins><span class="cx">         else
</span><span class="cx">             raise
</span><span class="cx">         end
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmbackendsrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/backends.rb (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/backends.rb        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/offlineasm/backends.rb        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx">      &quot;X86&quot;,
</span><span class="cx">      &quot;X86_WIN&quot;,
</span><span class="cx">      &quot;X86_64&quot;,
</span><ins>+     &quot;X86_64_WIN&quot;,
</ins><span class="cx">      &quot;ARM&quot;,
</span><span class="cx">      &quot;ARMv7&quot;,
</span><span class="cx">      &quot;ARMv7_TRADITIONAL&quot;,
</span><span class="lines">@@ -54,6 +55,7 @@
</span><span class="cx">      &quot;X86&quot;,
</span><span class="cx">      &quot;X86_WIN&quot;,
</span><span class="cx">      &quot;X86_64&quot;,
</span><ins>+     &quot;X86_64_WIN&quot;,
</ins><span class="cx">      &quot;ARM&quot;,
</span><span class="cx">      &quot;ARMv7&quot;,
</span><span class="cx">      &quot;ARMv7_TRADITIONAL&quot;,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmsettingsrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/settings.rb (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/settings.rb        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/offlineasm/settings.rb        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -177,7 +177,9 @@
</span><span class="cx">     if !$emitWinAsm
</span><span class="cx">         $output.puts cppSettingsTest(concreteSettings)
</span><span class="cx">     else
</span><del>-        $output.puts &quot;.MODEL FLAT, C&quot;
</del><ins>+        if backend == &quot;X86_WIN&quot;
+            $output.puts &quot;.MODEL FLAT, C&quot;
+        end
</ins><span class="cx">         $output.puts &quot;INCLUDE #{File.basename($output.path)}.sym&quot;
</span><span class="cx">         $output.puts &quot;_TEXT SEGMENT&quot;
</span><span class="cx">     end
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmx86rb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/x86.rb (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/x86.rb        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/JavaScriptCore/offlineasm/x86.rb        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -32,6 +32,8 @@
</span><span class="cx">         false
</span><span class="cx">     when &quot;X86_64&quot;
</span><span class="cx">         true
</span><ins>+    when &quot;X86_64_WIN&quot;
+        true
</ins><span class="cx">     else
</span><span class="cx">         raise &quot;bad value for $activeBackend: #{$activeBackend}&quot;
</span><span class="cx">     end
</span><span class="lines">@@ -45,6 +47,8 @@
</span><span class="cx">         true
</span><span class="cx">     when &quot;X86_64&quot;
</span><span class="cx">         false
</span><ins>+    when &quot;X86_64_WIN&quot;
+        false
</ins><span class="cx">     else
</span><span class="cx">         raise &quot;bad value for $activeBackend: #{$activeBackend}&quot;
</span><span class="cx">     end
</span><span class="lines">@@ -100,11 +104,13 @@
</span><span class="cx">     when :int
</span><span class="cx">         size = &quot;dword&quot;
</span><span class="cx">     when :ptr
</span><del>-        size = &quot;dword&quot;
</del><ins>+        size =  isX64 ? &quot;qword&quot; : &quot;dword&quot;
</ins><span class="cx">     when :double
</span><span class="cx">         size = &quot;qword&quot;
</span><ins>+    when :quad
+        size = &quot;qword&quot;
</ins><span class="cx">     else
</span><del>-        raise
</del><ins>+        raise &quot;Invalid kind #{kind}&quot;
</ins><span class="cx">     end
</span><span class="cx"> 
</span><span class="cx">     return size + &quot; &quot; + &quot;ptr&quot; + &quot; &quot;;
</span><span class="lines">@@ -116,13 +122,13 @@
</span><span class="cx">         raise unless isX64
</span><span class="cx">         case kind
</span><span class="cx">         when :half
</span><del>-            &quot;%&quot; + @name + &quot;w&quot;
</del><ins>+            register(@name + &quot;w&quot;)
</ins><span class="cx">         when :int
</span><del>-            &quot;%&quot; + @name + &quot;d&quot;
</del><ins>+            register(@name + &quot;d&quot;)
</ins><span class="cx">         when :ptr
</span><del>-            &quot;%&quot; + @name
</del><ins>+            register(@name)
</ins><span class="cx">         when :quad
</span><del>-            &quot;%&quot; + @name
</del><ins>+            register(@name)
</ins><span class="cx">         else
</span><span class="cx">             raise
</span><span class="cx">         end
</span><span class="lines">@@ -284,49 +290,49 @@
</span><span class="cx">             raise &quot;Cannot use #{name} in 32-bit X86 at #{codeOriginString}&quot; unless isX64
</span><span class="cx">             case kind
</span><span class="cx">             when :half
</span><del>-                &quot;%r8w&quot;
</del><ins>+                register(&quot;r8w&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%r8d&quot;
</del><ins>+                register(&quot;r8d&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                &quot;%r8&quot;
</del><ins>+                register(&quot;r8&quot;)
</ins><span class="cx">             when :quad
</span><del>-                &quot;%r8&quot;
</del><ins>+                register(&quot;r8&quot;)
</ins><span class="cx">             end
</span><span class="cx">         when &quot;t7&quot;
</span><span class="cx">             raise &quot;Cannot use #{name} in 32-bit X86 at #{codeOriginString}&quot; unless isX64
</span><span class="cx">             case kind
</span><span class="cx">             when :half
</span><del>-                &quot;%r9w&quot;
</del><ins>+                register(&quot;r9w&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%r9d&quot;
</del><ins>+                register(&quot;r9d&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                &quot;%r9&quot;
</del><ins>+                register(&quot;r9&quot;)
</ins><span class="cx">             when :quad
</span><del>-                &quot;%r9&quot;
</del><ins>+                register(&quot;r9&quot;)
</ins><span class="cx">             end
</span><span class="cx">         when &quot;csr1&quot;
</span><span class="cx">             raise &quot;Cannot use #{name} in 32-bit X86 at #{codeOriginString}&quot; unless isX64
</span><span class="cx">             case kind
</span><span class="cx">             when :half
</span><del>-                &quot;%r14w&quot;
</del><ins>+                register(&quot;r14w&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%r14d&quot;
</del><ins>+                register(&quot;r14d&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                &quot;%r14&quot;
</del><ins>+                register(&quot;r14&quot;)
</ins><span class="cx">             when :quad
</span><del>-                &quot;%r14&quot;
</del><ins>+                register(&quot;r14&quot;)
</ins><span class="cx">             end
</span><span class="cx">         when &quot;csr2&quot;
</span><span class="cx">             raise &quot;Cannot use #{name} in 32-bit X86 at #{codeOriginString}&quot; unless isX64
</span><span class="cx">             case kind
</span><span class="cx">             when :half
</span><del>-                &quot;%r15w&quot;
</del><ins>+                register(&quot;r15w&quot;)
</ins><span class="cx">             when :int
</span><del>-                &quot;%r15d&quot;
</del><ins>+                register(&quot;r15d&quot;)
</ins><span class="cx">             when :ptr
</span><del>-                &quot;%r15&quot;
</del><ins>+                register(&quot;r15&quot;)
</ins><span class="cx">             when :quad
</span><del>-                &quot;%r15&quot;
</del><ins>+                register(&quot;r15&quot;)
</ins><span class="cx">             end
</span><span class="cx">         else
</span><span class="cx">             raise &quot;Bad register #{name} for X86 at #{codeOriginString}&quot;
</span><span class="lines">@@ -343,17 +349,17 @@
</span><span class="cx">         raise if useX87
</span><span class="cx">         case name
</span><span class="cx">         when &quot;ft0&quot;, &quot;fa0&quot;, &quot;fr&quot;
</span><del>-            &quot;%xmm0&quot;
</del><ins>+            register(&quot;xmm0&quot;)
</ins><span class="cx">         when &quot;ft1&quot;, &quot;fa1&quot;
</span><del>-            &quot;%xmm1&quot;
</del><ins>+            register(&quot;xmm1&quot;)
</ins><span class="cx">         when &quot;ft2&quot;, &quot;fa2&quot;
</span><del>-            &quot;%xmm2&quot;
</del><ins>+            register(&quot;xmm2&quot;)
</ins><span class="cx">         when &quot;ft3&quot;, &quot;fa3&quot;
</span><del>-            &quot;%xmm3&quot;
</del><ins>+            register(&quot;xmm3&quot;)
</ins><span class="cx">         when &quot;ft4&quot;
</span><del>-            &quot;%xmm4&quot;
</del><ins>+            register(&quot;xmm4&quot;)
</ins><span class="cx">         when &quot;ft5&quot;
</span><del>-            &quot;%xmm5&quot;
</del><ins>+            register(&quot;xmm5&quot;)
</ins><span class="cx">         else
</span><span class="cx">             raise &quot;Bad register #{name} for X86 at #{codeOriginString}&quot;
</span><span class="cx">         end
</span><span class="lines">@@ -510,6 +516,9 @@
</span><span class="cx">         
</span><span class="cx">         return newList
</span><span class="cx">     end
</span><ins>+    def getModifiedListX86_64_WIN
+        getModifiedListX86_64
+    end
</ins><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> class Instruction
</span><span class="lines">@@ -604,9 +613,9 @@
</span><span class="cx">         else
</span><span class="cx">             case mode
</span><span class="cx">             when :normal
</span><del>-                $asm.puts &quot;ucomisd #{operands[1].x86Operand(:double)}, #{operands[0].x86Operand(:double)}&quot;
</del><ins>+                $asm.puts &quot;ucomisd #{orderOperands(operands[1].x86Operand(:double), operands[0].x86Operand(:double))}&quot;
</ins><span class="cx">             when :reverse
</span><del>-                $asm.puts &quot;ucomisd #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:double)}&quot;
</del><ins>+                $asm.puts &quot;ucomisd #{orderOperands(operands[0].x86Operand(:double), operands[1].x86Operand(:double))}&quot;
</ins><span class="cx">             else
</span><span class="cx">                 raise mode.inspect
</span><span class="cx">             end
</span><span class="lines">@@ -848,6 +857,11 @@
</span><span class="cx">         lowerX86Common
</span><span class="cx">     end
</span><span class="cx"> 
</span><ins>+    def lowerX86_64_WIN
+        raise unless $activeBackend == &quot;X86_64_WIN&quot;
+        lowerX86Common
+    end
+
</ins><span class="cx">     def lowerX86Common
</span><span class="cx">         $asm.codeOrigin codeOriginString if $enableCodeOriginComments
</span><span class="cx">         $asm.annotation annotation if $enableInstrAnnotations
</span><span class="lines">@@ -919,7 +933,11 @@
</span><span class="cx">             $asm.puts &quot;mov#{x86Suffix(:int)} #{x86Operands(:int, :int)}&quot;
</span><span class="cx">         when &quot;loadis&quot;
</span><span class="cx">             if isX64
</span><del>-                $asm.puts &quot;movslq #{x86Operands(:int, :quad)}&quot;
</del><ins>+                if !isIntelSyntax
+                    $asm.puts &quot;movslq #{x86Operands(:int, :quad)}&quot;
+                else
+                    $asm.puts &quot;movsxd #{x86Operands(:int, :quad)}&quot;
+                end
</ins><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;mov#{x86Suffix(:int)} #{x86Operands(:int, :int)}&quot;
</span><span class="cx">             end
</span><span class="lines">@@ -1021,13 +1039,13 @@
</span><span class="cx">                 $asm.puts &quot;fild#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-4, sp.x86Operand(:ptr))}&quot;
</span><span class="cx">                 $asm.puts &quot;fstp #{operands[1].x87Operand(1)}&quot;
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;cvtsi2sd #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:double)}&quot;
</del><ins>+                $asm.puts &quot;cvtsi2sd #{orderOperands(operands[0].x86Operand(:int), operands[1].x86Operand(:double))}&quot;
</ins><span class="cx">             end
</span><span class="cx">         when &quot;bdeq&quot;
</span><span class="cx">             if useX87
</span><span class="cx">                 handleX87Compare(:normal)
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;ucomisd #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:double)}&quot;
</del><ins>+                $asm.puts &quot;ucomisd #{orderOperands(operands[0].x86Operand(:double), operands[1].x86Operand(:double))}&quot;
</ins><span class="cx">             end
</span><span class="cx">             if operands[0] == operands[1]
</span><span class="cx">                 # This is just a jump ordered, which is a jnp.
</span><span class="lines">@@ -1054,7 +1072,7 @@
</span><span class="cx">             if useX87
</span><span class="cx">                 handleX87Compare(:normal)
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;ucomisd #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:double)}&quot;
</del><ins>+                $asm.puts &quot;ucomisd #{orderOperands(operands[0].x86Operand(:double), operands[1].x86Operand(:double))}&quot;
</ins><span class="cx">             end
</span><span class="cx">             if operands[0] == operands[1]
</span><span class="cx">                 # This is just a jump unordered, which is a jp.
</span><span class="lines">@@ -1130,11 +1148,15 @@
</span><span class="cx">             }
</span><span class="cx">         when &quot;popCalleeSaves&quot;
</span><span class="cx">             if isX64
</span><del>-                $asm.puts &quot;pop %rbx&quot;
-                $asm.puts &quot;pop %r15&quot;
-                $asm.puts &quot;pop %r14&quot;
-                $asm.puts &quot;pop %r13&quot;
-                $asm.puts &quot;pop %r12&quot;
</del><ins>+                if isMSVC
+                    $asm.puts &quot;pop &quot; + register(&quot;rsi&quot;)
+                    $asm.puts &quot;pop &quot; + register(&quot;rdi&quot;)
+                end
+                $asm.puts &quot;pop &quot; + register(&quot;rbx&quot;)
+                $asm.puts &quot;pop &quot; + register(&quot;r15&quot;)
+                $asm.puts &quot;pop &quot; + register(&quot;r14&quot;)
+                $asm.puts &quot;pop &quot; + register(&quot;r13&quot;)
+                $asm.puts &quot;pop &quot; + register(&quot;r12&quot;)
</ins><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;pop &quot; + register(&quot;ebx&quot;)
</span><span class="cx">                 $asm.puts &quot;pop &quot; + register(&quot;edi&quot;)
</span><span class="lines">@@ -1142,11 +1164,15 @@
</span><span class="cx">             end
</span><span class="cx">         when &quot;pushCalleeSaves&quot;
</span><span class="cx">             if isX64
</span><del>-                $asm.puts &quot;push %r12&quot;
-                $asm.puts &quot;push %r13&quot;
-                $asm.puts &quot;push %r14&quot;
-                $asm.puts &quot;push %r15&quot;
-                $asm.puts &quot;push %rbx&quot;
</del><ins>+                $asm.puts &quot;push &quot; + register(&quot;r12&quot;)
+                $asm.puts &quot;push &quot; + register(&quot;r13&quot;)
+                $asm.puts &quot;push &quot; + register(&quot;r14&quot;)
+                $asm.puts &quot;push &quot; + register(&quot;r15&quot;)
+                $asm.puts &quot;push &quot; + register(&quot;rbx&quot;)
+                if isMSVC
+                    $asm.puts &quot;push &quot; + register(&quot;rdi&quot;)
+                    $asm.puts &quot;push &quot; + register(&quot;rsi&quot;)
+                end
</ins><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;push &quot; + register(&quot;esi&quot;)
</span><span class="cx">                 $asm.puts &quot;push &quot; + register(&quot;edi&quot;)
</span><span class="lines">@@ -1155,7 +1181,11 @@
</span><span class="cx">         when &quot;move&quot;
</span><span class="cx">             handleMove
</span><span class="cx">         when &quot;sxi2q&quot;
</span><del>-            $asm.puts &quot;movslq #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:quad)}&quot;
</del><ins>+            if !isIntelSyntax
+                $asm.puts &quot;movslq #{operands[0].x86Operand(:int)}, #{operands[1].x86Operand(:quad)}&quot;
+            else
+                $asm.puts &quot;movsxd #{orderOperands(operands[0].x86Operand(:int), operands[1].x86Operand(:quad))}&quot;
+            end
</ins><span class="cx">         when &quot;zxi2q&quot;
</span><span class="cx">             $asm.puts &quot;mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), operands[1].x86Operand(:int))}&quot;
</span><span class="cx">         when &quot;nop&quot;
</span><span class="lines">@@ -1441,7 +1471,7 @@
</span><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><del>-            $asm.puts &quot;idivl #{operands[0].x86Operand(:int)}&quot;
</del><ins>+            $asm.puts &quot;idiv#{x86Suffix(:int)} #{operands[0].x86Operand(:int)}&quot;
</ins><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><span class="lines">@@ -1479,7 +1509,13 @@
</span><span class="cx">                 $asm.puts &quot;fldl -8(#{sp.x86Operand(:ptr)})&quot;
</span><span class="cx">                 $asm.puts &quot;fstp #{operands[1].x87Operand(1)}&quot;
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;movq #{operands[0].x86Operand(:quad)}, #{operands[1].x86Operand(:double)}&quot;
</del><ins>+                if !isIntelSyntax
+                    $asm.puts &quot;movq #{operands[0].x86Operand(:quad)}, #{operands[1].x86Operand(:double)}&quot;
+                else
+                    # MASM does not accept register operands with movq.
+                    # Debugging shows that movd actually moves a qword when using MASM.
+                    $asm.puts &quot;movd #{operands[1].x86Operand(:double)}, #{operands[0].x86Operand(:quad)}&quot;
+                end
</ins><span class="cx">             end
</span><span class="cx">         when &quot;fd2q&quot;
</span><span class="cx">             if useX87
</span><span class="lines">@@ -1492,7 +1528,13 @@
</span><span class="cx">                 end
</span><span class="cx">                 $asm.puts &quot;movq -8(#{sp.x86Operand(:ptr)}), #{operands[1].x86Operand(:quad)}&quot;
</span><span class="cx">             else
</span><del>-                $asm.puts &quot;movq #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:quad)}&quot;
</del><ins>+                if !isIntelSyntax
+                    $asm.puts &quot;movq #{operands[0].x86Operand(:double)}, #{operands[1].x86Operand(:quad)}&quot;
+                else
+                    # MASM does not accept register operands with movq.
+                    # Debugging shows that movd actually moves a qword when using MASM.
+                    $asm.puts &quot;movd #{operands[1].x86Operand(:quad)}, #{operands[0].x86Operand(:double)}&quot;
+                end
</ins><span class="cx">             end
</span><span class="cx">         when &quot;bo&quot;
</span><span class="cx">             $asm.puts &quot;jo #{operands[0].asmLabel}&quot;
</span></span></pre></div>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/WTF/ChangeLog        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2014-06-25  peavo@outlook.com  &lt;peavo@outlook.com&gt;
+
+        [Win64] ASM LLINT is not enabled.
+        https://bugs.webkit.org/show_bug.cgi?id=130638
+
+        Reviewed by Mark Lam.
+
+        * wtf/Platform.h: Enable LLINT and JIT for Win64.
+
</ins><span class="cx"> 2014-06-25  Laszlo Gombos  &lt;l.gombos@samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove build guard for progress element
</span></span></pre></div>
<a id="trunkSourceWTFwtfPlatformh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Platform.h (170427 => 170428)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Platform.h        2014-06-25 15:09:10 UTC (rev 170427)
+++ trunk/Source/WTF/wtf/Platform.h        2014-06-25 16:37:19 UTC (rev 170428)
</span><span class="lines">@@ -640,8 +640,7 @@
</span><span class="cx"> #if !defined(ENABLE_JIT) \
</span><span class="cx">     &amp;&amp; (CPU(X86) || CPU(X86_64) || CPU(ARM) || CPU(ARM64) || CPU(MIPS)) \
</span><span class="cx">     &amp;&amp; !CPU(APPLE_ARMV7K)                                                           \
</span><del>-    &amp;&amp; !OS(WINCE) \
-    &amp;&amp; !(OS(WINDOWS) &amp;&amp; CPU(X86_64))
</del><ins>+    &amp;&amp; !OS(WINCE)
</ins><span class="cx"> #define ENABLE_JIT 1
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>