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