Вот версия, которая заменяет memory
clobber на правильный операнд чтения-записи вместо передачи адреса в регистре, а также избавляется от setnc
(требуется gcc 6+). Добавлен r
, чтобы охватить случай, когда bit
не известен во время компиляции. Изменено success
на более читаемое was_set
с типом bool
. Обратите внимание: если вы хотите, чтобы это было атомарно, вам также нужно добавить префикс lock
. Для барьера памяти компилятора вам может потребоваться вернуть ограничение memory
.
bool reset(std::uint16_t& integer, std::uint32_t bit) {
bool was_set;
asm volatile("btrw %w2, %1"
: "=@ccc"(was_set), "+mr"(integer)
: "ri"(bit)
: "cc");
return was_set;
}
Атомная версия может выглядеть так:
bool reset(std::uint16_t& integer, std::uint32_t bit) {
bool was_set;
asm volatile("lock btrw %w2, %1"
: "=@ccc"(was_set), "+m"(integer)
: "ri"(bit)
: "cc", "memory");
return was_set;
}