Jia Liu
2013-Mar-04 02:02 UTC
[LLVMdev] [MIPS] How can I add a constraint to LLVM/Clang for MIPS BE?
Hi Jack, On Sat, Mar 2, 2013 at 8:15 AM, Jack Carter <Jack.Carter at imgtec.com> wrote:> Jia, > > I made what I believe to be the correct changes and rebuilt clang and llc. Are the results what you expected? I so I will prepare the patches for commitment. > > Jack > > clang ../mips_R_JiaLiu.c -o mips_R_JiaLiu.ll -emit-llvm -O3 -S -target mipsel-unknown-linux -std=gnu89 > llc mips_R_JiaLiu.ll -o mips_R_JiaLiu.o -mcpu=mips32r2 -march=mipsel -filetype=obj > mips-linux-gnu-gcc -mips32r2 -O3 -EL -fPIC -o mips_R_JiaLiu.exe mips_R_JiaLiu.o >I use your way to compile test case: llvm-install/bin/clang constraints.c -o constraints.ll -emit-llvm -O3 -S -target mipsel-unknown-linux -std=gnu89 --sysroot /Users/jia/project/Cross-SDK/sdk/mipsel-gnu-rootfs llvm-install/bin/llc constraints.ll -o constraints.llc.s -mcpu=mips32r2 -march=mipsel -filetype=asm llvm-install/bin/llc constraints.ll -o constraints.o -mcpu=mips32r2 -march=mipsel -filetype=obj mipsel-unknown-linux-gnu-gcc -mips32r2 -O3 -EL -fPIC -static -o constraints.exe constraints.o the inline-asm is: #APP lw $5, 0($1) #NO_APP #APP lw $5, 0($1) #NO_APP #APP lwl $5, 1 + 0($1) lwr $5, 2 + 0($1) #NO_APP It use different registers, but $1, that is $AT, cann't be used, it is reserved for $AS using. any ideas?> inline_asm: run *.exe > out is 4 > out is 10 > out is ccddffbb > inline_asm: >Regards, Jia
Reed Kotler
2013-Mar-05 00:10 UTC
[LLVMdev] [MIPS] How can I add a constraint to LLVM/Clang for MIPS BE?
Maybe try: .set noat AT is needed to create certain instructions from pseudo instructions, so you have to be careful how you use this. Some instructions that you can use in Mips assembler are in fact pseudos. While AT is not available to it (.set noat), the assembler can not assemble certain pseudos for you. On 03/03/2013 06:02 PM, Jia Liu wrote:> Hi Jack, > > On Sat, Mar 2, 2013 at 8:15 AM, Jack Carter <Jack.Carter-1AXoQHu6uovQT0dZR+AlfA at public.gmane.org> wrote: >> Jia, >> >> I made what I believe to be the correct changes and rebuilt clang and llc. Are the results what you expected? I so I will prepare the patches for commitment. >> >> Jack >> >> clang ../mips_R_JiaLiu.c -o mips_R_JiaLiu.ll -emit-llvm -O3 -S -target mipsel-unknown-linux -std=gnu89 >> llc mips_R_JiaLiu.ll -o mips_R_JiaLiu.o -mcpu=mips32r2 -march=mipsel -filetype=obj >> mips-linux-gnu-gcc -mips32r2 -O3 -EL -fPIC -o mips_R_JiaLiu.exe mips_R_JiaLiu.o >> > > I use your way to compile test case: > llvm-install/bin/clang constraints.c -o constraints.ll -emit-llvm -O3 > -S -target mipsel-unknown-linux -std=gnu89 --sysroot > /Users/jia/project/Cross-SDK/sdk/mipsel-gnu-rootfs > llvm-install/bin/llc constraints.ll -o constraints.llc.s > -mcpu=mips32r2 -march=mipsel -filetype=asm > llvm-install/bin/llc constraints.ll -o constraints.o -mcpu=mips32r2 > -march=mipsel -filetype=obj > mipsel-unknown-linux-gnu-gcc -mips32r2 -O3 -EL -fPIC -static -o > constraints.exe constraints.o > > the inline-asm is: > #APP > lw $5, 0($1) > #NO_APP > > #APP > lw $5, 0($1) > #NO_APP > > #APP > lwl $5, 1 + 0($1) > lwr $5, 2 + 0($1) > #NO_APP > > It use different registers, but $1, that is $AT, cann't be used, it is > reserved for $AS using. > any ideas? > >> inline_asm: run *.exe >> out is 4 >> out is 10 >> out is ccddffbb >> inline_asm: >> > > Regards, > Jia >
reed kotler
2013-Mar-05 00:31 UTC
[LLVMdev] [MIPS] How can I add a constraint to LLVM/Clang for MIPS BE?
Here is part of the problem... Gcc does not try to be creative with AT. It's a reserved register just like it is with gas by default. We use AT as an allocatable register and never emit instructions that would require the assembler to be need to use AT. By default we have : .set noat So if you try and use assembly instructions that need AT you will have a problem. So you could add .set at and at AT to the clobber list. Quite possibly it would be more correct for use to do this for you when inline assembly is present. I.e. .set AT and add AT to the clobber list however we don't do that at this time. On 03/04/2013 04:10 PM, Reed Kotler wrote:> Maybe try: > > .set noat > > AT is needed to create certain instructions from pseudo instructions, > so you have to be careful how you use this. Some instructions that you > can use in Mips assembler are in fact pseudos. > > While AT is not available to it (.set noat), the assembler can not > assemble certain pseudos for you. > > On 03/03/2013 06:02 PM, Jia Liu wrote: >> Hi Jack, >> >> On Sat, Mar 2, 2013 at 8:15 AM, Jack Carter >> <Jack.Carter-1AXoQHu6uovQT0dZR+AlfA at public.gmane.org> wrote: >>> Jia, >>> >>> I made what I believe to be the correct changes and rebuilt clang >>> and llc. Are the results what you expected? I so I will prepare the >>> patches for commitment. >>> >>> Jack >>> >>> clang ../mips_R_JiaLiu.c -o mips_R_JiaLiu.ll -emit-llvm -O3 -S >>> -target mipsel-unknown-linux -std=gnu89 >>> llc mips_R_JiaLiu.ll -o mips_R_JiaLiu.o -mcpu=mips32r2 -march=mipsel >>> -filetype=obj >>> mips-linux-gnu-gcc -mips32r2 -O3 -EL -fPIC -o mips_R_JiaLiu.exe >>> mips_R_JiaLiu.o >>> >> >> I use your way to compile test case: >> llvm-install/bin/clang constraints.c -o constraints.ll -emit-llvm -O3 >> -S -target mipsel-unknown-linux -std=gnu89 --sysroot >> /Users/jia/project/Cross-SDK/sdk/mipsel-gnu-rootfs >> llvm-install/bin/llc constraints.ll -o constraints.llc.s >> -mcpu=mips32r2 -march=mipsel -filetype=asm >> llvm-install/bin/llc constraints.ll -o constraints.o -mcpu=mips32r2 >> -march=mipsel -filetype=obj >> mipsel-unknown-linux-gnu-gcc -mips32r2 -O3 -EL -fPIC -static -o >> constraints.exe constraints.o >> >> the inline-asm is: >> #APP >> lw $5, 0($1) >> #NO_APP >> >> #APP >> lw $5, 0($1) >> #NO_APP >> >> #APP >> lwl $5, 1 + 0($1) >> lwr $5, 2 + 0($1) >> #NO_APP >> >> It use different registers, but $1, that is $AT, cann't be used, it is >> reserved for $AS using. >> any ideas? >> >>> inline_asm: run *.exe >>> out is 4 >>> out is 10 >>> out is ccddffbb >>> inline_asm: >>> >> >> Regards, >> Jia >> >