1

BYTE-> BYTE、WORD-> WORD、DWORD->DWORDおよびWORD-> BYTE(結果に8ビットのみが存在すると仮定)。プロセッサのタイプに応じて、タイプごとに3つのルーチンが必要です(SSE2がサポートされ、MMXのみがサポートされ、標準の命令のみがサポートされます)。したがって、合計12個の関数が必要です。

必要なレジスタをバックアップおよび復元する方法、ループを作成する方法、データを通常のレジスタまたはMMXレジスタにコピーする方法、および論理的に1桁シフトする方法をすでに自分で見つけました。

私はそれについてのアセンブリ言語に精通していないので。各命令セットにどのレジスタを使用する必要がありますか?L1キャッシュ内の大きなベクター(画像)の可用性はどのように最適化されますか?ベクトルの次の要素(ポインターのようなもの)を見つけるにはどうすればよいですか?アドレスで移動できることはわかっていますが、データの種類に応じてアドレスを1、2、または4ずつインクリメントする必要があると思いますか?

私はすべてのアイデアを持っていますが、この時点でコードを書くのは少し難しいです。

ありがとうございました。

アルノー。

編集:これは、DWORDで1シフトするためにMMXに対して実行しようとしていることです。

__asm("push mm"); // backup register
__asm("push cx"); // backup register
__asm("mov %cx, length"); // initialize loop
__asm("loopstart_shift1:"); // start label
__asm("movd %xmm0, r/m32"); // get 32 bits data
__asm("psrlq %xmm0, 1"); // right shift 32 bits data logically (stuffs 0 on the left) by 1
__asm("mov r/m32,%xmm0"); // set 32 bits data
__asm("dec %cx"); // decrement index
__asm("cmp %cx,0");
__asm("jnz loopstart_shift1");
__asm("pop cx"); // restore register
__asm("pop mm"); // restore register
__asm("emms"); // leave MMX state
4

2 に答える 2

1

生の asm を書き込もうとするのではなく、一時停止して C または C++ で組み込み関数を使用することを検討することを強くお勧めします。そうすれば、C/C++ コンパイラがすべてのレジスタ割り当て、命令スケジューリング、および一般的なハウスキーピング タスクを処理し、 psrlqsee _m_psrlqinを使用する代わりに、重要な部分に焦点を当てmmintrin.hます。(さらに良いことに、128 ビット SSE 組み込み関数の使用を検討してください。)

于 2011-06-24T10:32:08.853 に答える
0

BitMagicのソースを使用するか調べることで利益が得られるようです。その完全な組み込み関数もベースであるため、はるかに移植性が高くなります (ただし、GCC を使用しているように見えるため、MSVC から GCC 組み込み関数へのマッピングを取得する必要がある場合があります)。

于 2011-06-24T13:07:10.607 に答える