Я рассматривал различные методы вычисления квадратного корня, в частности один (sqrt14 из здесь) привлек мое внимание, к сожалению, он был написан на C++ (он использует только ассемблер), мне сложно перевести его обратно на C - если это возможно.
double inline __declspec (naked) __fastcall sqrt14(double n)
{
_asm fld qword ptr [esp+4]
_asm fsqrt
_asm ret 8
}
Как видно здесь, вставка сборки в C++ отличается от C.
Я хотел спросить вас, возможно ли иметь эквивалент C, и если да, могу ли я попросить вас написать его? Если это полезно, моя архитектура 64-битная.
Я подозреваю, что объявление функции будет таким:
double inline __attribute__((fastcall, naked)) sqrt14(double n);
... но я недостаточно знаю об ассемблере, чтобы сделать все остальное...
sqrt
илиsqrtf
изmath.h
? - person fuz   schedule 25.01.2021-fno-math-errno
и функций стандартной библиотеки. Это заставит gcc генерировать соответствующие инструкции SSE для квадратных корней вместо библиотечных вызовов. Также не забудьте скомпилировать с включенной оптимизацией. Если вы зададите новый вопрос с более подробной информацией о конкретном коде, который вы пытаетесь оптимизировать, я смогу дать более конкретные ответы. - person fuz   schedule 27.01.2021static inline double sqrt14(double x) { asm("fsqrt" : "+t"(x)); return (x); }
. Однако обратите внимание, что это, вероятно, будет медленнее, чем вызовsqrt()
изmath.h
. - person fuz   schedule 27.01.2021