Changeset add04f7 in mainline for kernel/arch/ia32/include/atomic.h
- Timestamp:
- 2009-03-03T15:20:49Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f24d300
- Parents:
- deca67b
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/include/atomic.h
rdeca67b radd04f7 27 27 */ 28 28 29 /** @addtogroup ia32 29 /** @addtogroup ia32 30 30 * @{ 31 31 */ … … 42 42 static inline void atomic_inc(atomic_t *val) { 43 43 #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 ); 45 48 #else 46 asm volatile ("incl %0\n" : "+m" (val->count)); 49 asm volatile ( 50 "incl %[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 decl %0\n" : "+m" (val->count)); 58 asm volatile ( 59 "lock decl %[count]\n" 60 : [count] "+m" (val->count) 61 ); 53 62 #else 54 asm volatile ("decl %0\n" : "+m" (val->count)); 63 asm volatile ( 64 "decl %[count]\n" 65 : "+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 xaddl % 1, %0\n"64 : "+m" (val->count),"+r" (r)75 "lock xaddl %[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 xaddl % 1, %0\n"76 : "+m" (val->count),"+r"(r)87 "lock xaddl %[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 uint32_t test_and_set(atomic_t *val) { … … 87 99 88 100 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) 92 104 ); 93 105 … … 99 111 { 100 112 uint32_t tmp; 101 113 102 114 preemption_disable(); 103 115 asm volatile ( 104 116 "0:\n" 105 117 #ifdef CONFIG_HT 106 "pause\n" /* Pentium 4's HT love this instruction */118 "pause\n" /* Pentium 4's HT love this instruction */ 107 119 #endif 108 "mov % 0, %1\n"109 "testl % 1, %1\n"120 "mov %[count], %[tmp]\n" 121 "testl %[tmp], %[tmp]\n" 110 122 "jnz 0b\n" /* lightweight looping on locked spinlock */ 111 123 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" 115 127 "jnz 0b\n" 116 : "+m" (val->count), "=&r"(tmp)128 : [count] "+m" (val->count), [tmp] "=&r" (tmp) 117 129 ); 118 130 /*
Note:
See TracChangeset
for help on using the changeset viewer.