Вам не нужно использовать устаревшие регистры стека x87 в коде x86-64, поскольку SSE2 является базовой линией, обязательной частью x86-64 ISA. Вы можете и должны выполнять скалярные вычисления FP, используя addsd
, mulsd
, sqrtsd
и т. д. on, на регистрах XMM. (Или addss
для поплавка)
Соглашение о вызовах Windows x64 передает аргументы float/double FP в XMM0..3, если они являются одним из первых четырех аргументов функции. (т.е. 3-й общий аргумент идет в xmm2, если это FP, а не 3-й аргумент FP идет в xmm2.) Он возвращает значения FP в XMM0.
Используйте x87 только в том случае, если вам действительно нужна 80-битная точность внутри вашей функции. (Такие инструкции, как fsin
и fyl2x
, небыстры и обычно могут быть выполнены обычными математическими библиотеками с использованием инструкций SSE/SSE2.
function times2(X:Double):Double;
asm
addsd xmm0, xmm0 // upper 8 bytes of XMM0 are ignored
ret
end
Сохранение в памяти и перезагрузка в регистр x87 стоит вам около 10 циклов задержки без какой-либо выгоды. Скалярные инструкции SSE/SSE2 так же быстры или даже быстрее, чем их эквиваленты x87, и их легче программировать и оптимизировать, поскольку вам никогда не понадобится fxch
; это плоский дизайн регистра, а не стек. (https://agner.org/optimize/). Кроме того, у вас есть 15 регистров XMM.
Конечно, обычно встроенный ассемблер вообще не нужен. Это может быть полезно для ручной векторизации, если компилятор не сделает этого за вас.
person
Peter Cordes
schedule
04.09.2018
Extended
. И это показывает, что Delphi Win64 не использует FPU (x86). Вместо этого он использует SSE. Таким образом, использование инструкций FPU проблематично. Также будьте осторожны при использовании BAsm x64 - есть ошибки, которые уничтожают данные или даже инвертируют поток управления программой. - person Arioch 'The   schedule 03.04.2013