Прошу модераторов перенести тему в
раздел про lcc; в идеале поставив здесь какую-либо отсылку туда.
Ответ компиляторщиков:
---
В lcc работает симметрично с gcc
Описание gcc:
https://gcc.gnu.org/onlinedocs/gcc-7.5. ... c-Builtins
...
If there is no pattern or mechanism to provide a lock-free instruction sequence,
a call is made to an external routine with the same parameters to be resolved
at run time
...
Другими словами, встроенный код будет строиться только в том случае,
если есть аппаратная поддержка для операции такого типа и такого формата.
Если такой поддержки нет, то будет строиться вызов функции, который
реализует НЕ lock-free вариант построения (т.е. с использованием mutex'ов
или семафоров)
Например, на intel'овском gcc:
Код: Выделить всё
$ cat t.c
__int128_t x, y, z;
int main (void)
{
__atomic_compare_exchange_n (&x, &y, z, 0, 0, 0);
}
Код: Выделить всё
$ gcc-7.3 t.c
/tmp/cczAmbWl.o: In function `main':
t.c:(.text+0x2f): undefined reference to `__atomic_compare_exchange_16'
collect2: error: ld returned 1 exit status
$ gcc-7.3 t.c -latomic
<ok>
Конкретно в случае Эльбруса аппаратная поддержка 16-байтных атомарных
обращений появилась начиная с системы команд elbrus-v5 (т.е. начиная
с процессора Эльбрус-8СВ). Поэтому для более ранних систем команд
для 16-байтных атомарных операций будет строитья вызов функции,
а для более поздних - встроенный код
Код: Выделить всё
$ cat t.c
__int128_t x, y, z;
int main (void)
{
__atomic_compare_exchange_n (&x, &y, z, 0, 0, 0);
}
$ lcc -march=elbrus-v3 t.c
/tmp/lcc_RHGnwb.o: in function `main':
t.c:(.text+0x40): undefined reference to `__atomic_compare_exchange_16'
$ lcc -march=elbrus-v5 t.c
<ok>
Я плохо разбираюсь в intel'овской системе команд. Возможно, что если
сконфигурировать gcc под какие-то более поздние модели процессоров
или подать опцию -march с каим-нибудь современным процессором, то там
тоже построится встроенный код для данного примера. Если в современных
версиях intel'овских процессоров есть аппаратная поддержка 16-байтных
атомарных операций
---