From: Borja F. <bor...@gm...> - 2013-06-29 15:13:10
|
Ok more things, I've looked into the 64bit constraints and gcc doesnt seem to support them, for this code: unsigned long long delay(unsigned long long a, unsigned long long b) { uint8_t cnt; asm volatile ( "add %A0, %A1" "\n\t" "add %B0, %B1" "\n\t" "add %C0, %C1" "\n\t" "add %D0, %D1" "\n\t" "add %E0, %E1" "\n\t" "add %F0, %F1" "\n\t" "add %G0, %G1" "\n\t" "add %H0, %H1" "\n\t" : "=r" (a) : "r" (b)); return a; } gcc produces (ignoring frames): movw r18,r10 movw r20,r12 movw r22,r14 movw r24,r16 /* #APP */ ; 266 "test.c" 1 add r10, r18 add r11, r19 add r12, r20 add r13, r21 add r10, r18 add r10, r18 add r10, r18 add r10, r18 ; 0 "" 2 /* #NOAPP */ movw r18,r10 movw r20,r12 movw r22,r14 movw r24,r16 notice how the last 4 add instructions are wrong. 2013/6/29 Borja Ferrer <bor...@gm...> > 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> >>>>>> >>>>>> >>>>> >>>> >>> >> > |