Использование xadd для разных целочисленных значений ширины - PullRequest
1 голос
/ 26 января 2011

Я в настоящее время портирую atomic.hpp для поддержки проекта и хотел бы обобщить функцию атомарного добавления, с помощью которой она шаблонируется для типа добавления:

template <typename T, typename V>
inline T add(volatile T* mem, V val)
{
    T r;

    asm volatile
    (
        "lock\n\t"
        "xadd %1, %0":
        "+m"( *mem ), "=r"( r ):
        "1"( val ):
        "memory", "cc"
    );

    return r;
}

Я не могу найти четкую документацию, чтобы с ней можно было безопасно использовать 8, 16, 32 и 64-битные числа с подписью и без них. Кто-нибудь знает?

1 Ответ

2 голосов
/ 26 января 2011

Да, вы можете использовать lock xadd в IA32 или IA64 со всеми типами чисел 8, 16, 32 и 64-битных со знаком или без знака.Выравнивание памяти не требуется, но если это так, то доступ к памяти происходит быстрее.

Из руководства Intel:

На целостность префикса LOCK выравнивание не влияетполя памяти.Блокировка памяти наблюдается для произвольно выровненных полей.Эта инструкция одинакова для не 64-битных и 64-битных режимов.

Предупреждение! :

Если префикс LOCKиспользуется с инструкцией XADD, а исходный операнд является операндом памяти, может быть сгенерировано неопределенное исключение кода операции (#UD).

Таким образом, исходный операнд должен быть зарегистрирован, а целевой операнд является адресом памяти!

...