Annotation of embedaddon/nginx/src/os/unix/ngx_gcc_atomic_sparc64.h, revision 1.1
1.1 ! misho 1:
! 2: /*
! 3: * Copyright (C) Igor Sysoev
! 4: * Copyright (C) Nginx, Inc.
! 5: */
! 6:
! 7:
! 8: /*
! 9: * "casa [r1] 0x80, r2, r0" and
! 10: * "casxa [r1] 0x80, r2, r0" do the following:
! 11: *
! 12: * if ([r1] == r2) {
! 13: * swap(r0, [r1]);
! 14: * } else {
! 15: * r0 = [r1];
! 16: * }
! 17: *
! 18: * so "r0 == r2" means that the operation was successful.
! 19: *
! 20: *
! 21: * The "r" means the general register.
! 22: * The "+r" means the general register used for both input and output.
! 23: */
! 24:
! 25:
! 26: #if (NGX_PTR_SIZE == 4)
! 27: #define NGX_CASA "casa"
! 28: #else
! 29: #define NGX_CASA "casxa"
! 30: #endif
! 31:
! 32:
! 33: static ngx_inline ngx_atomic_uint_t
! 34: ngx_atomic_cmp_set(ngx_atomic_t *lock, ngx_atomic_uint_t old,
! 35: ngx_atomic_uint_t set)
! 36: {
! 37: __asm__ volatile (
! 38:
! 39: NGX_CASA " [%1] 0x80, %2, %0"
! 40:
! 41: : "+r" (set) : "r" (lock), "r" (old) : "memory");
! 42:
! 43: return (set == old);
! 44: }
! 45:
! 46:
! 47: static ngx_inline ngx_atomic_int_t
! 48: ngx_atomic_fetch_add(ngx_atomic_t *value, ngx_atomic_int_t add)
! 49: {
! 50: ngx_atomic_uint_t old, res;
! 51:
! 52: old = *value;
! 53:
! 54: for ( ;; ) {
! 55:
! 56: res = old + add;
! 57:
! 58: __asm__ volatile (
! 59:
! 60: NGX_CASA " [%1] 0x80, %2, %0"
! 61:
! 62: : "+r" (res) : "r" (value), "r" (old) : "memory");
! 63:
! 64: if (res == old) {
! 65: return res;
! 66: }
! 67:
! 68: old = res;
! 69: }
! 70: }
! 71:
! 72:
! 73: #if (NGX_SMP)
! 74: #define ngx_memory_barrier() \
! 75: __asm__ volatile ( \
! 76: "membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" \
! 77: ::: "memory")
! 78: #else
! 79: #define ngx_memory_barrier() __asm__ volatile ("" ::: "memory")
! 80: #endif
! 81:
! 82: #define ngx_cpu_pause()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>