<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SSE problems with -m32]]></title><description><![CDATA[<p>Hi,</p>
<p>i wrote this code:</p>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;xmmintrin.h&gt;

int main()
{
  float *outIt;
  __m128 image4 ;
  int k;
  float sum;

  posix_memalign( (void**)&amp;outIt, 16, sizeof(float)*8 );
  sum=0;

  printf(&quot;sum: %f\n&quot;, sum );
  for( k=0; k&lt;8; k+=4 )
  {
    image4 = _mm_cvtpu8_ps( _mm_setr_pi8 ( 1+k, 2+k, 3+k, 4+k, 5+k, 6+k, 7+k, 8+k ) );
    _mm_store_ps( outIt, image4 );
    std::cerr &lt;&lt;  &quot;16-byte aligned: &quot; &lt;&lt; outIt &lt;&lt; std::endl;
    printf( &quot;outIt[0]: %f, outIt[1]: %f, outIt[3]: %f, outIt[3]: %f\n&quot;, outIt[0], outIt[0], outIt[2], outIt[3] );
    printf( &quot;outIt[0]: %f, outIt[1]: %f, outIt[3]: %f, outIt[3]: %f\n&quot;, outIt[0], outIt[1], outIt[2], outIt[3] );
    sum = outIt[0] + outIt[1] + outIt[2] + outIt[3];
    outIt += 4;
    printf(&quot;sum: %f\n&quot;, sum );
  }
}
</code></pre>
<p>When I compile this on a 64-bit (Linux) system, I get:</p>
<p>sum: 0.000000<br />
16-byte aligned: 0x100100080<br />
outIt[0]: 1.000000, outIt[1]: 1.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
outIt[0]: 1.000000, outIt[1]: 2.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
sum: 10.000000<br />
16-byte aligned: 0x100100090<br />
outIt[0]: 5.000000, outIt[1]: 5.000000, outIt[3]: 7.000000, outIt[3]: 8.000000<br />
outIt[0]: 5.000000, outIt[1]: 6.000000, outIt[3]: 7.000000, outIt[3]: 8.000000<br />
sum: 26.000000</p>
<p>what is I expect. However, if I compile it for 32-bit mode, the output is:</p>
<p>sum: 0.000000<br />
16-byte aligned: 0x100160<br />
outIt[0]: nan, outIt[1]: 1.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
outIt[0]: 1.000000, outIt[1]: 2.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
sum: 10.000000<br />
16-byte aligned: 0x100170<br />
outIt[0]: nan, outIt[1]: nan, outIt[3]: 7.000000, outIt[3]: nan<br />
outIt[0]: 5.000000, outIt[1]: 6.000000, outIt[3]: 7.000000, outIt[3]: 8.000000<br />
sum: 26.000000</p>
<p>There are always NaNs when I try to access elements of outIt for the first time. Does anybody know, what I am doing wrong?</p>
<p>Thanks,</p>
<p>A.O.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271146/sse-problems-with-m32</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 14:58:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271146.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Jul 2010 13:31:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SSE problems with -m32 on Fri, 23 Jul 2010 13:31:27 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>i wrote this code:</p>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
#include &lt;xmmintrin.h&gt;

int main()
{
  float *outIt;
  __m128 image4 ;
  int k;
  float sum;

  posix_memalign( (void**)&amp;outIt, 16, sizeof(float)*8 );
  sum=0;

  printf(&quot;sum: %f\n&quot;, sum );
  for( k=0; k&lt;8; k+=4 )
  {
    image4 = _mm_cvtpu8_ps( _mm_setr_pi8 ( 1+k, 2+k, 3+k, 4+k, 5+k, 6+k, 7+k, 8+k ) );
    _mm_store_ps( outIt, image4 );
    std::cerr &lt;&lt;  &quot;16-byte aligned: &quot; &lt;&lt; outIt &lt;&lt; std::endl;
    printf( &quot;outIt[0]: %f, outIt[1]: %f, outIt[3]: %f, outIt[3]: %f\n&quot;, outIt[0], outIt[0], outIt[2], outIt[3] );
    printf( &quot;outIt[0]: %f, outIt[1]: %f, outIt[3]: %f, outIt[3]: %f\n&quot;, outIt[0], outIt[1], outIt[2], outIt[3] );
    sum = outIt[0] + outIt[1] + outIt[2] + outIt[3];
    outIt += 4;
    printf(&quot;sum: %f\n&quot;, sum );
  }
}
</code></pre>
<p>When I compile this on a 64-bit (Linux) system, I get:</p>
<p>sum: 0.000000<br />
16-byte aligned: 0x100100080<br />
outIt[0]: 1.000000, outIt[1]: 1.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
outIt[0]: 1.000000, outIt[1]: 2.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
sum: 10.000000<br />
16-byte aligned: 0x100100090<br />
outIt[0]: 5.000000, outIt[1]: 5.000000, outIt[3]: 7.000000, outIt[3]: 8.000000<br />
outIt[0]: 5.000000, outIt[1]: 6.000000, outIt[3]: 7.000000, outIt[3]: 8.000000<br />
sum: 26.000000</p>
<p>what is I expect. However, if I compile it for 32-bit mode, the output is:</p>
<p>sum: 0.000000<br />
16-byte aligned: 0x100160<br />
outIt[0]: nan, outIt[1]: 1.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
outIt[0]: 1.000000, outIt[1]: 2.000000, outIt[3]: 3.000000, outIt[3]: 4.000000<br />
sum: 10.000000<br />
16-byte aligned: 0x100170<br />
outIt[0]: nan, outIt[1]: nan, outIt[3]: 7.000000, outIt[3]: nan<br />
outIt[0]: 5.000000, outIt[1]: 6.000000, outIt[3]: 7.000000, outIt[3]: 8.000000<br />
sum: 26.000000</p>
<p>There are always NaNs when I try to access elements of outIt for the first time. Does anybody know, what I am doing wrong?</p>
<p>Thanks,</p>
<p>A.O.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930701</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930701</guid><dc:creator><![CDATA[AlphaOrion]]></dc:creator><pubDate>Fri, 23 Jul 2010 13:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to SSE problems with -m32 on Fri, 23 Jul 2010 14:01:39 GMT]]></title><description><![CDATA[<p>depending on your compiler version and used flags this code might generate code using mmx-registers, destroying the contents of the fpu-registers (there is no single cpu instruction for _mm_cvtpu8_ps, there is no simple way to convert packed 8-bit integers to packed 32-bit integers). an _mm_empty() intrinsic is missing.</p>
<pre><code class="language-cpp">image4 = _mm_cvtpu8_ps( _mm_setr_pi8 ( 1+k, 2+k, 3+k, 4+k, 5+k, 6+k, 7+k, 8+k ) );
    _mm_store_ps( outIt, image4 );
    _mm_empty();
    std::cerr &lt;&lt;  &quot;16-byte aligned: &quot; &lt;&lt; outIt &lt;&lt; std::endl;
</code></pre>
<p>Under 64-bit normal math is probably be done using the sse-registers, so the problem doesnt surface, or not exists because mmx-registers arent used in the first place.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1930720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1930720</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 23 Jul 2010 14:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to SSE problems with -m32 on Mon, 26 Jul 2010 09:18:04 GMT]]></title><description><![CDATA[<p>Thanks, that's it!</p>
<p>A.O.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1931863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1931863</guid><dc:creator><![CDATA[AlphaOrion]]></dc:creator><pubDate>Mon, 26 Jul 2010 09:18:04 GMT</pubDate></item></channel></rss>