Я не могу найти ничего, что объясняет редкость.
Инструкция x86 может иметь не более одного ModR / M + SIB + disp0 / 8/32.Таким образом, существует ноль инструкций с двумя явными операндами памяти.
Все инструкции памяти-памяти x86 имеют по крайней мере один неявный операнд памяти, местоположение которого запекается вкод операции, например push
, который обращается к стеку, или строковые инструкции movs
и cmps
.
Какие исключения?
Я буду использовать[mem]
для обозначения режима адресации ModR / M, который может быть [rdi]
, [RIP+whatever]
, [ebx+eax*4+1234]
или любым другим.
push [mem]
: читает [mem]
, пишетнеявный [rsp]
(после обновления rsp
). pop [mem]
call [mem]
: считывает новый RIP из [mem]
, помещает адрес возврата в стек. movsb/w/d/q
: читает DS:(E)SI
, записывает ES:(E)DI
(или в 64-битном режиме RSI и RDI).Оба являются неявными;только сегмент DS
reg может быть переопределен.Используется с rep
. cmpsb/w/d/q
: считывает DS:(E)SI
и ES:(E)DI
(или в 64-битном режиме RSI и RDI).Оба являются неявными;только reg-сегмент DS
может быть переопределен.Используется с repe
/ repne
.
MPX bndstx mib, bnd
: "Сохранить границы в bnd и значение указателя в регистре индекса mib длясвязанная таблица (BTE) с трансляцией адресов с использованием базы MIB. "В разделе «Операция» показаны нагрузка и хранилище, но я не знаю достаточно о MPX, чтобы получить его.
movdir64b r16/r32/r64, m512
.Имеет свой собственный бит функций, доступный в следующем Tremont (преемник Goldmont Plus Atom).Перемещает 64 байта как прямое хранилище (WC) с атомарностью записи 64 байта из адреса памяти источника в адрес памяти назначения.Операнд-адресат (выровненный атомарный) es:
/r
из ModRM, источник (не выровненный неатомный) /m
из ModRM.
Использует объединение записи для хранилища, см. Описание.Это первый раз, когда любой поставщик процессоров x86 имеет атомарность шире, чем 8 байтов за пределами lock cmpxchg16b
.Но, к сожалению, на самом деле он не очень хорош для многопоточности, потому что он вызывает поведение вытеснения / обхода NT-подобного кэша, поэтому другим ядрам придется читать его из DRAM вместо общего внешнего кэша.
AVX2инструкции по сбору и разбросу AVX512 являются дискуссионными.Очевидно, они выполняют несколько загрузок / сохранений, но все указатели поступают из одного вектора SIMD (и скалярного основания).
Я не считаю такие инструкции, как pusha
, fldenv
, xsaveopt
, iret
или enter
с уровнем вложенности> 1, которые выполняют несколько операций сохранения или загрузки в непрерывный блок.
Я также не считаю строку ins
/ outs
инструкции, потому что они копируют память в / из пространства ввода / вывода.Пространство ввода / вывода не является памятью.
Я не смотрел инструкции VMX или SGX на http://felixcloutier.com/x86/index.html,, только на основной список.Я не думаю, что я что-то пропустил, но, конечно, мог бы.