123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #pragma once
- #define atomic_read(atomic) ((atomic)->value)
- #define atomic_set(atomic,val) (((atomic)->value) = (val))
- typedef struct
- {
- volatile long value;
- } atomic_t;
- inline void atomic_add(atomic_t *ato, long val)
- {
- asm volatile("lock addq %1, %0 \n\t"
- : "=m"(ato->value)
- : "m"(val)
- : "memory");
- }
- inline void atomic_sub(atomic_t *ato, long val)
- {
- asm volatile("lock subq %1, %0 \n\t"
- : "=m"(ato->value)
- : "m"(val)
- : "memory");
- }
- void atomic_inc(atomic_t *ato)
- {
- asm volatile("lock incq %0 \n\t"
- : "=m"(ato->value)
- : "m"(ato->value)
- : "memory");
- }
- void atomic_dec(atomic_t *ato)
- {
- asm volatile("lock decq %0 \n\t"
- : "=m"(ato->value)
- : "m"(ato->value)
- : "memory");
- }
- inline void atomic_set_mask(atomic_t *ato, long mask)
- {
- __asm__ __volatile__("lock orq %1, %0 \n\t"
- : "=m"(ato->value)
- : "r"(mask)
- : "memory");
- }
- inline void atomic_clear_mask(atomic_t *ato, long mask)
- {
- __asm__ __volatile__("lock andq %1, %0 \n\t"
- : "=m"(ato->value)
- : "r"(mask)
- : "memory");
- }
|