1

これは非常に単純ですが、まだ理解できていません。

この質問はアセンブリ mmx に関するものですが、これは純粋な論理です。

次のシナリオを想像してください。

MM0: 04 03 02 01 04 03 02 01  <-- input  
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01  <-- copy of input

after pcmpgtw MM0, MM1

MM0: FF FF 00 00 FF FF 00 00  <-- words where MM0 is greater than MM1 (comparing words)  
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01

after pand MM0, MM2  

MM0: 04 03 00 00 04 03 00 00  <-- almost there...
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01  

私が知りたいのは、MM0 のゼロを 02 で埋めることです。ステップ 2 で MM0 レジスタを反転し、FF を 00 に、00 を FF に変更し、and を MM1 に変更し、最後に or をマージする必要があると思います。 2。

私が得ることができた場合:

MM3: 00 00 FF FF 00 00 FF FF

then, pand MM2, MM3

MM1: 04 03 00 00 04 03 00 00  
MM2: 00 00 02 02 00 00 02 02

finally por MM0, MM1 would give me the desired outcome:

MM0: 04 03 02 02 04 03 02 02  <-- Aha!

要約すると、その MM3 レジスタを 00 00 FF FF 00 00 FF として取得するにはどうすればよいですか? ビットを反転して、MMX レジスタで AND、OR、XOR、および NAND 命令しか使用できないことを証明するにはどうすればよいですか?

どんな答えでも大歓迎です。ありがとう。

4

2 に答える 2

1

だからあなたはその時を持っていますmask = 0xFFFF0000FFFF0000;

all_ones = 0xFFFFFFFFFFFFFFFF;

inverted_mask = mask XOR all_ones;

M0とM1のマージは次のとおりです。

M0 = M0 AND mask;
M1 = M1 AND inverted_mask;
M0 = M0 OR M1;

これにより、M0とM1が適切に編集され、それらの値が破棄されます。M1を保持したい場合は、中間結果を一時変数/レジスタ/メモリに格納する必要があります。

M0 = M0 AND mask;
TEMP = M1 AND inverted_mask;
M0 = M0 OR TEMP;
于 2010-01-26T02:05:27.540 に答える
1

pcmpgtw を使用してマスクを生成し、引数の順序を入れ替えることもできます。そうすれば、レジスタを保存できます。

MM0: 04 03 02 01 04 03 02 01  <-- input  
MM1: 02 02 02 02 02 02 02 02  
MM2: 04 03 02 01 04 03 02 01  <-- copy of input


pcmpgtw MM0, MM1    ; MM0 = FF FF 00 00 FF FF 00 00 
pcmpgtw MM1, MM2    ; MM1 = 00 00 FF FF 00 00 FF FF

マスク生成中に破棄されるため、MM1 引数のコピーを作成する必要がある場合がありますが、これは多くの場合、64 ビット定数をロード/生成するよりも高速です。

別の方法は、PNAND を使用することです。

pcmpgtw MM0, MM1    ; MM0 = FF FF 00 00 FF FF 00 00 

pand    MM2, MM0    ; leave bytes with FF intact 
pnand   MM1, MM0    ; leave bytes with 00 intact 
por     MM1, MM2    ; combine the results.
于 2010-02-24T15:53:32.637 に答える