From: Stepan D. <stp...@na...> - 2013-06-28 18:44:25
|
Hi Borja. This is almost the final multibyte constraint patch. Tests are not created yet. Currently I have issue with 64 bit values. Even if I pass them as inline asm operands, llvm still truncates them to i32. What works: long a; // 32 bit void f() { asm("instr %A0 %B0 %C0 %D0": : "r"(a)); } What doesn't work: long long a; // 64 bit void f() { asm("instr %A0 %B0 %E0": : "r"(a)); } The last one fires assertion since llvm allocates registers for the first 32 bits only. -Stepan. Borja Ferrer wrote: > Yes fine > > El jueves, 27 de junio de 2013, Stepan Dyatkovskiy escribió: > > OK. Will do. > Currently there is a patch with memory constraint and draft > multibyte constraint (supports only A and B). To be clean under > multibyte constraints I mean something like this: > asm volatile("mov __tmp_reg__, %A0" "\n\t" > "mov %A0, %B0" "\n\t" > "mov %B0, __tmp_reg__" "\n\t" > : "=r" (value) > : "0" (value) > ); > > -Stepan. > Borja Ferrer wrote: > > btw, if this is now feature complete you can commit it. > > > 2013/6/27 Borja Ferrer <bor...@gm... > <mailto:bor...@gm...>> > > No, that code is a personal modification of your examples. > If you > aren't getting the correct output from clang that's because you > probably didn't apply a patch i commited last week for > clang in our SVN. > The assertion you're getting looks reasonable, it's an old > friend of > mine. The reason is that if Y is being reserved as the frame > pointer, you cant have an instruction that uses 2 registers > when > only Z is available. I wouldn't mind too much about it. > > Now, my 2nd question: > > Is there anything else that needs to be covered for the memory > constraint? > > > 2013/6/27 Stepan Dyatkovskiy <stp...@na... > <mailto:stp...@na...>> > > This one looks good. Though ./llc emits "run out of > registers > allocation. I'll look at it. Is that from avr-libc? > -Stepan. > Borja Ferrer wrote: > > Yes, and then I replied the following: > > For this C code: > > char delay_count; > char aaa; > uint8_t delay(unsigned char p) > { > uint8_t cnt; > asm volatile ( > "inst %0, %1" "\n\t" > : "=Q" (delay_count) > : "Q" (aaa)); > return cnt; > } > > Clang produces: > > define i8 @delay(i8 %p) #0 { > entry: > tail call void asm sideeffect "inst $0, $1\0A\09", > "=*Q,*Q"(i8* > @delay_count, i8* @aaa) #2, !srcloc !4 > ret i8 undef > } > > notice the *Q constraints, so is there anything > wrong in there? > > Is there anything else that needs to be covered for the > memory constraint? > > > 2013/6/27 Stepan Dyatkovskiy <stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>> > > > Hi Borja, > > > Stepan, reply in this thread to my 2 > questions again > if the email > got lost. > > My prev. reply: > > > > Ahh, I didn't know avr-gcc was buggy on this > feature, that's probably > > the reason for why the code i pasted in my > previous > email didn't > work. > ... > > What's wrong with clang? I fixed clang > inline asm > support back on > > friday, so is there anything else that is > broken? > It should emit '*Q' instead of 'Q'. That's why > code > from prev. email > didn't work, just compare -emit-llvm -S output of > avr-clang with > other backends, > > > About the getPointerRegClass function, what > is it > used for? Also, > please > > move the implementation to the cpp file > instead of > leaving it in > the .h. > Currently, it is used in registers coelescing > pass. > While being > registers inflating, llvm lookups all register > uses. If > it found > that register is used by inline-asm as memory > operand, > it requests > the pointer class with this method (I think > the largest > one). But > may be in future this method will be used in > more cases. > > avr-gcc has buggy implementation of memory > constraint, > that's why > avr-libs doesn't use it at all. We have a > chance to be > first here > > -Stepan > > Borja Ferrer wrote: > > Stepan, reply in this thread to my 2 questions > again if the > email got lost. > > > 2013/6/27 Borja Ferrer <bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>> > <mailto:bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>>__>__> > > > No, your last email only says : "So, > can I > commit that memory > constraint patch?" > > > 2013/6/27 Stepan Dyatkovskiy > <stp...@na... <mailto:stp...@na...> > <mailto:stp...@na... > <mailto:stp...@na...>> > <mailto:stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>>> > > > > Hm... Didn't you get my previous > mail? If > not, I think, > I have > to change my mail box. > > -Stepan > > > -------- Original Message -------- > Subject: Re: [avr-llvm-devel] Inline > assembly. Mostly > just a stub. > Date: Tue, 25 Jun 2013 18:30:46 +0400 > From: Stepan Dyatkovskiy > <stp...@na... <mailto:stp...@na...> > <mailto:stp...@na... > <mailto:stp...@na...>> > <mailto:stp...@na... > <mailto:stp...@na...> <mailto:stp...@na... > <mailto:stp...@na...>>>> > To: Borja Ferrer > <bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>> > <mailto:bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>>__>__> > CC: avr-llvm > <avr-llvm-devel@lists.__source______forge.net > <http://source____forge.net> > <http://source__forge.net> > <http://source <http://sourceforge.net> > |