Как обнулить определенный байт в регистре XMM?

Я хочу знать, есть ли простой эффективный способ сделать следующее

дано:

sample       db   'hello worldxxxxx'
sample_len   db   11

Я бы хотел:

movdqa xmm0, [sample]
; here I want to put a zero in the 11th byte of xmm0 (11 coming from [sample_len].
; I don't want to modify the original data.

Байты выше чем [sample_len] может быть обнулен или нет, не имеет значения. Я знаю, что могу сделать это с помощью полдюжины инструкций sse и / или используя pcmpestrm и т.д., но я надеюсь, что есть гораздо более простой и эффективный способ. Кажется, что такое простое банальное требование, я удивлен, если нет более простого решения.

1 ответ

Если размер известен во время компиляции, вы можете использовать пару команд сдвига, например, так:

PSLLDQ xmm0, (16 - 11) * 8
PSRLDQ xmm0, (16 - 11) * 8

Вы также можете использовать PAND инструкция. Однако для этого требуется другое 128-битное число:

; if in a loop, you would pre-load the mask in a register
MOVDQA xmm1, [mask]
PAND xmm0, xmm1

; if one time event, directly access memory
PAND xmm0, [mask]

Вы можете построить маску в стеке, если вам нужно определить ее динамически. Просто убедитесь, что он правильно выровнен...

Другие вопросы по тегам