2010-01-26 66 views
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,我想我會反轉MM0在第二步登記,變更FF的00年代和00的到FF的,然後做一個MM1,最後一個或合併這兩個。

如果我能得到:

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指令可用?

任何答案非常感謝。謝謝。

+2

所以......有什麼問題嗎?看起來你已經自己回答了。 –

+0

在我的問題中,可以閱讀:「如果我能夠得到」,這意味着我還沒有,並正在問你如何。 – nunos

回答

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. 
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;