old*_*mer 5 embedded optimization assembly arm bare-metal
从这样的代码开始
void lib_memset( unsigned char *dest, unsigned char c, unsigned int n)
{
while(n--)
{
*dest=c;
dest++;
}
}
Run Code Online (Sandbox Code Playgroud)
使用llvm作为交叉编译器
clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls lib_memset.bc -o lib_memset.s
Run Code Online (Sandbox Code Playgroud)
当使用优化器时,它会检测并用真实的memset替换它
lib_memset:
push {r11, lr}
mov r3, r1
mov r11, sp
cmp r2, #0
beq .LBB0_2
mov r1, r2
mov r2, r3
bl __aeabi_memset
.LBB0_2: @ %while.end
pop {r11, pc}
Run Code Online (Sandbox Code Playgroud)
但没有实现它.
我不希望我想要它编译我给它的目标我给它的代码而不是使用库调用.我认为-disable-simplify-libcalls会这样做,但事实并非如此.
我以为我之前已经想过这个,但是无法知道该怎么做.我需要优化器,我不希望实现库的这个循环依赖问题,它需要库等.可以在asm中执行它以使编译器退出循环,但不应该这样做.
old*_*mer 10
clang -Wall -m32 -emit-llvm -fno-builtin --target=arm-none-eabi -ffreestanding -c lib_memset.c -o lib_memset.bc
opt -std-compile-opts -strip-debug -march=arm -mcpu=mpcore -mtriple=arm-none-eabi -disable-simplify-libcalls lib_memset.bc -o lib_memset.opt.bc
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi lib_memset.opt.bc -o lib_memset.opt.s
llc -march=arm -mcpu=mpcore -disable-simplify-libcalls -mtriple=arm-none-eabi lib_memset.bc -o lib_memset.s
Run Code Online (Sandbox Code Playgroud)
感谢无意识的噪音,同时添加-ffreestanding,我决定重新阅读所有的--help选项for llc和opt,并发现-disable-simpilfy-libcalls是opt和llc的选项,添加到opt修复了问题.
lib_memset:
cmp r2, #0
bxeq lr
.LBB0_1:
strb r1, [r0], #1
subs r2, r2, #1
bne .LBB0_1
bx lr
Run Code Online (Sandbox Code Playgroud)
我不喜欢回答我自己的问题,可以坐在这里一点,所以我可以在下次找到答案,或者如果SO众神决定把它留在这里那很好......