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
У меня есть эта функция: < /p> [code]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 [/code]/[code]sc.d[/code] combo?