avx512F kmovw mov слово за словом - PullRequest
0 голосов
/ 12 октября 2019

У меня вопрос по инструкции AVX512F - kmovw. у меня есть 8-байтная маска в регистре K0, которую можно использовать с помощью kmovq и переместить ее в 8-байтный регистр или зарезервированную память (8-байт). но kmovq работает только в AVX512BW, а для AVX512F нам нужно использовать kmovw. но эта инструкция перемещает только 16 бит, поэтому нам нужно переместить маску 4 раза, какая из них правильная?

sub     esp, 8
kmovw   ax, k0
... (do the job with AX)
kmovw   ax, k0 + 2
... (do the job with AX)
kmovw   ax, k0 + 4
... (do the job with AX)
kmovw   ax, k0 + 6
... (do the job with AX)
add     esp, 8

или

sub     esp, 8
kmovw   ax, [k0]
... (do the job with AX)
kmovw   ax, [k0 + 2]
... (do the job with AX)
kmovw   ax, [k0 + 4]
... (do the job with AX)
kmovw   ax, [k0 + 6]
... (do the job with AX)
add     esp, 8

на самом деле мой вопрос о том, как использовать k0слово за словом ... используя [] или просто добавив его к N

, например,

, этот код работает в AVX512BW (из-за 'kmovq')

vmovdqu64       zmm0, [rax]      ; rax = string
vpcmpeqb        k0, zmm0, zmm1   ; zmm1 = 0
kortestq        k0, k0
...
...
kmovq   rbx, k0
tzcnt   rbx, rbx
add     rax, rbx

но если я хочу использовать только AVX512F, что мне делать с kmovq?

1 Ответ

1 голос
/ 13 октября 2019

Ни один из ваших кодов не имеет никакого смысла. Вы не можете использовать ax в качестве регистра маски в таких инструкциях, как vaddps zmm0{k1}{z}, zmm1, zmm2. И kmov не берет смещения для извлечения, и нет синтаксиса, подобного [k0 + 2]. Если бы существовала инструкция извлечения, аналогичная pextrw, она не использовала бы квадратные скобки.


И вы не можете получить 64-битное значение в регистр маски в первомПоместить без AVX512BW : единственные инструкции по настройке маски в AVX512F используют элементы dword или qword и, таким образом, создают не более 16 битов маски. И kmov / другие k инструкции доступны только с размером операнда до 16 бит, например kunpcklbw.

ЦП с AVX512F, но не AVX512BWможет иметь только 16-битные регистры шириной k.

Без AVX512BW вы ничего не можете сделать, чтобы считывать или записывать старшие биты регистра k.

За исключением, возможно, xsave или xsaveopt или что-то еще;для него не требуется AVX512BW, но он будет выгружать все содержимое векторного состояния в память, где вы можете загрузить 64-битные значения регистров маски. Это вряд ли будет полезно;Я только упоминаю это как исключение из утверждения, что вы ничего не можете сделать без AVX512BW.


Не избегайте AVX512BW в коде, который зависит от того, что AVX512BW поместил 64-битное значение в регистр маски.

...