6

次の関数は、64 ビットの Delphi XE2 コンパイラではコンパイルできません。(エラーはすべてfld指示に関連しています。)

[dcc64 Error] Project1.dpr(12): E2116 Invalid combination of opcode and operands 
[dcc64 Error] Project1.dpr(13): E2116 Invalid combination of opcode and operands
[dcc64 Error] Project1.dpr(20): E2116 Invalid combination of opcode and operands

12行目と13行目:

fld Y
fld X

20行目:

fld X

残念ながら、私にはアセンブリ スキルがなく、64 ビットに移植する必要があるこのサード パーティ コードを使用しています。32ビットと64ビットの両方で動作するようにするのを手伝ってもらえますか?

function PartArcTan(Y, X: Extended): Extended;
asm
  fld Y              // st(0) = Y
  fld X              // st(0) = X
  fpatan             // st(0) = ArcTan(Y, X)
  fwait
end;

function ArcSin(X: Extended): Extended; // -1 <= X <= 1
asm
  fld X               // st(0) = X
  fld st(0)           // st(1) = X
  fmul st(0), st(0)   // st(0) = Sqr(X)
  fld1                // st(0) = 1
  fsubrp st(1), st(0) // st(0) = 1 - Sqr(X)
  fsqrt               // st(0) = Sqrt(1 - Sqr(X))
  fpatan              // st(0) = ArcTan(X, Sqrt(1 - X*X))
  fwait
end;
4

2 に答える 2

3

x64 は引き続き従来の浮動小数点ユニットをサポートしますが、別の ABI に従うようにコードを調整する必要があります。

x32/x64 の例:

function PartArcTan(X: double): double;
asm
{$IFDEF CPUX64}
        movq [rsp-8], xmm0
        fld    qword ptr [rsp-8]
{$ELSE}
        fld    qword ptr X
{$ENDIF}
        fld1
        fpatan
        fwait
{$IFDEF CPUX64}
        fstp   qword ptr [rsp-8]
        movq   xmm0, [rsp-8]
{$ENDIF}
end;
于 2013-12-24T17:42:42.520 に答える