Код: Выделить всё
void not(std::atomic_uint64_t& a) {
a = ~a;
}
< /code>
Я ожидал, что мой компилятор генерирует сборку RISC-V, которая будет выглядеть так: < /p>
li t0, -1
amoxor.aqrl x0, t0, (a0)
ret
< /code>
Но когда я посмотрел на GCC, сгенерированная сборка выглядела следующая: < /p>
fence rw,rw
ld a5,0(a0)
fence r,rw
not a5,a5
fence rw,w
sd a5,0(a0)
fence rw,rw
ret
< /code>
Я думал, что это может быть ошибка компилятора, но Clang генерирует аналогичные инструкции по всем версиям, которые я попробовал. Разве это не тот случай, когда значение может быть изменено между нагрузкой и магазином? Разве это не нужно, по крайней мере, LR.D Код: Выделить всё
sc.dПодробнее здесь: https://stackoverflow.com/questions/796 ... ot-in-risc