2010-01-26 3 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 зарегистрироваться в step2, изменение ФФ к 00-х и 00-х годов к FF, а затем выполните a и MM1 и, наконец, a или объедините их.

Если бы я был в состоянии получить:

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? Как я могу инвертировать биты, доказывая, что у меня есть только команды AND, OR, XOR и NAND, доступные в регистрах MMX?

Любой ответ очень приветствуется. Благодарю.

+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; 
Смежные вопросы