如何使用GNU GAS支持但比我的GCC最新的-march更新的内联汇编指令?

时间:2019-06-26 15:45:28

标签: gcc inline-assembly gas

要测试汇编语言功能的性能,我想在带有内联汇编的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中进行了测试。

0 个答案:

没有答案