Навигатор
My RISC-V home
Индекс
Инструкции
расширения A
(атомарные операции)
RV32A
RV64A
|
Инструкции AMOMAX.W и AMOMAX.D
AMOMAX.W rd, rs2, (rs1)
AMOMAX.D rd, rs2, (rs1)
Набор команд: RV32A – с .W и
RV64A – с .D
Формат: R
Операнды: rs1 – адрес памяти, rd и rs2 – содердимое регистров
Действие: rd := (rs1), (rs1) := MAX[(rs1), rs2] (атомарно!), т.е. выполнить операцию выбора максимума из двух чисел со знаком: из памяти по адресу в rs1 и содержимого rs2; занести результат обратно в память; гарантируется, что на время выполнения инструкции все прочие обращения к памяти будут заблокированы
Примечания
- AMO = Atomic Memory Operation.
- Команда эффективна и полезна при сборе результатов (reduction) из нескольких потоков. Имеется также инструкция сравнения чисел без знака
AMOMAXU .
- Разрешается назначать в качестве rd регистр x0, тогда изменений в регистрах не будет.
- В 64-битном режиме в команде с .W при записи в регистр rd в 32-битном слове расширяется знак.
- Адрес памяти в rs1 должен быть выровнен в соответствии с разрядностью операнда (т.е. делиться без остатка на 4 для .W и на 8 для .D). При нарушении возникает исключительная ситуация (exception). Предполагается возможность работы с невыровненными данными при наличии специального расширения Zam (пока не детализированного).
- Инструкция содержит биты 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 объединяет обе предыдущие гарантии, так что инструкция получит при выполнении программы доступ к памяти в строгом соответствии со своим положением.
- Инструкции с .W отличаются от таковых с .D значением в поле func3 (2 или 3 соответственно). Остальной код совпадает.
Пример
Инструкция AMOMAX.W x31, x7, (x11) атомарным образом сравнит как числа со знаком содержимое 32-битного слова, прочитанного по адресу из x11 , с содержимым регистра x7 и выберет большее из них; результат помещается обратно в память по тому же адресу. В x31 заносится исходное значение из памяти (если оно не нужно, используйте x0 ).
Код инструкции содержит следующие поля:
поле | разрядность | содержимое | примечание |
func5 | 5 битов | 10100 |
всегда |
aq | 1 бит | 0 | aq = 0 |
rl | 1 бит | 0 | rl = 0 |
rs2 | 5 битов | 00111 | x7 |
rs1 | 5 битов | 01011 | x11 |
func3 | 3 бита | 010 |
всегда |
rd | 5 битов | 11111 | x31 |
opcode | 7 битов | 0101111 |
всегда |
Итоговый код
10100 00 00111 01011 010 11111 01011112 = A0 75 AF AF16
|