From: Borja F. <bor...@gm...> - 2013-06-29 14:14:06
|
Ignore my previous email, it was my fault. Now, for the following code: uint8_t delay(unsigned char *p) { uint8_t cnt=8; asm volatile ( "ld %0, %1" "\n\t" : "=r" (cnt) : "Q" (p[1])); return cnt; } we get: movw r30, r24 adiw r30, 1 ;APP ld r24, Z ;NO_APP ret Ideally, that adiw should be folded into the load. 2013/6/29 Borja Ferrer <bor...@gm...> > Stepan I've been testing the memory constraint but im getting an assertion > for the following code: > > uint8_t delay(unsigned char **p) > { > uint8_t cnt=8; > asm volatile ( > "ld %0, %1" "\n\t" > : "=r" (cnt) > : "Q" (p[7])); > return cnt; > } > > What's wrong in here? > > > 2013/6/29 Borja Ferrer <bor...@gm...> > >> 1) Ok then, I will look into it. >> 2) Yes, in theory types should be legalized up to i16 max, but for some >> reason i got that assertion triggered, i think it was with multibyte inline >> asm, so this has to be solved. >> >> >> 2013/6/28 Borja Ferrer <bor...@gm...> >> >>> Hello Stepan, I will take a look to your patch later, but some questions: >>> >>> 1) does avr-gcc support 64bit values? >>> 2) now that you're working with big data types, does it make sense to >>> remove the assert I commented out about value types that are different to >>> i8 AND i16? >>> >>> >>> >>> 2013/6/28 Stepan Dyatkovskiy <stp...@na...> >>> >>>> 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__forge.net> >>>>> <http://source <http://sourceforge.net> >>>>> >>>>> >>>> >>> >> > |