Under construction!

URL данного справочника
emc.orgfree.com/RISC-V/hb


Навигатор

home My RISC-V home

индекс Индекс

Инструкции
расширения A
(атомарные операции)

handbook

RV32A

RV64A


Evgeny Eremin

Инструкции AMOOR.W и AMOOR.D

AMOOR.W rd, rs2, (rs1)
AMOOR.D rd, rs2, (rs1)

Набор команд: RV32A – с .W и RV64A – с .D

Формат: R

Операнды: rs1 – адрес памяти, rd и rs2 – содердимое регистров

Действие: rd := (rs1), (rs1) := (rs1) OR rs2 (атомарно!), т.е. выполнить операцию логическое ИЛИ данных из памяти по адресу в rs1 и содержимого rs2; занести результат обратно в память; гарантируется, что на время выполнения инструкции все прочие обращения к памяти будут заблокированы

Примечания

  1. AMO = Atomic Memory Operation.
  2. Команда эффективна и полезна при сборе результатов (reduction) из нескольких потоков.
  3. Разрешается назначать в качестве rd регистр x0, тогда изменений в регистрах не будет.
  4. В 64-битном режиме в команде с .W при записи в регистр rd в 32-битном слове расширяется знак.
  5. Адрес памяти в rs1 должен быть выровнен в соответствии с разрядностью операнда (т.е. делиться без остатка на 4 для .W и на 8 для .D). При нарушении возникает исключительная ситуация (exception). Предполагается возможность работы с невыровненными данными при наличии специального расширения Zam (пока не детализированного).
  6. Инструкция содержит биты aq (acquire – захват) и rl (release – освобождение), предназначенные для дополнительных ограничений при переупорядочении доступа к памяти. Для любых AMO-инструкций (AMO*) установлены следующие общие правила.
    • AMO*.W/D – инструкция работает со стандартными ограничениями на переупорядочивание доступа к памяти (но атомарность инструкции при этом должна гарантироваться!);
    • AMO*.W/D.AQ дополнительно гарантирует, что «другие потоки будут видеть эту AMO-инструкцию как выполняемую без переупорядочивания с последующими инструкциями доступа к памяти» ("guarantees that other threads will see the AMO in-order with subsequent memory accesses").
    • AMO*.W/D.RL дополнительно гарантирует, что «другие потоки будут видеть эту AMO-инструкцию как выполняемую без переупорядочивания с предыдущими инструкциями доступа к памяти» ("guarantees that other threads will see the AMO in-order with previous memory accesses").
    • AMO*.W/D.AQ.RL объединяет обе предыдущие гарантии, так что инструкция получит при выполнении программы доступ к памяти в строгом соответствии со своим положением.
  7. Инструкции с .W отличаются от таковых с .D значением в поле func3 (2 или 3 соответственно). Остальной код совпадает.
  8. По моему скромному разумению, данная инструкция аналогична (функционально, по крайней мере) инструкции Intel с префиксом LOCK.

Пример

Инструкция AMOOR.W x31, x7, (x11) атомарным образом выполняет операцию логическое ИЛИ над содержимым 32-битного слова, прочитанного по адресу из x11, и содержимым регистра x7; результат помещается обратно в память по тому же адресу. В x31 заносится исходное значение из памяти (если оно не нужно, используйте x0).
Код инструкции содержит следующие поля:

полеразрядностьсодержимоепримечание
func55 битов01000 всегда
aq1 бит0aq = 0
rl1 бит0rl = 0
rs25 битов00111x7
rs15 битов01011x11
func33 бита010 всегда
rd5 битов11111x31
opcode7 битов0101111 всегда

Итоговый код

01000 00 00111 01011 010 11111 01011112 = 40 75 AF AF16


Автор справочника - Евгений Александрович Еремин (Пермский государственный гуманитарно-педагогический университет). e_eremin@yahoo.com


Free Web Hosting