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