Встроенная сборка MSVC в GCC (с параметром и возвратом) - PullRequest
0 голосов
/ 26 апреля 2018
inline float sqrt2(float sqr)
{
    float root = 0;

    __asm
    {
    sqrtss xmm0, sqr
    movss root, xmm0
    }

    return root;
}

вот встроенная сборка компилятора MSVC, которую я хочу скомпилировать с gcc x86; я знаю, что встроенная сборка gcc вызывается с помощью asm («здесь asm»); но я совершенно не знаю, как включить параметр в это, результат получается с помощью "= r", который я знаю только.

Что должно привести к чему-то такому:

asm("sqrtss xmm0, %1\n\t"
        "movss %0, xmm0"
        : "=r" (root)
        : "r" (sqr));

1 Ответ

0 голосов
/ 26 апреля 2018

Ограничение r предназначено для регистров общего назначения. x для xmm. Обратитесь к руководству для получения более подробной информации. Кроме того, если вы используете mov во встроенном ассемблере, вы, вероятно, делаете это неправильно.

inline float sqrt2(float sqr)
{
    float root = 0;

    __asm__("sqrtss %1, %0" : "=x" (root) : "x" (sqr));

    return root;
}

Обратите внимание, что gcc полностью способен генерировать инструкцию sqrtss из sqrtf вызова библиотечной функции. Вы можете использовать -fno-math-errno, чтобы избавиться от незначительных накладных расходов при проверке ошибок.

...