Changeset f24d300 in mainline for kernel/arch/amd64/include/atomic.h


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

better inline assembler readability using the new symbolic syntax

File:
1 edited

Legend:

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

    radd04f7 rf24d300  
    2727 */
    2828
    29 /** @addtogroup amd64   
     29/** @addtogroup amd64
    3030 * @{
    3131 */
     
    4242static inline void atomic_inc(atomic_t *val) {
    4343#ifdef CONFIG_SMP
    44         asm volatile ("lock incq %0\n" : "+m" (val->count));
     44        asm volatile (
     45                "lock incq %[count]\n"
     46                : [count] "+m" (val->count)
     47        );
    4548#else
    46         asm volatile ("incq %0\n" : "+m" (val->count));
     49        asm volatile (
     50                "incq %[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 decq %0\n" : "+m" (val->count));
     58        asm volatile (
     59                "lock decq %[count]\n"
     60                : [count] "+m" (val->count)
     61        );
    5362#else
    54         asm volatile ("decq %0\n" : "+m" (val->count));
     63        asm volatile (
     64                "decq %[count]\n"
     65                : [count] "+m" (val->count)
     66        );
    5567#endif /* CONFIG_SMP */
    5668}
     
    5971{
    6072        long r = 1;
    61 
     73       
    6274        asm volatile (
    63                 "lock xaddq %1, %0\n"
    64                 : "+m" (val->count), "+r" (r)
     75                "lock xaddq %[r], %[count]\n"
     76                : [count] "+m" (val->count), [r] "+r" (r)
    6577        );
    66 
     78       
    6779        return r;
    6880}
     
    7385       
    7486        asm volatile (
    75                 "lock xaddq %1, %0\n"
    76                 : "+m" (val->count), "+r" (r)
     87                "lock xaddq %[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 uint64_t test_and_set(atomic_t *val) {
     
    8799       
    88100        asm volatile (
    89                 "movq $1, %0\n"
    90                 "xchgq %0, %1\n"
    91                 : "=r" (v), "+m" (val->count)
     101                "movq $1, %[v]\n"
     102                "xchgq %[v], %[count]\n"
     103                : [v] "=r" (v), [count] "+m" (val->count)
    92104        );
    93105       
     
    100112{
    101113        uint64_t tmp;
    102 
     114       
    103115        preemption_disable();
    104116        asm volatile (
     
    107119                "pause\n"
    108120#endif
    109                 "mov %0, %1\n"
    110                 "testq %1, %1\n"
     121                "mov %[count], %[tmp]\n"
     122                "testq %[tmp], %[tmp]\n"
    111123                "jnz 0b\n"       /* lightweight looping on locked spinlock */
    112124               
    113                 "incq %1\n"      /* now use the atomic operation */
    114                 "xchgq %0, %1\n"
    115                 "testq %1, %1\n"
     125                "incq %[tmp]\n"  /* now use the atomic operation */
     126                "xchgq %[count], %[tmp]\n"
     127                "testq %[tmp], %[tmp]\n"
    116128                "jnz 0b\n"
    117                 : "+m" (val->count), "=&r" (tmp)
     129                : [count] "+m" (val->count), [tmp] "=&r" (tmp)
    118130        );
    119131        /*
Note: See TracChangeset for help on using the changeset viewer.