如何在ARM工具链中验证VFPv4特性

如何在ARM工具链中验证VFPv4特性,arm,cortex-a,Arm,Cortex A,我有一个用于Cortex A15的预编译ARM工具链。我想检查它是否生成正确的VFPv4指令。任何人都有想法吗?我们可以在哪个州查找 ... GCC now supports VFPv4-based FPUs and FPUs with single-precision-only VFP. ... 我们也可以手动验证它。根据ARM架构手册VFPv4,至少添加了向量融合乘法累加/减法 void test_vfp4() { asm("VFMA.F32 q1, q2, q3"); } 使用

我有一个用于Cortex A15的预编译ARM工具链。我想检查它是否生成正确的VFPv4指令。任何人都有想法吗?

我们可以在哪个州查找

...
GCC now supports VFPv4-based FPUs and FPUs with single-precision-only VFP.
...
我们也可以手动验证它。根据ARM架构手册VFPv4,至少添加了
向量融合乘法累加/减法

void test_vfp4() {
    asm("VFMA.F32 q1, q2, q3");
}
使用
-mfpu=neon-vfpv4
开关编译此文件(否则我的工具链显示
错误:所选处理器不支持ARM模式“vfma.f32 q1、q2、q3”

并用

arm-linux-gnueabihf-objdump -S vfpv4.o 
应该列在下面

00000000 <test_vfp4>:
   0:   f2042c56    vfma.f32    q1, q2, q3
   4:   e12fff1e    bx  lr
00000000:
0:f2042c56 vfma.f32 q1、q2、q3
4:E12FF1E bx lr
但是,我不知道如何在C级使用它,因为我找不到任何用于这些融合指令的指令,也没有想到任何其他方法。

我们可以在哪些状态下查找它

...
GCC now supports VFPv4-based FPUs and FPUs with single-precision-only VFP.
...
我们也可以手动验证它。根据ARM架构手册VFPv4,至少添加了
向量融合乘法累加/减法

void test_vfp4() {
    asm("VFMA.F32 q1, q2, q3");
}
使用
-mfpu=neon-vfpv4
开关编译此文件(否则我的工具链显示
错误:所选处理器不支持ARM模式“vfma.f32 q1、q2、q3”

并用

arm-linux-gnueabihf-objdump -S vfpv4.o 
应该列在下面

00000000 <test_vfp4>:
   0:   f2042c56    vfma.f32    q1, q2, q3
   4:   e12fff1e    bx  lr
00000000:
0:f2042c56 vfma.f32 q1、q2、q3
4:E12FF1E bx lr

但是,我不知道如何在C级使用它,因为我找不到任何用于这些融合指令的方法,也没有想到任何其他方法。

我想说,您的建议足以验证编译器,因为gcc二进制文件接受-mfpu=neon-vfpv4意味着支持就在那里。编译器是否实际使用了附加指令完全是另一个问题。其描述与
mla
integer版本相同。我看到gcc使用了
mla
版本。编译器可能会使用该指令。然而,由于IEEE浮点数的“C”迂腐用法之间的不匹配,这通常是很困难的。即,不规范和其他问题通常会阻止使用。如果你想要这个,我会用-ffast math编译。游戏渲染和火箭控制有不同的要求。Richard Earnshaw的一篇关于FPU类型与Cortex CPU一起使用的文章。使用
-Ofast
-O3
-ffast math
。我认为您的建议足以验证编译器,因为gcc二进制文件接受-mfpu=neon-vfpv4意味着支持就在那里。编译器是否实际使用了附加指令完全是另一个问题。其描述与
mla
integer版本相同。我看到gcc使用了
mla
版本。编译器可能会使用该指令。然而,由于IEEE浮点数的“C”迂腐用法之间的不匹配,这通常是很困难的。即,不规范和其他问题通常会阻止使用。如果你想要这个,我会用-ffast math编译。游戏渲染和火箭控制有不同的要求。Richard Earnshaw的一篇关于FPU类型与Cortex CPU一起使用的文章。使用
-Ofast
-O3
-ffast-math