musl/arch/sh/atomic_arch.h
Rich Felker 9b95fd0944 define and use internal macros for hidden visibility, weak refs
this cleans up what had become widespread direct inline use of "GNU C"
style attributes directly in the source, and lowers the barrier to
increased use of hidden visibility, which will be useful to recovering
some of the efficiency lost when the protected visibility hack was
dropped in commit dc2f368e56, especially
on archs where the PLT ABI is costly.
2018-09-05 14:05:14 -04:00

49 lines
945 B
C

#include "libc.h"
#if defined(__SH4A__)
#define a_ll a_ll
static inline int a_ll(volatile int *p)
{
int v;
__asm__ __volatile__ ("movli.l @%1, %0" : "=z"(v) : "r"(p), "m"(*p));
return v;
}
#define a_sc a_sc
static inline int a_sc(volatile int *p, int v)
{
int r;
__asm__ __volatile__ (
"movco.l %2, @%3 ; movt %0"
: "=r"(r), "=m"(*p) : "z"(v), "r"(p) : "memory", "cc");
return r;
}
#define a_barrier a_barrier
static inline void a_barrier()
{
__asm__ __volatile__ ("synco" ::: "memory");
}
#define a_pre_llsc a_barrier
#define a_post_llsc a_barrier
#else
#define a_cas a_cas
extern hidden const void *__sh_cas_ptr;
static inline int a_cas(volatile int *p, int t, int s)
{
register int r1 __asm__("r1");
register int r2 __asm__("r2") = t;
register int r3 __asm__("r3") = s;
__asm__ __volatile__ (
"jsr @%4 ; nop"
: "=r"(r1), "+r"(r3) : "z"(p), "r"(r2), "r"(__sh_cas_ptr)
: "memory", "pr", "cc");
return r3;
}
#endif