Это очень просто, но я пока не смог понять.
Этот вопрос касается сборки 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, а затем делать a и 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?
Любой ответ с благодарностью. Спасибо.