Я уверен, что есть несколько способов сделать это. Например, должно работать следующее:
1) сделать (или загрузить) маску из 5 и одну из 2 в двух mmx
регистрах (mm0
- mm7
)
2) загрузить данные в другой регистр mmx, например, используя MOVQ
3) сравнить регистр, содержащий данные для проверки, с маской 2, например. используя PCMPEQB
, это приведет к маске FFh
и 00h
в зависимости от того, был ли элемент в регистре равен 2 или нет
4) используйте MASKMOVQ
, регистр с 5 и маску, сгенерированную при сравнении, чтобы выборочно записать 5 в те позиции, которые ранее занимали 2. MASKMOVQ
будет хранить данные для позиций маски, которые содержали значения FFh
.
5) Повторяйте это до конца.
6) в конце введите EMMS
для выхода из состояния MMX. Также введите команду SFENCE
или MFENCE
в конце процедуры (потому что MASKMOVQ
генерирует невременный намек).
Если вы используете MMX, а не XMM, вам не придется беспокоиться о выравнивании.
Редактировать: Если у вас возникли проблемы с подробностями инструкций, Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32, Справочник по наборам инструкций (тома 2A и 2B), должно содержать все, что вы когда-либо хотели узнать , Вы можете найти их здесь .