<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 12pt;
font-family:Calibri
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>Hi,<BR> <BR>I hope this is the right mailing-list to post this question to. <BR> <BR>It is about the LLVM instructions fptoui and fptosi. I'm not entirely clear on the difference between these two instructions.<BR> <BR>I wrote a little test-program and compiled it<BR><pre class="default prettyprint prettyprinted"><code><span class="com">#include</span><span class="pln"> </span><span class="str"><stdio.h></span><span class="pln">

</span><span class="kwd">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">int</span><span class="pln"> argc</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">char</span><span class="pun">**</span><span class="pln"> argv</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">double</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">3.5</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ui </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> d</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> si </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln"> d</span><span class="pun">;</span><span class="pln">

    printf</span><span class="pun">(</span><span class="str">"unsigned %u, 0x%x\n"</span><span class="pun">,</span><span class="pln"> ui</span><span class="pun">,</span><span class="pln"> ui</span><span class="pun">);</span><span class="pln">
    printf</span><span class="pun">(</span><span class="str">"signed   %i, 0x%x\n"</span><span class="pun">,</span><span class="pln"> si</span><span class="pun">,</span><span class="pln"> si</span><span class="pun">);</span><span class="pln">      
    </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">    
</span><span class="pun">}</span></code></pre> <BR>as I expected,  this resulted in the generation of both kinds of instructions<BR><pre class="default prettyprint prettyprinted"><code><span class="pun">...</span><span class="pln">
</span><span class="pun">%</span><span class="lit">5</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> fptoui </span><span class="kwd">double</span><span class="pln"> </span><span class="pun">%</span><span class="lit">4</span><span class="pln"> to i32
store i32 </span><span class="pun">%</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> i32</span><span class="pun">*</span><span class="pln"> </span><span class="pun">%</span><span class="pln">ui</span><span class="pun">,</span><span class="pln"> align </span><span class="lit">4</span><span class="pln">
</span><span class="pun">%</span><span class="lit">6</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> load </span><span class="kwd">double</span><span class="pun">*</span><span class="pln"> </span><span class="pun">%</span><span class="pln">d</span><span class="pun">,</span><span class="pln"> align </span><span class="lit">8</span><span class="pln">
</span><span class="pun">%</span><span class="lit">7</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> fptosi </span><span class="kwd">double</span><span class="pln"> </span><span class="pun">%</span><span class="lit">6</span><span class="pln"> to i32
store i32 </span><span class="pun">%</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> i32</span><span class="pun">*</span><span class="pln"> </span><span class="pun">%</span><span class="pln">si</span><span class="pun">,</span><span class="pln"> align </span><span class="lit">4</span><span class="pln">
</span><span class="pun">...</span></code></pre> <BR>when the program is executed, the output is <BR><code><span class="kwd"><br>unsigned</span><span class="pln"> </span><span class="lit">4294967289</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xfffffff9</span><span class="pln">
<br></span><span class="kwd">signed</span><span class="pln"> </span><span class="pun">-</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0xfffffff9</span></code><BR> <BR>so both instructions produce the same result value. <BR> <BR>The LLVM IR documentation states:  "The ‘fptoui‘ instruction converts its floating point operand into the
  nearest (rounding towards zero) unsigned integer value."<BR> <BR>Wouldn't the nearest unsigned integer for a negative value be 0? Or is this undefined behavior?<BR> <BR>It would be helpful if someone could clarify for me, in which cases the two instructions produce different results.<BR> <BR> <BR>Regards,<BR>Andreas Gruenwald<BR> <BR>                                      </div></body>
</html>