-2

以前の Delphi バージョンで XE2 スタイルの丸めを取得するにはどうすればよいのでしょうか?

4

1 に答える 1

2

インライン Delphi アセンブリは、しばらくの間 S​​SE 命令をサポートしています。single と double の 2 つのオーバーロード バージョンが可能です。さらに、パラメーターとして入力するか、ポインターとして入力するかの 2 つのバージョンが可能です。このバージョンは、ネイティブの Round()/Trunc() メソッドよりも特に高速です。

ラウンドするには、次のものがあります。

Function RoundSSE(Value: Single): Integer; Overload;
Asm
  // additional PUSH/POP pointer stack added automatically
  CVTSS2SI  EAX, Value
End;

Function RoundSSE(Value: Double): Integer; Overload;
Asm
  // additional PUSH/POP pointer stack added automatically
  MOVQ      XMM0,Value
  CVTSD2SI  EAX, XMM0
End;

Function RoundMEM_SSE(Var Value: Single): Integer; Overload;
Asm
  // as written, fatest version
  CVTSS2SI  EAX, [Value]
End;

Function RoundMEM_SSE(Var Value: Double): Integer; Overload;
Asm
  // as written, fatest version
  CVTSD2SI  EAX, [Value]
End;

切り捨てるには、CVTTSS2SI / CVTTSD2SI と同じです。

Function TruncSSE(Value: Single): Integer; Overload;
Asm
  // additional PUSH/POP pointer stack added automatically
  CVTTSS2SI  EAX, Value
End;

Function TruncSSE(Value: Double): Integer; Overload;
Asm
  // additional PUSH/POP pointer stack added automatically
  MOVQ      XMM0,Value
  CVTTSD2SI  EAX, XMM0
End;

Function TruncMEM_SSE(Var Value: Single): Integer; Overload;
Asm
  // as written, fatest version
  CVTTSS2SI  EAX, [Value]
End;

Function TruncMEM_SSE(Var Value: Double): Integer; Overload;
Asm
  // as written, fatest version
  CVTTSD2SI  EAX, [Value]
End;

Floor、Ceil には、それぞれ *TruncMEM_SSE(value)* とRoundSSE(value + 0.5)を使用します。これらの機能により、パフォーマンスが 20% 向上します。ループおよび実際のプログラムでテストされています (メモリ キャッシュがいっぱい/命令キャッシュがいっぱいになっているため、実際のテストと見なすことができます)。

于 2012-10-08T13:22:06.913 に答える