Перемещение в регистры с плавающей запятой -вместо стека

У меня есть функция, которая должна быть максимально быстрой, и она использует только целочисленные операции. Он работает на архитектуре AMD64, и мне нужно сделать несколько push/pop, чтобы иметь достаточное количество регистров для работы. Теперь мне интересно, x64 ABI утверждает, что первые четыре регистра с плавающей запятой -(XMM0, XMM1, XMM2 и XMM3 )являются энергозависимыми и не нуждаются в сохранении при вызовах функций.

Поэтому я решил, что могу хранить 64 -битных регистра, которые мне нужно сохранить, в младших 64 битах этих регистров (, то есть MM0, MM1,... )с помощью movq (MMX или набора инструкций SSE )вместо использования стека, сэкономив себе несколько операций загрузки/сохранения памяти.Кроме того, мне не нужно было бы сохранять состояние FPU с помощью EMMS -, что противоречило бы цели -, поскольку я на самом деле не манипулирую регистрами с плавающей запятой -, а только использую их как хранилище (, и в любом случае, Блок x87 почти не используется под x64, так как он по существу вытеснен SSE)

Я сделал модификацию, и она работает (никаких сбоев, и заметное увеличение производительности на 4% ), но мне интересно, действительно ли работает этот «хак» или он приведет к каким-то конкретным побочным эффектам, которые я мог пропустить (например, повреждение состояния FPU, хотя я им не пользуюсь, и тому подобное ). И будет ли загрузка/сохранение в регистр FPU всегда быстрее, чем загрузка/сохранение в память на любой текущей архитектуре?

И да, эта оптимизация действительно необходима. И, честно говоря, это не то, что сильно снизит затраты на обслуживание кода, одного -строчного комментария будет достаточно, чтобы объяснить трюк. Так что, если я смогу бесплатно получить на пару тактов на байт без непредвиденных последствий, я с радостью их возьму:)

Спасибо.

6
задан Thomas 14 July 2012 в 16:01
поделиться