From: Borja F. <bor...@gm...> - 2013-07-01 17:41:04
|
Yes but the first goal now is to have inline asm feature complete xD Then we can move into other places of the library. Taking a look at the previous emails this is what needs still to be done: 1) Implement the missed optimization above for the memory constraint. Also see if you can come with further cases. Remember to add a test case. 2) Implement the stuff in the "C names used in assembler code" section of the avrlibc manual. You mentioned some issues here in a previous email. 3) Implement the a0, a1, etc... constraints. 2013/7/1 Stepan Dyatkovskiy <stp...@na...> > Hi Borja. > 1. OK. Will add it. > 2. > > > movw r30, r24 > > adiw r30, 1 > Yup, we can replace it with "load r24, Z+1". I'll improve LowerINLINEASM a > bit then. > > 3. If I'm got right, our main goal now is to get avr-libc compilable? > Whould you tell me would else remained to do with inline-asm? > > -Stepan. > > Borja Ferrer wrote: > >> 1) Yes, an assert could do it. Fixup your patch to only allow A down to >> D constraints. >> 2) This code was compiled with -O3, cant you reproduce it? >> >> >> 2013/6/29 Borja Ferrer <bor...@gm... >> <mailto:bor...@gm...>**> >> >> >> 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... >> <mailto: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... >> <mailto: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... >> <mailto: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... >> <mailto: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... >> <mailto: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...> >> <mailto: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...> >> <mailto: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...>> >> <mailto: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...>**>__> >> >> <mailto: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...>>> >> >> <mailto: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...>>> >> >> <mailto: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...>**>__> >> >> <mailto: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__forge.net> >> >> <http://source <http://sourceforge.net> >> >> >> >> >> >> >> >> >> > |