2

VisualStudioとIDEの両方でG++4.6.1を使用してアセンブリコードをコンパイルする必要があります。-masm = intelフラグは、変数を参照およびアドレス指定しない限り機能しますが、これを行う必要があります。

組み込み関数の使用を検討しましたが、コンパイルされたアセンブリはまったく最適ではありません(たとえば、使用するsseレジスタを定義できないため、パイプの最適化はできません)。

コードのこれらの部分を検討してください(インテスタイルアセンブリ):

mov       ecx, dword ptr [p_pXcoords]
mov       edx, dword ptr [p_pYcoords]
movhpd    xmm6, qword ptr [oAvgX]
movhpd    xmm7, qword ptr [oAvgY]
movlpd    xmm6, qword ptr [oAvgX]
movlpd    xmm7, qword ptr [oAvgY]

ここで、p_pXcoordsとp_pYcoordsはdouble *配列と関数パラメーターであり、oAvgXとoAvgYはdouble値を単純化したものです。

別のコード行はこれです。これは、アセンブリブロックの真ん中にあります。

movhpd    xmm6, qword ptr [oAvgY]

つまり、変数にアクセスして、コードの途中にある特定のsseレジスタ内でそれらを使用する必要があります。AT&T構文でこれを行うにはどうすればよいですか?-masmフラグを使用してg ++コンパイラでこれを行うことはできますか?

VSとg++4.6.1ベースのコンパイラの両方に1つのアセンブリコードを使用する方法はありますか

4

1 に答える 1

2

各変数に使用するSSEレジスタをGCCに確実に伝えることができます。

register __m128i x asm("xmm6");

しかし、VSはそれをサポートしていないと思います。(まともなパフォーマンスのためにそれが必要なことにも少し驚いています。レジスタの割り当てと命令スケジューリングは、最適化コンパイラが知っている最も基本的なことの2つです。最適化を有効にしたことを確認してください:-)?)

私はおそらく2つの関数を書くでしょう。1つは組み込み関数を使用し、もう1つはasmを使用して、コンパイラが命令を適切にスケジュールする方法を知らない場合に使用します。

于 2012-11-08T14:13:08.193 に答える