Вы можете сделать это с помощью команды SSSE3 PSHUFB
следующим образом (32-разрядная сборка MASM)
.data
align 16
mask db 0,0,0,0, 4,4,4,4, 8,8,8,8, 12,12,12,12
.code
; value in XMM0 ; 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
pshufb xmm0, xmmword ptr [mask] ; 12 12 12 12 08 08 08 08 04 04 04 04 00 00 00 00
То, что выходные данные соответствуют маске, совпадает.
В данный момент я не могу проверить это, порядок байтов маски может быть обратным.Но вы должны понять.
В любом случае: позаботьтесь о выравнивании, потому что
Когда исходный операнд является 128-битным операндом памяти, операнд должен быть выровнен по 16-байтовая граница или исключение общей защиты (#GP).