Hi,<div><br></div><div>  After some fixes to the llvm code in mono SVN, it now generates the following:</div><div><br></div><div><div>   d:   0f 10 0f                movups (%rdi),%xmm1      </div><div>  10:   66 0f fe c1             paddd  %xmm1,%xmm0       </div>
<div>  14:   48 83 c7 10             add    $0x10,%rdi        </div><div>  18:   89 f1                   mov    %esi,%ecx         </div><div>  1a:   c1 f9 1f                sar    $0x1f,%ecx        </div><div>  1d:   83 e1 03                and    $0x3,%ecx         </div>
<div>  20:   01 f1                   add    %esi,%ecx</div><div>  22:   c1 f9 02                sar    $0x2,%ecx</div><div>  25:   ff c0                   inc    %eax</div><div>  27:   39 c8                   cmp    %ecx,%eax</div>
<div>  29:   0f 8c de ff ff ff       jl     d &lt;Test_sum+0xd&gt;</div><div><br></div></div><div>which is pretty good.</div><div><br></div><div>                             Zoltan<br><br><div class="gmail_quote">On Fri, Mar 12, 2010 at 1:15 AM, Sergei Dyshel <span dir="ltr">&lt;<a href="mailto:qyron.private@gmail.com">qyron.private@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hello Rodrigo,<br>
Thanks for the quick answer! But do you mean by it that the only<br>
problem is in lack of global register allocator? What if &#39;temp&#39; was<br>
not vector but some bare &#39;int&#39; temporary, would it be loaded and<br>
stored in each iteration?<br>
<br>
Another question. I know that there is also LLVM engine in Mono and<br>
LLVM generally supports vector instructions in his IR. Is it hard to<br>
add SIMD support to mono-llvm.c?<br>
--<br>
Regards,<br>
Sergei Dyshel<br>
<div><div></div><div class="h5"><br>
<br>
<br>
On Fri, Mar 12, 2010 at 01:56, Rodrigo Kumpera &lt;<a href="mailto:kumpera@gmail.com">kumpera@gmail.com</a>&gt; wrote:<br>
&gt; Hi Sergei,<br>
&gt;<br>
&gt; On Thu, Mar 11, 2010 at 8:30 PM, Sergei Dyshel &lt;<a href="mailto:qyron.private@gmail.com">qyron.private@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hello,<br>
&gt;&gt; I&#39;m doing some research on vectorization using Mono. I&#39;ve noticed that<br>
&gt;&gt; code generated by Mono&#39;s JIT contains many unnecessary memory loads<br>
&gt;&gt; and stores. Here is simple example, the full code is attached:<br>
&gt;&gt;<br>
&gt;&gt; public static unsafe int sum(int* a, int size) {<br>
&gt;&gt;  Vector4i temp = new Vector4i();<br>
&gt;&gt;  Vector4i* p = (Vector4i*) a;<br>
&gt;&gt;  for (int i = 0; i &lt; size/4; i++) {<br>
&gt;&gt;    temp += *p;<br>
&gt;&gt;    p += 1;<br>
&gt;&gt;  }<br>
&gt;&gt;  return temp.X + temp.Y + temp.Z + temp.W;<br>
&gt;&gt; }<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; The problem you&#39;re seen of going to memory when not needed is due to the<br>
&gt; fact that<br>
&gt; mono lacks a working global register allocator. If you use a value in a<br>
&gt; single basic block,<br>
&gt; you&#39;ll notice that it&#39;s kept in memory the whole time.<br>
&gt;<br>
&gt; We don&#39;t eliminate a lot of redundancies, even under SSA, because our JIT<br>
&gt; doesn&#39;t know how<br>
&gt; to handle SIMD ops under that form. It&#39;s an open problem requiring some<br>
&gt; work. The same<br>
&gt; applies to our global register allocator.<br>
&gt;<br>
</div></div>_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
</blockquote></div><br></div>