0

たとえば、長さが 8 の倍数のバイトのベクトルが与えられた場合、mmx 命令を使用してすべての 2 を 5 に変換するにはどうすればよいでしょうか?

.data
v1 BYTE 1, 2, 3, 4, 1, 2, 3, 4

ありがとう。

編集: 2 と 5 は単なる例です。これらは実際にはプロシージャのパラメータです。

4

1 に答える 1

6

これを行うにはいくつかの方法があると確信しています。たとえば、次のように機能するはずです。

1)2つのmmxレジスタに5と2の1つのマスクを作成(またはロード)します(mm0- mm7

2)データを別のmmxレジスタにロードします。MOVQ

3)テストするレジスタ保持データを2のマスクと比較します。たとえば、を使用すると、レジスタ内の要素が2であるかどうかに応じて、PCMPEQBのマスクが生成されます。FFh00h

4)MASKMOVQ、5のレジスタ、および比較によって生成されたマスクを使用して、以前に2を保持していた位置に5を選択的に書き出します。MASKMOVQ値を保持したマスク位置のデータを保存しFFhます。

5)終了するまでこれを繰り返します。

6)最後に、EMMSMMX状態を終了するために発行します。また、ルーチンの最後にSFENCEor命令を発行します(非一時的なヒントを生成するため)。MFENCEMASKMOVQ

XMMではなくMMXを使用する場合は、位置合わせについて心配する必要はありません。

編集:手順の詳細に問題がある場合は、インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルの手順セットリファレンス(ボリューム2Aおよび2B)に、知りたいことがすべて含まれている必要があります。あなたはここでそれらを見つけることができます。

于 2010-01-24T18:52:25.967 に答える