【问题标题】:VFP using ARM inline assembly使用 ARM 内联汇编的 VFP
【发布时间】:2013-05-21 15:49:11
【问题描述】:

我正在尝试编写一个简单的函数来在我的 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;

}

我对内联汇编相当陌生,所以我可能犯了一些错误

【问题讨论】:

  • 您可能要考虑为此使用内在函数而不是原始 asm - 这会节省大量时间和麻烦。
  • 我试图加速程序 - 内在函数没有帮助:/
  • 每个内在函数都映射到一个 asm 指令,因此对于上述非常简单的情况,如果内在函数没有帮助,那么原始 asm 不太可能做得更好。

标签: gcc assembly arm beagleboard


【解决方案1】:

您应该以分号; 或换行符\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快得多

【讨论】:

    【解决方案2】:

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

    
    __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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多