VFP使用ARM内联汇编

时间:2013-05-21 15:49:11

标签: 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.F32 s7, s8, s9"
        :s7 "=t" (c)
        :[a] "t" (a), [b] "t" (b)
        :"s7", "s8", "s9"
        );      
        return c;

}

我对内联汇编很新,所以我可能犯了一些错误

2 个答案:

答案 0 :(得分:2)

您应该以分号;或换行符号\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"
);
BTW,Beagleboard支持NEON,NEON比Cortex-A8(Beagleboard内部的CPU核心)上的VFP 更强更快

答案 1 :(得分:1)

另一种选择是简单地使用多行字符串:


__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