<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style>
<!--
@font-face
        {font-family:"Cambria Math"}
@font-face
        {font-family:Calibri}
@font-face
        {font-family:"Book Antiqua"}
@font-face
        {font-family:Tahoma}
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif}
a:link, span.MsoHyperlink
        {color:#0563C1;
        text-decoration:underline}
a:visited, span.MsoHyperlinkFollowed
        {color:#954F72;
        text-decoration:underline}
span.EmailStyle17
        {font-family:"Book Antiqua",serif;
        color:#943634;
        font-weight:normal;
        font-style:normal;
        text-decoration:none none}
.MsoChpDefault
        {font-size:10.0pt}
@page WordSection1
        {margin:72.0pt 72.0pt 72.0pt 72.0pt}
-->
</style><style type="text/css" id="owaParaStyle"></style>
</head>
<body lang="EN-IE" link="#0563C1" vlink="#954F72" fpstyle="1" ocsi="0">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">Hi Martin,
<div><br>
</div>
<div>That does sound like a very similar problem. As far as I've been able to tell, only half the value is loaded and the other half is zeroed-out (resulting, in fact, in an invalid floating point number, which is trapped when the register is next used). However,
 whether the other half is zeroed specifically by whatever this error is, or if it's just that the two halves are swapped, I can't be sure because I'm not 100% sure about what the correct floating-point representation of the number actually should be.</div>
<div><br>
</div>
<div>Further, I still can't understand why the store and load makes the problem "go away".</div>
<div><br>
</div>
<div>This is on a sparc, not sparcel.</div>
<div><br>
</div>
<div>Chris.<br>
<div style="font-family: Times New Roman; color: #000000; font-size: 16px">
<hr tabindex="-1">
<div id="divRpF452726" style="direction: ltr;"><font face="Tahoma" size="2" color="#000000"><b>From:</b> Martin J. O'Riordan [martin.oriordan@movidius.com]<br>
<b>Sent:</b> 19 October 2016 23:18<br>
<b>To:</b> Chris.Dewhurst<br>
<b>Cc:</b> 'LLVM Developers'<br>
<b>Subject:</b> RE: [llvm-dev] [Sparc] vararg double issue on 32 bit Sparc processors<br>
</font><br>
</div>
<div></div>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634">Hi Chris,</span></p>
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634"> </span></p>
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634">Can I bring this in a bit closer to Leon - is this specifically to do with 64-bit FP transactions with memory?  The reason I ask is that I had similar problems adapting Sparc
 Leon 3 and 4 which are V8 Sparc, but with 64-bit memory bus transactions with the GCC compiler.  It “feels” like the same problem, but LLVM versus GCC.  In the GCC case, the 64-bit memory transaction had the register endian ordering the wrong way round; perhaps
 it is something similar in LLVM?</span></p>
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634"> </span></p>
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634">Are you doing this with “sparc” or “sparcel”?</span></p>
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634"> </span></p>
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634">Thanks, MartinO</span></p>
<p class="MsoNormal"><span style="font-family:"Book Antiqua",serif; color:#943634"> </span></p>
<div>
<div style="border:none; border-top:solid #E1E1E1 1.0pt; padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt; font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt; font-family:"Calibri",sans-serif"> llvm-dev [mailto:llvm-dev-bounces@lists.llvm.org]
<b>On Behalf Of </b>Chris.Dewhurst via llvm-dev<br>
<b>Sent:</b> 19 October 2016 22:27<br>
<b>To:</b> llvm-dev@lists.llvm.org<br>
<b>Subject:</b> [llvm-dev] [Sparc] vararg double issue on 32 bit Sparc processors</span></p>
</div>
</div>
<p class="MsoNormal"> </p>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">Hi,
</span></p>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">I've discovered a problem on Sparc processors (specifically, LEON, but I suspect but can't verify that it also happens on all Sparc processors).</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">The problem is, or appears to be with using double values in Sparc (32 bit).</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">Specifically, double values are not being loaded into registers correctly within a function using va_args. Only half the value is loaded (i.e. 32, rather than
 64 bits of the value).</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">What I have also found is that the failure does not happen in all circumstances. The simplest situation I've been able to re-create that avoids the problem is
 to put a store and subsequent load instruction around the va_arg instruction that deals with the double value. e.g. (in an .ll file):</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">This code fragment does not work:</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">  define void @foo(i32 %v, i8* %ap) local_unnamed_addr {</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">  entry:</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %ap.addr = alloca i8*, align 4</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    store i8* %ap, i8** %ap.addr, align 4</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %0 = va_arg i8** %ap.addr, i64</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %conv = trunc i64 %0 to i32</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %1 = va_arg i8** %ap.addr, double</span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    ...</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">Whereas this nearly identical code fragment, wrapping the store and load around the "double" va_arg instruction does work:</span></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">  define void @foo(i32 %v, i8* %ap) local_unnamed_addr {</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    entry:</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %ap.addr = alloca i8*, align 4</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    store i8* %ap, i8** %ap.addr, align 4</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %0 = va_arg i8** %ap.addr, i64</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %conv = trunc i64 %0 to i32</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    store i32 %conv, i32* @foo_arg, align 4</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %1 = va_arg i8** %ap.addr, double</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    %2 = load i32, i32* @foo_arg, align 4</span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">    ...</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">I had been attempting to make various changes to SparcISelLowering.cpp to try to simulate something similar where the code is output, but I don't feel as though
 I'm heading in the right direction. I'm still not sure quite where the source of the problem lies.</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">I can provide more details on specifics, but rather than head off into excessive details immediately, I'd appreciate if anyone can help me identify what direction
 I really should be taking to fix this problem. I'm not convinced I've been going about it the right way so far.</span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black"> </span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt; font-family:"Tahoma",sans-serif; color:black">Chris Dewhurst, Lero, University of Limerick.</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>