<!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>[214969] 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/214969">214969</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-04-05 14:00:17 -0700 (Wed, 05 Apr 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Do not use BLX for immediates (ARM-32)

https://bugs.webkit.org/show_bug.cgi?id=170351

Patch by Guilherme Iscaro &lt;iscaro@profusion.mobi&gt; on 2017-04-05
Reviewed by Mark Lam.

Currently the offline asm generator for 32-bit ARM code translates the
'call' meta-instruction (which may be found in LowLevelInterpreter.asm
and friends) to the ARM's BLX instrunction. The BLX instruction may be
used for labels (immediates) and registers and one side effect of BLX
is that it may switch the processor's instruction set.
A 'BLX register' instruction will change/remain the processor state to
ARM if the  register_bit[0] is set to 0 or change/remain to Thumb if
register_bit[0] is set to 1. However, a 'BLX label' instruction will
always switch the processor state. It switches ARM to thumb and vice-versa.
This behaviour is unwanted, since the C++ code and the offlineasm generated code
are both compiled using the same instruction set, thus a instruction
set change will likely produce a crash. In order to fix the problem the
BL instruction can be used for labels. It will branch just like BLX,
but it won't change the instruction set. It's important to note that
Darwin is not affected by this problem, thus to minimize the impact of
this change the BL instruction will only be used on non-darwin targets.

BLX reference: http://infocenter.arm.com/help/topic/com.arm.doc.dui0489i/CIHBJCDC.html?resultof=%22%62%6c%78%22%20

* offlineasm/arm.rb:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmarmrb">trunk/Source/JavaScriptCore/offlineasm/arm.rb</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (214968 => 214969)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2017-04-05 20:59:37 UTC (rev 214968)
+++ trunk/Source/JavaScriptCore/ChangeLog        2017-04-05 21:00:17 UTC (rev 214969)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2017-04-05  Guilherme Iscaro  &lt;iscaro@profusion.mobi&gt;
+
+        Do not use BLX for immediates (ARM-32)
+
+        https://bugs.webkit.org/show_bug.cgi?id=170351
+
+        Reviewed by Mark Lam.
+
+        Currently the offline asm generator for 32-bit ARM code translates the
+        'call' meta-instruction (which may be found in LowLevelInterpreter.asm
+        and friends) to the ARM's BLX instrunction. The BLX instruction may be
+        used for labels (immediates) and registers and one side effect of BLX
+        is that it may switch the processor's instruction set.
+        A 'BLX register' instruction will change/remain the processor state to
+        ARM if the  register_bit[0] is set to 0 or change/remain to Thumb if
+        register_bit[0] is set to 1. However, a 'BLX label' instruction will
+        always switch the processor state. It switches ARM to thumb and vice-versa.
+        This behaviour is unwanted, since the C++ code and the offlineasm generated code
+        are both compiled using the same instruction set, thus a instruction
+        set change will likely produce a crash. In order to fix the problem the
+        BL instruction can be used for labels. It will branch just like BLX,
+        but it won't change the instruction set. It's important to note that
+        Darwin is not affected by this problem, thus to minimize the impact of
+        this change the BL instruction will only be used on non-darwin targets.
+
+        BLX reference: http://infocenter.arm.com/help/topic/com.arm.doc.dui0489i/CIHBJCDC.html?resultof=%22%62%6c%78%22%20
+
+        * offlineasm/arm.rb:
+
</ins><span class="cx"> 2017-04-05  Keith Miller  &lt;keith_miller@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebAssembly: We shouldn't need to pin size registers if we have a fast memory.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreofflineasmarmrb"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/offlineasm/arm.rb (214968 => 214969)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/offlineasm/arm.rb        2017-04-05 20:59:37 UTC (rev 214968)
+++ trunk/Source/JavaScriptCore/offlineasm/arm.rb        2017-04-05 21:00:17 UTC (rev 214969)
</span><span class="lines">@@ -94,6 +94,7 @@
</span><span class="cx"> ARM_EXTRA_GPRS = [SpecialRegister.new(&quot;r6&quot;), SpecialRegister.new(&quot;r10&quot;), SpecialRegister.new(&quot;r12&quot;)]
</span><span class="cx"> ARM_EXTRA_FPRS = [SpecialRegister.new(&quot;d7&quot;)]
</span><span class="cx"> ARM_SCRATCH_FPR = SpecialRegister.new(&quot;d6&quot;)
</span><ins>+OS_DARWIN = ((RUBY_PLATFORM =~ /darwin/i) != nil)
</ins><span class="cx"> 
</span><span class="cx"> def armMoveImmediate(value, register)
</span><span class="cx">     # Currently we only handle the simple cases, and fall back to mov/movt for the complex ones.
</span><span class="lines">@@ -568,7 +569,11 @@
</span><span class="cx">             end
</span><span class="cx">         when &quot;call&quot;
</span><span class="cx">             if operands[0].label?
</span><del>-                $asm.puts &quot;blx #{operands[0].asmLabel}&quot;
</del><ins>+                if OS_DARWIN
+                    $asm.puts &quot;blx #{operands[0].asmLabel}&quot;
+                else
+                    $asm.puts &quot;bl #{operands[0].asmLabel}&quot;
+                end
</ins><span class="cx">             else
</span><span class="cx">                 $asm.puts &quot;blx #{operands[0].armOperand}&quot;
</span><span class="cx">             end
</span></span></pre>
</div>
</div>

</body>
</html>