Path: blob/master/arch/sh/include/asm/atomic-grb.h
15126 views
#ifndef __ASM_SH_ATOMIC_GRB_H1#define __ASM_SH_ATOMIC_GRB_H23static inline void atomic_add(int i, atomic_t *v)4{5int tmp;67__asm__ __volatile__ (8" .align 2 \n\t"9" mova 1f, r0 \n\t" /* r0 = end point */10" mov r15, r1 \n\t" /* r1 = saved sp */11" mov #-6, r15 \n\t" /* LOGIN: r15 = size */12" mov.l @%1, %0 \n\t" /* load old value */13" add %2, %0 \n\t" /* add */14" mov.l %0, @%1 \n\t" /* store new value */15"1: mov r1, r15 \n\t" /* LOGOUT */16: "=&r" (tmp),17"+r" (v)18: "r" (i)19: "memory" , "r0", "r1");20}2122static inline void atomic_sub(int i, atomic_t *v)23{24int tmp;2526__asm__ __volatile__ (27" .align 2 \n\t"28" mova 1f, r0 \n\t" /* r0 = end point */29" mov r15, r1 \n\t" /* r1 = saved sp */30" mov #-6, r15 \n\t" /* LOGIN: r15 = size */31" mov.l @%1, %0 \n\t" /* load old value */32" sub %2, %0 \n\t" /* sub */33" mov.l %0, @%1 \n\t" /* store new value */34"1: mov r1, r15 \n\t" /* LOGOUT */35: "=&r" (tmp),36"+r" (v)37: "r" (i)38: "memory" , "r0", "r1");39}4041static inline int atomic_add_return(int i, atomic_t *v)42{43int tmp;4445__asm__ __volatile__ (46" .align 2 \n\t"47" mova 1f, r0 \n\t" /* r0 = end point */48" mov r15, r1 \n\t" /* r1 = saved sp */49" mov #-6, r15 \n\t" /* LOGIN: r15 = size */50" mov.l @%1, %0 \n\t" /* load old value */51" add %2, %0 \n\t" /* add */52" mov.l %0, @%1 \n\t" /* store new value */53"1: mov r1, r15 \n\t" /* LOGOUT */54: "=&r" (tmp),55"+r" (v)56: "r" (i)57: "memory" , "r0", "r1");5859return tmp;60}6162static inline int atomic_sub_return(int i, atomic_t *v)63{64int tmp;6566__asm__ __volatile__ (67" .align 2 \n\t"68" mova 1f, r0 \n\t" /* r0 = end point */69" mov r15, r1 \n\t" /* r1 = saved sp */70" mov #-6, r15 \n\t" /* LOGIN: r15 = size */71" mov.l @%1, %0 \n\t" /* load old value */72" sub %2, %0 \n\t" /* sub */73" mov.l %0, @%1 \n\t" /* store new value */74"1: mov r1, r15 \n\t" /* LOGOUT */75: "=&r" (tmp),76"+r" (v)77: "r" (i)78: "memory", "r0", "r1");7980return tmp;81}8283static inline void atomic_clear_mask(unsigned int mask, atomic_t *v)84{85int tmp;86unsigned int _mask = ~mask;8788__asm__ __volatile__ (89" .align 2 \n\t"90" mova 1f, r0 \n\t" /* r0 = end point */91" mov r15, r1 \n\t" /* r1 = saved sp */92" mov #-6, r15 \n\t" /* LOGIN: r15 = size */93" mov.l @%1, %0 \n\t" /* load old value */94" and %2, %0 \n\t" /* add */95" mov.l %0, @%1 \n\t" /* store new value */96"1: mov r1, r15 \n\t" /* LOGOUT */97: "=&r" (tmp),98"+r" (v)99: "r" (_mask)100: "memory" , "r0", "r1");101}102103static inline void atomic_set_mask(unsigned int mask, atomic_t *v)104{105int tmp;106107__asm__ __volatile__ (108" .align 2 \n\t"109" mova 1f, r0 \n\t" /* r0 = end point */110" mov r15, r1 \n\t" /* r1 = saved sp */111" mov #-6, r15 \n\t" /* LOGIN: r15 = size */112" mov.l @%1, %0 \n\t" /* load old value */113" or %2, %0 \n\t" /* or */114" mov.l %0, @%1 \n\t" /* store new value */115"1: mov r1, r15 \n\t" /* LOGOUT */116: "=&r" (tmp),117"+r" (v)118: "r" (mask)119: "memory" , "r0", "r1");120}121122#endif /* __ASM_SH_ATOMIC_GRB_H */123124125