Gcc 使用ARM内联组件的VFP
我正在尝试编写一个简单的函数来使用我的beagleboard上的VFP。然而,我ḿ 获取以下错误:应在´:´标记之前出现´)´。代码如下:Gcc 使用ARM内联组件的VFP,gcc,assembly,arm,beagleboard,Gcc,Assembly,Arm,Beagleboard,我正在尝试编写一个简单的函数来使用我的beagleboard上的VFP。然而,我ḿ 获取以下错误:应在´:´标记之前出现´)´。代码如下: float floatmod(float a, float b) { float result; __asm__volatile__( "VMOV.F32 s7, %p[a]" "VMOV.F32 s8, %p[b]" "VDIV.F32 s9, s7, s8" "VMLS.F3
float floatmod(float a, float b) {
float result;
__asm__volatile__(
"VMOV.F32 s7, %p[a]"
"VMOV.F32 s8, %p[b]"
"VDIV.F32 s9, s7, s8"
"VMLS.F32 s7, s8, s9"
:s7 "=t" (c)
:[a] "t" (a), [b] "t" (b)
:"s7", "s8", "s9"
);
return c;
}
我ḿ 对于内联汇编来说相当陌生,所以我可能犯了一些错误您应该用分号
结束每一行代码>或带有换行符\n
:
__asm__ __volatile__(
"VMOV.F32 s7, %p[a];"
"VMOV.F32 s8, %p[b];"
"VDIV.F32 s9, s7, s8;"
"VMLS.F32 s7, s8, s9;"
:s7 "=t" (c)
:[a] "t" (a), [b] "t" (b)
:"s7", "s8", "s9"
);
顺便说一句,Beagleboard支持NEON,NEON比Cortex-A8(Beagleboard内部的CPU核心)上的VFP快得多。你应该用分号结束每一行代码>或带有换行符\n
:
__asm__ __volatile__(
"VMOV.F32 s7, %p[a];"
"VMOV.F32 s8, %p[b];"
"VDIV.F32 s9, s7, s8;"
"VMLS.F32 s7, s8, s9;"
:s7 "=t" (c)
:[a] "t" (a), [b] "t" (b)
:"s7", "s8", "s9"
);
顺便说一句,Beagleboard支持NEON,NEON比Cortex-A8(Beagleboard内部的CPU核心)上的VFP快得多。另一种选择是简单地使用多行字符串:
__asm__volatile__("
VMOV.F32 s7, %p[a]
VMOV.F32 s8, %p[b]
VDIV.F32 s9, s7, s8
VMLS.F32 s7, s8, s9
"
:s7 "=t" (c)
:[a] "t" (a), [b] "t" (b)
:"s7", "s8", "s9"
);
这也适用于汇编程序,其中
不是语句分隔符(有些汇编程序使用分号作为注释指示符)。它仍然使您不必在每行输入\n
。另一种选择是简单地使用多行字符串:
__asm__volatile__("
VMOV.F32 s7, %p[a]
VMOV.F32 s8, %p[b]
VDIV.F32 s9, s7, s8
VMLS.F32 s7, s8, s9
"
:s7 "=t" (c)
:[a] "t" (a), [b] "t" (b)
:"s7", "s8", "s9"
);
这也适用于汇编程序,其中
不是语句分隔符(有些汇编程序使用分号作为注释指示符)。它仍然为您节省了在每一行中必须输入<代码> \n>代码>。您可能想考虑使用内含函数而不是原始ASM,这样可以节省很多时间和麻烦。ḿ 试图加速一个程序-本质并没有帮助://每一个内在的映射到一个ASM指令,所以对于上述非常简单的情况,如果本质上没有帮助,那么原始ASM不太可能做得更好。你可能想考虑使用本质而不是原始ASM,这会节省很多时间和麻烦。ḿ 试图加速一个程序-intrinsic没有帮助:/Well每个内在映射到一条asm指令,因此对于上述非常简单的情况,如果intrinsic没有帮助,那么原始asm不可能做得更好。