delphiassemblyx86-64fpubasm

FLD instruction x64 bit


I have a little problem with FLD instruction in x64 bit ... want to load Double value to the stack pointer FPU in st0 register, but it seem to be impossible. In Delphi x32, I can use this code :

function DoSomething(X:Double):Double;
asm

  FLD    X
   // Do Something ..
  FST Result

end;

Unfortunately, in x64, the same code does not work.


Solution

  • In x64 mode floating point parameters are passed in xmm-registers. So when Delphi tries to compile FLD X, it becomes FLD xmm0 but there is no such instruction. You first need to move it to memory.

    The same goes with the result, it should be passed back in xmm0.

    Try this (not tested):

    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;