Навигатор
My RISC-V home
Индекс
Инструкции
расширения A
(атомарные операции)
RV32A
RV64A
|
Инструкции AMOXOR.W и AMOXOR.D
AMOXOR.W rd, rs2, (rs1)
AMOXOR.D rd, rs2, (rs1)
Набор команд: RV32A – с .W и
RV64A – с .D
Формат: R
Операнды: rs1 – адрес памяти, rd и rs2 – содердимое регистров
Действие: rd := (rs1), (rs1) := (rs1) XOR rs2 (атомарно!), т.е. выполнить операцию исключающее ИЛИ данных из памяти по адресу в rs1 и содержимого rs2; занести результат обратно в память; гарантируется, что на время выполнения инструкции все прочие обращения к памяти будут заблокированы
Примечания
- AMO = Atomic Memory Operation.
- Команда эффективна и полезна при сборе результатов (reduction) из нескольких потоков.
- Разрешается назначать в качестве 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 соответственно). Остальной код совпадает.
- По моему скромному разумению, данная инструкция аналогична (функционально, по крайней мере) инструкции Intel с префиксом LOCK.
Пример
Инструкция AMOXOR.W x31, x7, (x11) атомарным образом выполняет операцию исключающее ИЛИ над содержимым 32-битного слова, прочитанного по адресу из x11 , и содержимым регистра x7 ; результат помещается обратно в память по тому же адресу. В x31 заносится исходное значение из памяти (если оно не нужно, используйте x0 ).
Код инструкции содержит следующие поля:
поле | разрядность | содержимое | примечание |
func5 | 5 битов | 00100 |
всегда |
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 |
всегда |
Итоговый код
00100 00 00111 01011 010 11111 01011112 = 20 75 AF AF16
|