встроенный ассемблер 64-битный счетчик приращения - PullRequest
1 голос
/ 13 марта 2012

Я бы хотел увеличить счетчик 64 бит (длинный тип в C ++) во встроенной сборке атомарно.Я знаю, как это сделать для 32-битного значения (int):

asm volatile("lock; incl %0" : "=m" (val) : "m"(val));

Но я понятия не имею, как выполнить это для длинного значения.

Ответы [ 2 ]

2 голосов
/ 13 марта 2012

перенес самоотчет из вопроса в ответ

Это было довольно легко, но я не был знаком с x86-64.

asm volatile("lock; incq %0" : "=m" (val) : "m"(val));
0 голосов
/ 13 мая 2012

Это должно быть:

asm volatile("lock; incq %0" : "+m" (val));

Указание отдельных операндов без ограничений, заставляющих вводить в то же место, что и вывод, может привести к коду, например:

val = something;
asm volatile("lock; incq %0" : "=m" (val) : "m"(val));

неправильно оптимизирован. Вам также может понадобиться клоббер памяти, чтобы предотвратить доступ к другим переменным, перемещаемым после asm.

...