使用 aarch64-none-elf 工具链的 ARM 汇编中的 FCMLE 指令出现问题

问题描述 投票:0回答:1

我在 ARM 汇编中遇到 FCMLE(浮点比较小于或等于零)指令的问题。我正在使用 aarch64-none-elf 工具链进行嵌入式软件开发,问题是我的编译器说 fcmle 指令不是 SIMD 向量寄存器,但事实并非如此。

这是我的 fcmle 测试代码摘要:

bool test_fcmle(void)
{
    float32x4_t Vn  = { 1.5f,  1.1f, -3.5f, 0.0f};
    float32x4_t Vm1 = { 1.1f,  1.5f, -3.5f, 4.4f};

    asm volatile(
        "FMOV %s0, %s1\n" // Load Vn into the SIMD register
        "FCMLE %s0, %s0, %s2" // Compare Vn and Vm1
        : "=w" (Vn)
        : "w" (Vn), "w" (Vm1)
    );
    //...
    //Some comparison code to check the result
    //...
    return true;
}

我使用 fadd 指令而不是 fcmle 来确保 SIMD 寄存器正常工作,并且编译过程中的错误消失并且程序成功运行。

NOTE-1 : 我的工具链是最新的(版本:aarch64-none-elf-gcc 版本 12.3.1 20230626 (Arm GNU Toolchain 12.3.Rel1 (Build arm-12.35)))。

NOTE-2 : 在 ARM 开发者网站上的“指令集”文档中,在“fcmle”指令的支持架构部分中,它显示“Architectures A64”,但对于“fadd”,它显示“Architectures v7, A32” ,A64"。

NOTE-3 : 成功编译后,我在 QEMU(v7.1.0) 机器上测试生成的可执行文件。 QEMU 机器模拟 ARM Cortex-A72。

NOTE-4:我用来编译的命令:

aarch64-none-elf-gcc -Wall -Wextra -Wpedantic -nostdlib -ffreestanding -march=armv8-a -O0 -g -c -o main.o main.c

有人知道我为什么会遇到这个错误吗?我是否缺少任何配置或者我是否误解了 FCMLE 指令与此工具链的用法?

EDIT-1:当我运行上面的代码片段时,编译时出现的错误:

/tmp/cc4yEhOw.s: Assembler messages:
/tmp/cc4yEhOw.s:1839: Error: operand 1 must be a SIMD vector register -- `fcmle s0,s0,s1'
make: *** [Makefile:23: main.o] Error 1
c assembly gcc arm qemu
1个回答
0
投票

fcmle
是具有反转操作数的
fcmge
的别名。显然 gnu binutils 目前不支持它(请参阅 aarch64-tbl.h:3429)作为解决方法,您可以直接使用
fcmge
。尝试
FCMGE %s0, %s2, %s0
(注意最后两个参数交换)。

© www.soinside.com 2019 - 2024. All rights reserved.