2010-01-26 65 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;