Как я понимаю, они имеют в виду, что VPSUBQ zmm0{k2}{z},zmm1,zmm2
и
VPSUBQ zmm0{k2},zmm1,zmm2
- это две разные инструкции, кодировка которых отличается одним битом, называемым "бит z". (Это определенно часть префикса EVEX к инструкции. Документы Википедии все поля)
Таким образом, вы "устанавливаете бит z", указав {z}
в исходном коде ассемблера, сообщив ассемблер для генерации инструкции с соответствующим установленным битом. Это задокументировано во многих местах, например, в руководстве по набору инструкций Intel vol.2, и в некоторой степени в руководстве Intel по встроенным функциям с версиями mask (слияния-маски) и maskz (нуля-маскирования) большинства встроенных функций)
Это , а не физический бит в состоянии ЦП, такой как флаг направления или что-то подобное, который будет сохраняться от одной инструкции к следующей. Не имеет смысла «проверять» его.
Чтобы проиллюстрировать, вот что я получаю, собирая обе версии:
00000000 62F1F5CAFBC2 vpsubq zmm0{k2}{z},zmm1,zmm2
00000006 62F1F54AFBC2 vpsubq zmm0{k2},zmm1,zmm2
Обратите внимание, что кодировки отличаются старшим битом четвертого байта. Это ваш «бит z».
Может быть, вы думали, что можете «установить» или «очистить» бит z во время выполнения, таким образом, изменив эффект маскирования последующих инструкций? Так как это часть кодирования каждой инструкции, а не состояние процессора, этот способ мышления работает только в том случае, если вы выполняете команды JIT на лету или используете самоизменяющийся код.
В «нормальном» режиме впереди код, вам придется писать код в обеих версиях, один раз с инструкциями {z}
и один раз без. Используйте условный переход, чтобы решить, какую версию выполнить.