x86: Unify local_{32|64}.h
PATCH 4/4 x86: Unify local_{32|64}.h
Signed-off-by Harvey Harrison <[email protected]>
--- include/asm-x86/local.h | 148 ++++++++++++++++++++++++++++++++++++++++++- include/asm-x86/local_32.h | 150 -------------------------------------------- include/asm-x86/local_64.h | 134 --------------------------------------- 3 files changed, 144 insertions(+), 288 deletions(-)
include/asm-x86/local.h +144 -4
@@ -17,11 +17,151 @@ typedef struct#define local_read (l) atomic_long_read(&(l)->a)#define local_set (l,i) atomic_long_set(&(l)->a, (i)) -#ifdef CONFIG_X86_32 -# include "local_32.h" -#else -# include "local_64.h" +static inline void local_inc (local_t *l) +{ + __asm__ __volatile__( + _ASM_INC"%0" + :"+m" (l->a.counter)); +} + +static inline void local_dec (local_t *l) +{ + __asm__ __volatile__( + _ASM_DEC"%0" + :"+m" (l->a.counter)); +} + +static inline void local_add (long i,local_t *l) +{ + __asm__ __volatile__( + _ASM_ADD"%1,%0" + :"+m" (l->a.counter) + :"ir" (i)); +} + +static inline void local_sub (long i,local_t *l) +{ + __asm__ __volatile__( + _ASM_SUB"%1,%0" + :"+m" (l->a.counter) + :"ir" (i)); +} + +/** +* local_sub_and_test - subtract value from variable and test result +* @i: integer value to subtract +* @l: pointer to type local_t +* +* Atomically subtracts @i from @l and returns +* true if the result is zero, or false for all +* other cases. +*/ +static inline int local_sub_and_test (long i,local_t *l) +{ +unsigned char c; + + __asm__ __volatile__( + _ASM_SUB"%2,%0; sete %1" + :"+m" (l->a.counter),"=qm" (c) + :"ir" (i) :"memory" ); +return c; +} + +/** +* local_dec_and_test - decrement and test +* @l: pointer to type local_t +* +* Atomically decrements @l by 1 and +* returns true if the result is 0, or false for all other +* cases. +*/ +static inline int local_dec_and_test (local_t *l) +{ +unsigned char c; + + __asm__ __volatile__( + _ASM_DEC"%0; sete %1" + :"+m" (l->a.counter),"=qm" (c) + : :"memory" ); +return c !=0 ; +} + +/** +* local_inc_and_test - increment and test +* @l: pointer to type local_t +* +* Atomically increments @l by 1 +* and returns true if the result is zero, or false for all +* other cases. +*/ +static inline int local_inc_and_test (local_t *l) +{ +unsigned char c; + + __asm__ __volatile__( + _ASM_INC"%0; sete %1" + :"+m" (l->a.counter),"=qm" (c) + : :"memory" ); +return c !=0 ; +} + +/** +* local_add_negative - add and test if negative +* @i: integer value to add +* @l: pointer to type local_t +* +* Atomically adds @i to @l and returns true +* if the result is negative, or false when +* result is greater than or equal to zero. +*/ +static inline int local_add_negative (long i,local_t *l) +{ +unsigned char c; + + __asm__ __volatile__( + _ASM_ADD"%2,%0; sets %1" + :"+m" (l->a.counter),"=qm" (c) + :"ir" (i) :"memory" ); +return c; +} + +/** +* local_add_return - add and return +* @i: integer value to add +* @l: pointer to type local_t +* +* Atomically adds @i to @l and returns @i + @l +*/ +static inline long local_add_return (long i,local_t *l) +{ +long __i; +#ifdef CONFIG_M386 +unsigned long flags; +if (unlikely (boot_cpu_data.x86 <=3 )) + goto no_xadd; +#endif +/* Modern 486+ processor */ + __i = i; + __asm__ __volatile__( + _ASM_XADD"%0, %1;" + :"+r" (i),"+m" (l->a.counter) + : :"memory" ); +return i + __i; + +#ifdef CONFIG_M386 +no_xadd:/* Legacy 386 processor */ +local_irq_save (flags); + __i =local_read (l); +local_set (l, i + __i); +local_irq_restore (flags); +return i + __i;#endif +} + +static inline long local_sub_return (long i,local_t *l) +{ +return local_add_return (-i,l); +}#define local_inc_return (l) (local_add_return(1,l))#define local_dec_return (l) (local_sub_return(1,l))
include/asm-x86/local_32.h deleted +0 -150
150 lines not on this page · raw message
include/asm-x86/local_64.h deleted +0 -134
134 lines not on this page · raw message
Signature · 1 line
1.5.4.rc0.1083.gf568