Changeset add04f7 in mainline for kernel/arch/ia32/include/atomic.h


Ignore:
Timestamp:
2009-03-03T15:20:49Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f24d300
Parents:
deca67b
Message:

better inline assembler readability using the new symbolic syntax

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/include/atomic.h

    rdeca67b radd04f7  
    2727 */
    2828
    29 /** @addtogroup ia32   
     29/** @addtogroup ia32
    3030 * @{
    3131 */
     
    4242static inline void atomic_inc(atomic_t *val) {
    4343#ifdef CONFIG_SMP
    44         asm volatile ("lock incl %0\n" : "+m" (val->count));
     44        asm volatile (
     45                "lock incl %[count]\n"
     46                : [count] "+m" (val->count)
     47        );
    4548#else
    46         asm volatile ("incl %0\n" : "+m" (val->count));
     49        asm volatile (
     50                "incl %[count]\n"
     51                : [count] "+m" (val->count)
     52        );
    4753#endif /* CONFIG_SMP */
    4854}
     
    5056static inline void atomic_dec(atomic_t *val) {
    5157#ifdef CONFIG_SMP
    52         asm volatile ("lock decl %0\n" : "+m" (val->count));
     58        asm volatile (
     59                "lock decl %[count]\n"
     60                : [count] "+m" (val->count)
     61        );
    5362#else
    54         asm volatile ("decl %0\n" : "+m" (val->count));
     63        asm volatile (
     64                "decl %[count]\n"
     65                : "+m" (val->count)
     66        );
    5567#endif /* CONFIG_SMP */
    5668}
     
    5971{
    6072        long r = 1;
    61 
     73       
    6274        asm volatile (
    63                 "lock xaddl %1, %0\n"
    64                 : "+m" (val->count), "+r" (r)
     75                "lock xaddl %[r], %[count]\n"
     76                : [count] "+m" (val->count), [r] "+r" (r)
    6577        );
    66 
     78       
    6779        return r;
    6880}
     
    7385       
    7486        asm volatile (
    75                 "lock xaddl %1, %0\n"
    76                 : "+m" (val->count), "+r"(r)
     87                "lock xaddl %[r], %[count]\n"
     88                : [count] "+m" (val->count), [r] "+r"(r)
    7789        );
    7890       
     
    8092}
    8193
    82 #define atomic_preinc(val) (atomic_postinc(val) + 1)
    83 #define atomic_predec(val) (atomic_postdec(val) - 1)
     94#define atomic_preinc(val)  (atomic_postinc(val) + 1)
     95#define atomic_predec(val)  (atomic_postdec(val) - 1)
    8496
    8597static inline uint32_t test_and_set(atomic_t *val) {
     
    8799       
    88100        asm volatile (
    89                 "movl $1, %0\n"
    90                 "xchgl %0, %1\n"
    91                 : "=r" (v),"+m" (val->count)
     101                "movl $1, %[v]\n"
     102                "xchgl %[v], %[count]\n"
     103                : [v] "=r" (v), [count] "+m" (val->count)
    92104        );
    93105       
     
    99111{
    100112        uint32_t tmp;
    101 
     113       
    102114        preemption_disable();
    103115        asm volatile (
    104116                "0:\n"
    105117#ifdef CONFIG_HT
    106                 "pause\n" /* Pentium 4's HT love this instruction */
     118                "pause\n"        /* Pentium 4's HT love this instruction */
    107119#endif
    108                 "mov %0, %1\n"
    109                 "testl %1, %1\n"
     120                "mov %[count], %[tmp]\n"
     121                "testl %[tmp], %[tmp]\n"
    110122                "jnz 0b\n"       /* lightweight looping on locked spinlock */
    111123               
    112                 "incl %1\n"      /* now use the atomic operation */
    113                 "xchgl %0, %1\n"       
    114                 "testl %1, %1\n"
     124                "incl %[tmp]\n"  /* now use the atomic operation */
     125                "xchgl %[count], %[tmp]\n"
     126                "testl %[tmp], %[tmp]\n"
    115127                "jnz 0b\n"
    116                 : "+m" (val->count), "=&r"(tmp)
     128                : [count] "+m" (val->count), [tmp] "=&r" (tmp)
    117129        );
    118130        /*
Note: See TracChangeset for help on using the changeset viewer.