Changeset f24d300 in mainline for kernel/arch/amd64/include/atomic.h
- Timestamp:
- 2009-03-03T15:52:55Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- e762b43
- Parents:
- add04f7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/include/atomic.h
radd04f7 rf24d300 27 27 */ 28 28 29 /** @addtogroup amd64 29 /** @addtogroup amd64 30 30 * @{ 31 31 */ … … 42 42 static inline void atomic_inc(atomic_t *val) { 43 43 #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 ); 45 48 #else 46 asm volatile ("incq %0\n" : "+m" (val->count)); 49 asm volatile ( 50 "incq %[count]\n" 51 : [count] "+m" (val->count) 52 ); 47 53 #endif /* CONFIG_SMP */ 48 54 } … … 50 56 static inline void atomic_dec(atomic_t *val) { 51 57 #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 ); 53 62 #else 54 asm volatile ("decq %0\n" : "+m" (val->count)); 63 asm volatile ( 64 "decq %[count]\n" 65 : [count] "+m" (val->count) 66 ); 55 67 #endif /* CONFIG_SMP */ 56 68 } … … 59 71 { 60 72 long r = 1; 61 73 62 74 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) 65 77 ); 66 78 67 79 return r; 68 80 } … … 73 85 74 86 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) 77 89 ); 78 90 … … 80 92 } 81 93 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) 84 96 85 97 static inline uint64_t test_and_set(atomic_t *val) { … … 87 99 88 100 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) 92 104 ); 93 105 … … 100 112 { 101 113 uint64_t tmp; 102 114 103 115 preemption_disable(); 104 116 asm volatile ( … … 107 119 "pause\n" 108 120 #endif 109 "mov % 0, %1\n"110 "testq % 1, %1\n"121 "mov %[count], %[tmp]\n" 122 "testq %[tmp], %[tmp]\n" 111 123 "jnz 0b\n" /* lightweight looping on locked spinlock */ 112 124 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" 116 128 "jnz 0b\n" 117 : "+m" (val->count),"=&r" (tmp)129 : [count] "+m" (val->count), [tmp] "=&r" (tmp) 118 130 ); 119 131 /*
Note:
See TracChangeset
for help on using the changeset viewer.