📄 atomic.h
字号:
else if (sizeof (*mem) == 2) \ __asm __volatile (LOCK_PREFIX "addw %w2, %0; sets %1" \ : "=m" (*mem), "=qm" (__result) \ : "ir" (value), "m" (*mem)); \ else if (sizeof (*mem) == 4) \ __asm __volatile (LOCK_PREFIX "addl %2, %0; sets %1" \ : "=m" (*mem), "=qm" (__result) \ : "ir" (value), "m" (*mem)); \ else \ __asm __volatile (LOCK_PREFIX "addq %q2, %0; sets %1" \ : "=m" (*mem), "=qm" (__result) \ : "ir" ((long) (value)), "m" (*mem)); \ __result; })#define atomic_add_zero(mem, value) \ ({ unsigned char __result; \ if (sizeof (*mem) == 1) \ __asm __volatile (LOCK_PREFIX "addb %b2, %0; setz %1" \ : "=m" (*mem), "=qm" (__result) \ : "iq" (value), "m" (*mem)); \ else if (sizeof (*mem) == 2) \ __asm __volatile (LOCK_PREFIX "addw %w2, %0; setz %1" \ : "=m" (*mem), "=qm" (__result) \ : "ir" (value), "m" (*mem)); \ else if (sizeof (*mem) == 4) \ __asm __volatile (LOCK_PREFIX "addl %2, %0; setz %1" \ : "=m" (*mem), "=qm" (__result) \ : "ir" (value), "m" (*mem)); \ else \ __asm __volatile (LOCK_PREFIX "addq %q2, %0; setz %1" \ : "=m" (*mem), "=qm" (__result) \ : "ir" ((long) (value)), "m" (*mem)); \ __result; })#define __arch_increment_body(lock, mem) \ do { \ if (sizeof (*mem) == 1) \ __asm __volatile (lock "incb %b0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else if (sizeof (*mem) == 2) \ __asm __volatile (lock "incw %w0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else if (sizeof (*mem) == 4) \ __asm __volatile (lock "incl %0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else \ __asm __volatile (lock "incq %q0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ } while (0)#define atomic_increment(mem) __arch_increment_body (LOCK_PREFIX, mem)#define __arch_increment_cprefix \ "cmpl $0, %%fs:%P2\n\tje 0f\n\tlock\n0:\t"#define catomic_increment(mem) \ __arch_increment_body (__arch_increment_cprefix, mem)#define atomic_increment_and_test(mem) \ ({ unsigned char __result; \ if (sizeof (*mem) == 1) \ __asm __volatile (LOCK_PREFIX "incb %b0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ else if (sizeof (*mem) == 2) \ __asm __volatile (LOCK_PREFIX "incw %w0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ else if (sizeof (*mem) == 4) \ __asm __volatile (LOCK_PREFIX "incl %0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ else \ __asm __volatile (LOCK_PREFIX "incq %q0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ __result; })#define __arch_decrement_body(lock, mem) \ do { \ if (sizeof (*mem) == 1) \ __asm __volatile (lock "decb %b0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else if (sizeof (*mem) == 2) \ __asm __volatile (lock "decw %w0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else if (sizeof (*mem) == 4) \ __asm __volatile (lock "decl %0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else \ __asm __volatile (lock "decq %q0" \ : "=m" (*mem) \ : "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ } while (0)#define atomic_decrement(mem) __arch_decrement_body (LOCK_PREFIX, mem)#define __arch_decrement_cprefix \ "cmpl $0, %%fs:%P2\n\tje 0f\n\tlock\n0:\t"#define catomic_decrement(mem) \ __arch_decrement_body (__arch_decrement_cprefix, mem)#define atomic_decrement_and_test(mem) \ ({ unsigned char __result; \ if (sizeof (*mem) == 1) \ __asm __volatile (LOCK_PREFIX "decb %b0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ else if (sizeof (*mem) == 2) \ __asm __volatile (LOCK_PREFIX "decw %w0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ else if (sizeof (*mem) == 4) \ __asm __volatile (LOCK_PREFIX "decl %0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ else \ __asm __volatile (LOCK_PREFIX "decq %q0; sete %1" \ : "=m" (*mem), "=qm" (__result) \ : "m" (*mem)); \ __result; })#define atomic_bit_set(mem, bit) \ do { \ if (sizeof (*mem) == 1) \ __asm __volatile (LOCK_PREFIX "orb %b2, %0" \ : "=m" (*mem) \ : "m" (*mem), "iq" (1L << (bit))); \ else if (sizeof (*mem) == 2) \ __asm __volatile (LOCK_PREFIX "orw %w2, %0" \ : "=m" (*mem) \ : "m" (*mem), "ir" (1L << (bit))); \ else if (sizeof (*mem) == 4) \ __asm __volatile (LOCK_PREFIX "orl %2, %0" \ : "=m" (*mem) \ : "m" (*mem), "ir" (1L << (bit))); \ else if (__builtin_constant_p (bit) && (bit) < 32) \ __asm __volatile (LOCK_PREFIX "orq %2, %0" \ : "=m" (*mem) \ : "m" (*mem), "i" (1L << (bit))); \ else \ __asm __volatile (LOCK_PREFIX "orq %q2, %0" \ : "=m" (*mem) \ : "m" (*mem), "r" (1UL << (bit))); \ } while (0)#define atomic_bit_test_set(mem, bit) \ ({ unsigned char __result; \ if (sizeof (*mem) == 1) \ __asm __volatile (LOCK_PREFIX "btsb %3, %1; setc %0" \ : "=q" (__result), "=m" (*mem) \ : "m" (*mem), "iq" (bit)); \ else if (sizeof (*mem) == 2) \ __asm __volatile (LOCK_PREFIX "btsw %3, %1; setc %0" \ : "=q" (__result), "=m" (*mem) \ : "m" (*mem), "ir" (bit)); \ else if (sizeof (*mem) == 4) \ __asm __volatile (LOCK_PREFIX "btsl %3, %1; setc %0" \ : "=q" (__result), "=m" (*mem) \ : "m" (*mem), "ir" (bit)); \ else \ __asm __volatile (LOCK_PREFIX "btsq %3, %1; setc %0" \ : "=q" (__result), "=m" (*mem) \ : "m" (*mem), "ir" (bit)); \ __result; })#define atomic_delay() asm ("rep; nop")#define atomic_and(mem, mask) \ do { \ if (sizeof (*mem) == 1) \ __asm __volatile (LOCK_PREFIX "andb %b1, %0" \ : "=m" (*mem) \ : "iq" (mask), "m" (*mem)); \ else if (sizeof (*mem) == 2) \ __asm __volatile (LOCK_PREFIX "andw %w1, %0" \ : "=m" (*mem) \ : "ir" (mask), "m" (*mem)); \ else if (sizeof (*mem) == 4) \ __asm __volatile (LOCK_PREFIX "andl %1, %0" \ : "=m" (*mem) \ : "ir" (mask), "m" (*mem)); \ else \ __asm __volatile (LOCK_PREFIX "andq %q1, %0" \ : "=m" (*mem) \ : "ir" (mask), "m" (*mem)); \ } while (0)#define __arch_or_body(lock, mem, mask) \ do { \ if (sizeof (*mem) == 1) \ __asm __volatile (lock "orb %b1, %0" \ : "=m" (*mem) \ : "iq" (mask), "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else if (sizeof (*mem) == 2) \ __asm __volatile (lock "orw %w1, %0" \ : "=m" (*mem) \ : "ir" (mask), "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else if (sizeof (*mem) == 4) \ __asm __volatile (lock "orl %1, %0" \ : "=m" (*mem) \ : "ir" (mask), "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ else \ __asm __volatile (lock "orq %q1, %0" \ : "=m" (*mem) \ : "ir" (mask), "m" (*mem), \ "i" (offsetof (tcbhead_t, multiple_threads))); \ } while (0)#define atomic_or(mem, mask) __arch_or_body (LOCK_PREFIX, mem, mask)#define __arch_or_cprefix \ "cmpl $0, %%fs:%P3\n\tje 0f\n\tlock\n0:\t"#define catomic_or(mem, mask) __arch_or_body (__arch_or_cprefix, mem, mask)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -