diff --git a/libctru/include/3ds/synchronization.h b/libctru/include/3ds/synchronization.h index 4a21734..e235e08 100644 --- a/libctru/include/3ds/synchronization.h +++ b/libctru/include/3ds/synchronization.h @@ -9,6 +9,25 @@ typedef struct u32 counter; } RecursiveLock; +static inline void __clrex(void) +{ + __asm__ __volatile__("clrex"); +} + +static inline s32 __ldrex(s32* addr) +{ + s32 val; + __asm__ __volatile__("ldrex %[val], %[addr]" : [val] "=r" (val) : [addr] "Q" (*addr)); + return val; +} + +static inline bool __strex(s32* addr, s32 val) +{ + bool res; + __asm__ __volatile__("strex %[res], %[val], %[addr]" : [res] "=&r" (res) : [val] "r" (val), [addr] "Q" (*addr)); + return res; +} + void LightLock_Init(LightLock* lock); void LightLock_Lock(LightLock* lock); void LightLock_Unlock(LightLock* lock); diff --git a/libctru/source/synchronization.c b/libctru/source/synchronization.c index 99cdb26..1055c06 100644 --- a/libctru/source/synchronization.c +++ b/libctru/source/synchronization.c @@ -16,25 +16,6 @@ void __sync_fini(void) svcCloseHandle(arbiter); } -static inline void __clrex(void) -{ - __asm__ __volatile__("clrex"); -} - -static inline s32 __ldrex(s32* addr) -{ - s32 val; - __asm__ __volatile__("ldrex %[val], [%[addr]]" : [val] "=r" (val) : [addr] "r" (addr)); - return val; -} - -static inline bool __strex(s32* addr, s32 val) -{ - bool res; - __asm__ __volatile__("strex %[res], %[val], [%[addr]]" : [res] "=&r" (res) : [val] "r" (val), [addr] "r" (addr)); - return res; -} - void LightLock_Init(LightLock* lock) { do