From: Stepan D. <stp...@na...> - 2013-06-27 17:45:30
|
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...>> > > 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...>>__> > > > 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...>>> > > > 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...>>> > To: Borja Ferrer <bor...@gm... > <mailto:bor...@gm...> > <mailto:bor...@gm... > <mailto:bor...@gm...>>__> > CC: avr-llvm <avr-llvm-devel@lists.__source__forge.net > <http://sourceforge.net> > <mailto:avr-llvm-devel@lists.__sourceforge.net > <mailto:avr...@li...>>>, John Myers > <ato...@gm... > <mailto:ato...@gm...> > <mailto:atomicdog.jwm@gmail.__com <mailto:ato...@gm...>>> > > Hi Borja, > > 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 > > > > > 2013/6/25 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...>>>> > > Hi Borja. > This is new patch. Seems I've moved memory > constraint > implementation > to the same level like all other constraints. Note > avr-gcc has buggy > implementation of memory constraint, that's why > *avr-libc doesn't > use it*. > > I removed restriction for Y,Z in > getLargestLegalSuperClass, so these > registers could be inflated now. But there was > unimplemented > getPointerRegClass method in AVRRegistersInfo. So > currently I have > restricted it to Y and Z. Though suppose we > can extend > it in future > to XYZ set. > Look changes in inline-asm.ll to see what > exactly is > supported now. > > About clang. > May be we ask John Myers to fix clang support for > inline asm? > > -Stepan. > > > Stepan Dyatkovskiy wrote: > > The patch. Forgot to attach it. > -Stepan. > Stepan Dyatkovskiy wrote: > > Hi Borja, > > > What happens in your example above > when you > use a real > instruction > like > > for example LDD? Does it still use > GPR8 > regs? To me it's > weird that if > you use a real instruction where > operands > are clearly > defined in the td > file the instruction selector uses an > invalid regclass. > > > There are two kinds of inline asm > support in LLVM: > 1. You just support all the > constraints and pastes > inline-asm contents > as-is. That's why its still allowed to use > names like > "some_instr". > 2. You may expand inline-asm strings > set, or in > another > words just parse > it onto set of instructions. In this > case you > have to implement > TargetLowering::______ExpandInlineAsm > method. > > I'd want to start it on this week > though... > > But first we have to get avr-libc > compilable > (perhpas I read you > thoughts ;-) ) > > Relative to memory constrains. I > implemented > initial version > it can > catch simplest cases (from test-case): > > @a = internal global i16 0, align 4 > @b = internal global i16 0, align 4 > define void @mem() { > ;CHECK: some_instr Z, Y > call void asm "some_instr $0, $1", > "=*Q,=*Q"(i16* @a, > i16* @b) > ret void > } > > The patch is attached. > > Its in my todo yet, to handle local > variables. > They could be > emitted as > Y+q expression. Hope to present this > support > tomorrow. So if > 'a' and 'b' > from example above would be local we > could get > "some_instr > Y, Y+2" > > -Stepan. > > > > > > > > > > |