要测试汇编语言功能的性能,我想在带有内联汇编的C程序中使用它来替换现有功能。
我的GNU GAS汇编器已经可以使用适当的-march
识别指令。
如何使GCC生成接受无法发出且无法识别的内联汇编指令的代码?
例如,ARM SVE扩展或多或少是最近添加到ARM体系结构中的。
因此,在最小的无用内联SVE组装示例中,我尝试:
main.c
int main(void) {
__asm__ __volatile__ ("ld1d z1.d, p0/z, [x0, x4, lsl 3]");
}
然后我尝试使用:
aarch64-linux-gnu-gcc -c -o main.o --save-temps -v main.c
但是汇编失败并显示以下信息:
main.s: Assembler messages:
main.s:10: Error: selected processor does not support `ld1d z1.d,p0/z,[x0,x4,lsl 3]'
详细输出包含:
/usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/bin/as -v -EL -mabi=lp64 -o main.o main.s
和main.s
包含:
.arch armv8-a
.file "main.c"
.text
.align 2
.global main
.type main, %function
main:
#APP
// 2 "main.c" 1
ld1d z1.d, p0/z, [x0, x4, lsl 3]
// 0 "" 2
#NO_APP
mov w0, 0
ret
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) 7.4.0"
.section .note.GNU-stack,"",@progbits
但是,我的汇编程序足够新,可以进行汇编,因为我设法通过以下任一方法进行汇编:
.arch armv8-a
手动替换生成的main.s
文件中的.arch armv8-a+sve
.arch armv8-a
中删除main.s
并在GAS CLI上添加-march=all
或-march=armv8-a+sve
(很不幸,TODO .arch all
不存在,我想知道为什么吗?)< / li>
但是,如果我尝试将-march=armv8-a+sve
或-march=all
添加到GCC CLI,则会分别出现以下问题:
cc1: error: invalid feature modifier in ‘-march=armv8-a+sve’
cc1: error: unknown value ‘all’ for -march
我还尝试将-Xassembler -march=all
添加到GCC CLI:
aarch64-linux-gnu-gcc -Xassembler -march=all -c -o main.o --save-temps -v main.c
,该选项确实根据-v
转发到了汇编程序,但是仍然失败,因为GCC放入汇编文件的.arch armv8-a
具有优先权。
出于绝望,我终于尝试将C示例修改为:
int main(void) {
__asm__ __volatile__ (".arch armv8-a+sve\nld1d z1.d, p0/z, [x0, x4, lsl 3]");
}
确实有效,但是我认为它太疯狂了以至于无法使用。值得注意的是,.arch armv8-a+sve
甚至在我的内联汇编语句之后仍然有效,而且我不知道如何还原为以前的默认GCC .arch
。
我还寻找了like this one有用的GCC -masm
选项,但找不到任何有趣的东西。
在Ubuntu 18.04,aarch64-linux-gnu-gcc 7.4.0,aarch64-linux-gnu-as 2.30中进行了测试。