Changeset 7f341820 in mainline for kernel/arch/mips32/include/atomic.h
- Timestamp:
- 2009-02-17T14:09:31Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 30e2bba
- Parents:
- 85156d3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/mips32/include/atomic.h
r85156d3 r7f341820 36 36 #define KERN_mips32_ATOMIC_H_ 37 37 38 #define atomic_inc(x) 39 #define atomic_dec(x) 38 #define atomic_inc(x) ((void) atomic_add(x, 1)) 39 #define atomic_dec(x) ((void) atomic_add(x, -1)) 40 40 41 #define atomic_postinc(x) (atomic_add(x, 1) - 1)42 #define atomic_postdec(x) (atomic_add(x, -1) + 1)41 #define atomic_postinc(x) (atomic_add(x, 1) - 1) 42 #define atomic_postdec(x) (atomic_add(x, -1) + 1) 43 43 44 #define atomic_preinc(x) atomic_add(x, 1)45 #define atomic_predec(x) atomic_add(x, -1)44 #define atomic_preinc(x) atomic_add(x, 1) 45 #define atomic_predec(x) atomic_add(x, -1) 46 46 47 47 /* Atomic addition of immediate value. … … 55 55 { 56 56 long tmp, v; 57 57 58 58 asm volatile ( 59 59 "1:\n" 60 60 " ll %0, %1\n" 61 " addu %0, %0, %3\n" 62 " 61 " addu %0, %0, %3\n" /* same as addi, but never traps on overflow */ 62 " move %2, %0\n" 63 63 " sc %0, %1\n" 64 " beq %0, %4, 1b\n" 64 " beq %0, %4, 1b\n" /* if the atomic operation failed, try again */ 65 65 " nop\n" 66 66 : "=&r" (tmp), "+m" (val->count), "=&r" (v) 67 67 : "r" (i), "i" (0) 68 ); 68 ); 69 70 return v; 71 } 69 72 73 static inline uint32_t test_and_set(atomic_t *val) { 74 uint32_t tmp, v; 75 76 asm volatile ( 77 "1:\n" 78 " ll %2, %1\n" 79 " bnez %2, 2f\n" 80 " li %0, %3\n" 81 " sc %0, %1\n" 82 " beqz %0, 1b\n" 83 "2:\n" 84 : "=&r" (tmp), "+m" (val->count), "=&r" (v) 85 : "i" (1) 86 ); 87 70 88 return v; 71 89 }
Note:
See TracChangeset
for help on using the changeset viewer.