delphi - language - list of x86 instructions
Instrucción FLD x64 bit (2)
Tengo un pequeño problema con la instrucción FLD en x64 bit ... quiero cargar el valor Double en la FPU del puntero de pila en el registro st0, pero parece ser imposible. En Delphi x32, puedo usar este código:
function DoSomething(X:Double):Double;
asm
FLD X
// Do Something ..
FST Result
end;
Desafortunadamente, en x64, el mismo código no funciona.
Delphi hereda la Convención de llamadas de Microsoft x64 . Por lo tanto, si los argumentos de función / procedimiento son flotante / doble, se pasan en los registros XMM0L, XMM1L, XMM2L y XMM3L.
Pero puede usar var
before parameter como una solución alternativa como:
function DoSomething(var X:Double):Double;
asm
FLD qword ptr [X]
// Do Something ..
FST Result
end;
En el modo x64, los parámetros de coma flotante se pasan en xmm-registers. Entonces, cuando Delphi intenta compilar FLD X, se convierte en FLD xmm0 pero no hay tal instrucción. Primero debe moverlo a la memoria.
Lo mismo ocurre con el resultado, se debe pasar de nuevo en xmm0.
Pruebe esto (no probado):
function DoSomething(X:Double):Double;
var
Temp : double;
asm
MOVQ qword ptr Temp,X
FLD Temp
//do something
FST Temp
MOVQ xmm0,qword ptr Temp
end;