我的裸机程序手动调用memset()
到零个完整的/对齐的4k页面,如下所示(我不是使用uint64_t,而是另一个8字节的东西):
uint64_t something[512] __attribute__((aligned(4096)));
memset(something, 0x0, 4096);
我正在编写类似于此的.
%> /path/to/gcc-11.1.0/bin/aarch64-unknown-elf-gcc \
-O3 \
-std=gnu99 \
-nostartfiles \
--specs=nano.specs \
-march=armv8.1-a \
-Wl,--gc-sections \
-Tlinker_script.lds \
my_code.c \
-o my_code.elf
当我反汇编并查看链接的memset()
时,它是这个基本/通用/一次一个字节的实现:
000000004010399c <memset>:
s = (char*)aligned_addr;
}
#endif /* not PREFER_SIZE_OVER_SPEED */
while (n--)
4010399c: d2800003 mov x3, #0x0 // #0
401039a0: eb03005f cmp x2, x3
401039a4: 54000041 b.ne 401039ac <memset+0x10> // b.any
*s++ = (char) c;
return m;
}
401039a8: d65f03c0 ret
*s++ = (char) c;
401039ac: 38236801 strb w1, [x0, x3]
401039b0: 91000463 add x3, x3, #0x1
401039b4: 17fffffb b 401039a0 <memset+0x4>
我期待一个使用stp
或向量指令的aarch64优化版本.我的编译器有一个/path/to/gcc-11.1.0/newlib-nano
子目录.
我已经删除了--specs=nano.specs
个选项,并摆弄了各种选项,但我不确定我在这里能做什么……
HOW CAN I GET THE OPTIMIZED 100 IMPLEMENTATION?
注意,我使用
/path/to/gcc-11.1.0/bin/aarch64-unknown-elf-ar x
从许多不同的*.a
文件中提取libc_a.memset.o
文件,但它们都是空的:/path/to/gcc-11.1.0/newlib-nano/aarch64-unknown-elf/lib/libc.a
、/path/to/gcc-11.1.0/newlib-nano/aarch64-unknown-elf/lib/libc_nano.a
、/path/to/gcc-11.1.0/newlib-nano/aarch64-unknown-elf/lib/libg.a
、/path/to/gcc-11.1.0/aarch64-unknown-elf/lib/libc.a
,等等.不是逐字节实现,而是空的.我这样做是为了寻找一个好的实现,但我显然不明白这里发生了什么……