Сильно!
Могу привести (в качестве примера) Вам мою реализацию семейства функций атомарного сравнения-обмена (на inline asm):
#define ATOMIC_MANNER 2 //==0 - функции Atomic...() реализованы на критических секциях
//==1 - функции Atomic...() реализованы на механизме эксклюзивного доступа используя intrinsic-функции семейства __LDREX()/__STREX()
//==2 - функции Atomic...() реализованы на механизме эксклюзивного доступа используя команды семейства LDREX/STREX в asm()-вставках
//==3 - то же, что и ==2, но не создаются отдельные варианты функций для непосредственных значений последнего аргумента (для компиляции с уровнем оптимизации <Medium)
#if ATOMIC_MANNER == 2
#define IMM_ARG "i"
#else
#define IMM_ARG "r"
#endif
#define CREATE_AtomicCmpSwp(typ, imm) \
{ \
u32 r, i; \
asm( \
"p01: LDREX" typ " %0, [%2] \n" \
" CMP %0, %4 \n" \
" ITT EQ \n" \
" STREX" typ "EQ %1, %3, [%2] \n" \
" CMPEQ %1, #1 \n" \
" BEQ p01" \
: "=&r"(r), "=&r"(i) \
: "r"(ptr), "r"(newVal), imm(cmpVal) \
: "cc", "memory"); \
i = i; \
return r; \
}
#pragma inline = forced
inline u32 AtomicCmpSwp(u8 volatile *ptr, u32 newVal, u32 cmpVal) CREATE_AtomicCmpSwp("B", "r")
#pragma inline = forced
inline u32 AtomicCmpSwpI(u8 volatile *ptr, u32 newVal, u32 cmpVal) CREATE_AtomicCmpSwp("B", IMM_ARG)
#pragma inline = forced
inline u32 AtomicCmpSwp(u16 volatile *ptr, u32 newVal, u32 cmpVal) CREATE_AtomicCmpSwp("H", "r")
#pragma inline = forced
inline u32 AtomicCmpSwpI(u16 volatile *ptr, u32 newVal, u32 cmpVal) CREATE_AtomicCmpSwp("H", IMM_ARG)
#pragma inline = forced
inline u32 AtomicCmpSwp(u32 volatile *ptr, u32 newVal, u32 cmpVal) CREATE_AtomicCmpSwp("", "r")
#pragma inline = forced
inline u32 AtomicCmpSwpI(u32 volatile *ptr, u32 newVal, u32 cmpVal) CREATE_AtomicCmpSwp("", IMM_ARG)
Кому другому я бы не стал такое приводить, но вы думаю - разберётесь в хитросплетениях.
Приведённый код - он только для ATOMIC_MANNER=2 и для ATOMIC_MANNER=3. Для 0 и 1 - другие ветки кода, которых тут нет.
PS: Обратите внимание на префиксы для принимаемых аргументов и возвращаемых значений. А также на "memory".