以前の Delphi バージョンで XE2 スタイルの丸めを取得するにはどうすればよいのでしょうか?
質問する
557 次
1 に答える
2
インライン Delphi アセンブリは、しばらくの間 SSE 命令をサポートしています。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 に答える