Under construction!

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


Навигатор

home My RISC-V home

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

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

handbook

RV32A

RV64A


Evgeny Eremin

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

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

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

Формат: R

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

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

Примечания

  1. AMO = Atomic Memory Operation.
  2. Команда эффективна и полезна при сборе результатов (reduction) из нескольких потоков. Имеется также инструкция сравнения чисел со знаком AMOMIN.
  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 соответственно). Остальной код совпадает.

Пример

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

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

Итоговый код

11000 00 00111 01011 010 11111 01011112 = C0 75 AF AF16


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


Free Web Hosting