2013-05-21 1 views
0

Я пытаюсь написать простую функцию для использования VFP на моем beagleboard. Тем не менее, я получаю следующее сообщение об ошибке: expected ')' before ':'. Вот код:VFP с использованием встроенной сборки ARM

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; 

}

Im довольно новый встраивать сборки, так что я мог бы сделать какие-то ошибки

+0

Возможно, вы захотите рассмотреть возможность использования intrinsics для этого, а не для сырого asm - это сэкономит массу времени и проблем. –

+0

Iḿ, пытающийся ускорить программирование, не помогло:/ – fussy

+0

Хорошо, что каждая внутренняя карта соответствует одной инструкции asm, поэтому для этого очень простого случая, если intrinsics не помогло, тогда исходный asm вряд ли будет лучше. –

ответ

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 и неон много быстрее, чем VFP на Cortex-A8 (ядро CPU внутри Beagleboard)

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 на каждую строку.

 Смежные вопросы

  • Нет связанных вопросов^_^