たとえば、長さが 8 の倍数のバイトのベクトルが与えられた場合、mmx 命令を使用してすべての 2 を 5 に変換するにはどうすればよいでしょうか?
.data
v1 BYTE 1, 2, 3, 4, 1, 2, 3, 4
ありがとう。
編集: 2 と 5 は単なる例です。これらは実際にはプロシージャのパラメータです。
これを行うにはいくつかの方法があると確信しています。たとえば、次のように機能するはずです。
1)2つのmmx
レジスタに5と2の1つのマスクを作成(またはロード)します(mm0
- mm7
)
2)データを別のmmxレジスタにロードします。MOVQ
3)テストするレジスタ保持データを2のマスクと比較します。たとえば、を使用すると、レジスタ内の要素が2であるかどうかに応じて、PCMPEQB
のマスクが生成されます。FFh
00h
4)MASKMOVQ
、5のレジスタ、および比較によって生成されたマスクを使用して、以前に2を保持していた位置に5を選択的に書き出します。MASKMOVQ
値を保持したマスク位置のデータを保存しFFh
ます。
5)終了するまでこれを繰り返します。
6)最後に、EMMS
MMX状態を終了するために発行します。また、ルーチンの最後にSFENCE
or命令を発行します(非一時的なヒントを生成するため)。MFENCE
MASKMOVQ
XMMではなくMMXを使用する場合は、位置合わせについて心配する必要はありません。
編集:手順の詳細に問題がある場合は、インテル®64およびIA-32アーキテクチャーソフトウェア開発者マニュアルの手順セットリファレンス(ボリューム2Aおよび2B)に、知りたいことがすべて含まれている必要があります。あなたはここでそれらを見つけることができます。