Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/common/lib/libc/atomic/atomic_init_testset.c,v rcsdiff: /ftp/cvs/cvsroot/src/common/lib/libc/atomic/atomic_init_testset.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.7.6.2 retrieving revision 1.8 diff -u -p -r1.7.6.2 -r1.8 --- src/common/lib/libc/atomic/atomic_init_testset.c 2014/05/22 11:26:30 1.7.6.2 +++ src/common/lib/libc/atomic/atomic_init_testset.c 2012/02/28 20:41:19 1.8 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_init_testset.c,v 1.7.6.2 2014/05/22 11:26:30 yamt Exp $ */ +/* $NetBSD: atomic_init_testset.c,v 1.8 2012/02/28 20:41:19 joerg Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -36,7 +36,7 @@ */ #include -__RCSID("$NetBSD: atomic_init_testset.c,v 1.7.6.2 2014/05/22 11:26:30 yamt Exp $"); +__RCSID("$NetBSD: atomic_init_testset.c,v 1.8 2012/02/28 20:41:19 joerg Exp $"); #include "atomic_op_namespace.h" @@ -53,53 +53,20 @@ __RCSID("$NetBSD: atomic_init_testset.c, #define I128 I16 I16 I16 I16 I16 I16 I16 I16 static __cpu_simple_lock_t atomic_locks[128] = { I128 }; -/* - * Pick a lock out of above array depending on the object address - * passed. Most variables used atomically will not be in the same - * cacheline - and if they are, using the same lock is fine. - */ -#define HASH(PTR) (((uintptr_t)(PTR) >> 3) & 127) #ifdef __HAVE_ASM_ATOMIC_CAS_UP extern uint32_t _atomic_cas_up(volatile uint32_t *, uint32_t, uint32_t); #else static uint32_t _atomic_cas_up(volatile uint32_t *, uint32_t, uint32_t); #endif + static uint32_t (*_atomic_cas_fn)(volatile uint32_t *, uint32_t, uint32_t) = _atomic_cas_up; -RAS_DECL(_atomic_cas); - -#ifdef __HAVE_ATOMIC_CAS_64_UP -#ifdef __HAVE_ASM_ATOMIC_CAS_64_UP -extern uint64_t _atomic_cas_64_up(volatile uint64_t *, uint64_t, uint64_t); -#else -static uint64_t _atomic_cas_64_up(volatile uint64_t *, uint64_t, uint64_t); -#endif -static uint64_t (*_atomic_cas_64_fn)(volatile uint64_t *, uint64_t, uint64_t) = - _atomic_cas_64_up; -RAS_DECL(_atomic_cas_64); -#endif - -#ifdef __HAVE_ASM_ATOMIC_CAS_16_UP -extern uint16_t _atomic_cas_16_up(volatile uint16_t *, uint16_t, uint16_t); -#else -static uint16_t _atomic_cas_16_up(volatile uint16_t *, uint16_t, uint16_t); -#endif -static uint16_t (*_atomic_cas_16_fn)(volatile uint16_t *, uint16_t, uint16_t) = - _atomic_cas_16_up; -RAS_DECL(_atomic_cas_16); - -#ifdef __HAVE_ASM_ATOMIC_CAS_8_UP -extern uint8_t _atomic_cas_8_up(volatile uint8_t *, uint8_t, uint8_t); -#else -static uint8_t _atomic_cas_8_up(volatile uint8_t *, uint8_t, uint8_t); -#endif -static uint8_t (*_atomic_cas_8_fn)(volatile uint8_t *, uint8_t, uint8_t) = - _atomic_cas_8_up; -RAS_DECL(_atomic_cas_8); void __libc_atomic_init(void) __attribute__ ((visibility("hidden"))); +RAS_DECL(_atomic_cas); + #ifndef __HAVE_ASM_ATOMIC_CAS_UP static uint32_t _atomic_cas_up(volatile uint32_t *ptr, uint32_t old, uint32_t new) @@ -118,120 +85,13 @@ _atomic_cas_up(volatile uint32_t *ptr, u } #endif -#if defined(__HAVE_ATOMIC_CAS_64_UP) && !defined(__HAVE_ASM_ATOMIC_CAS_64_UP) -static uint64_t -_atomic_cas_64_up(volatile uint64_t *ptr, uint64_t old, uint64_t new) -{ - uint64_t ret; - - RAS_START(_atomic_cas_64); - ret = *ptr; - if (__predict_false(ret != old)) { - return ret; - } - *ptr = new; - RAS_END(_atomic_cas_64); - - return ret; -} -#endif - -#ifndef __HAVE_ASM_ATOMIC_CAS_16_UP -static uint16_t -_atomic_cas_16_up(volatile uint16_t *ptr, uint16_t old, uint16_t new) -{ - uint16_t ret; - - RAS_START(_atomic_cas_16); - ret = *ptr; - if (__predict_false(ret != old)) { - return ret; - } - *ptr = new; - RAS_END(_atomic_cas_16); - - return ret; -} -#endif - -#ifndef __HAVE_ASM_ATOMIC_CAS_8_UP -static uint8_t -_atomic_cas_8_up(volatile uint8_t *ptr, uint8_t old, uint8_t new) -{ - uint8_t ret; - - RAS_START(_atomic_cas_8); - ret = *ptr; - if (__predict_false(ret != old)) { - return ret; - } - *ptr = new; - RAS_END(_atomic_cas_8); - - return ret; -} -#endif - static uint32_t _atomic_cas_mp(volatile uint32_t *ptr, uint32_t old, uint32_t new) { __cpu_simple_lock_t *lock; uint32_t ret; - lock = &atomic_locks[HASH(ptr)]; - __cpu_simple_lock(lock); - ret = *ptr; - if (__predict_true(ret == old)) { - *ptr = new; - } - __cpu_simple_unlock(lock); - - return ret; -} - -#ifdef __HAVE_ATOMIC_CAS_64_UP -static uint64_t -_atomic_cas_64_mp(volatile uint64_t *ptr, uint64_t old, uint64_t new) -{ - __cpu_simple_lock_t *lock; - uint64_t ret; - - lock = &atomic_locks[HASH(ptr)]; - __cpu_simple_lock(lock); - ret = *ptr; - if (__predict_true(ret == old)) { - *ptr = new; - } - __cpu_simple_unlock(lock); - - return ret; -} -#endif - -static uint16_t -_atomic_cas_16_mp(volatile uint16_t *ptr, uint16_t old, uint16_t new) -{ - __cpu_simple_lock_t *lock; - uint16_t ret; - - lock = &atomic_locks[HASH(ptr)]; - __cpu_simple_lock(lock); - ret = *ptr; - if (__predict_true(ret == old)) { - *ptr = new; - } - __cpu_simple_unlock(lock); - - return ret; -} - -static uint8_t -_atomic_cas_8_mp(volatile uint8_t *ptr, uint8_t old, uint8_t new) -{ - __cpu_simple_lock_t *lock; - uint8_t ret; - - lock = &atomic_locks[HASH(ptr)]; + lock = &atomic_locks[((uintptr_t)ptr >> 3) & 127]; __cpu_simple_lock(lock); ret = *ptr; if (__predict_true(ret == old)) { @@ -249,45 +109,13 @@ _atomic_cas_32(volatile uint32_t *ptr, u return (*_atomic_cas_fn)(ptr, old, new); } -#ifdef __HAVE_ATOMIC_CAS_64_UP -uint64_t _atomic_cas_64(volatile uint64_t *, uint64_t, uint64_t); - -uint64_t -_atomic_cas_64(volatile uint64_t *ptr, uint64_t old, uint64_t new) -{ - - return (*_atomic_cas_64_fn)(ptr, old, new); -} -#endif - -uint16_t -_atomic_cas_16(volatile uint16_t *ptr, uint16_t old, uint16_t new) -{ - - return (*_atomic_cas_16_fn)(ptr, old, new); -} - -uint8_t _atomic_cas_8(volatile uint8_t *, uint8_t, uint8_t); - -uint8_t -_atomic_cas_8(volatile uint8_t *ptr, uint8_t old, uint8_t new) -{ - - return (*_atomic_cas_8_fn)(ptr, old, new); -} - -void __section(".text.startup") +void __libc_atomic_init(void) { int ncpu, mib[2]; size_t len; _atomic_cas_fn = _atomic_cas_mp; -#ifdef __HAVE_ATOMIC_CAS_64_UP - _atomic_cas_64_fn = _atomic_cas_64_mp; -#endif - _atomic_cas_16_fn = _atomic_cas_16_mp; - _atomic_cas_8_fn = _atomic_cas_8_mp; mib[0] = CTL_HW; mib[1] = HW_NCPU; @@ -301,26 +129,6 @@ __libc_atomic_init(void) _atomic_cas_fn = _atomic_cas_up; return; } - -#ifdef __HAVE_ATOMIC_CAS_64_UP - if (rasctl(RAS_ADDR(_atomic_cas_64), RAS_SIZE(_atomic_cas_64), - RAS_INSTALL) == 0) { - _atomic_cas_64_fn = _atomic_cas_64_up; - return; - } -#endif - - if (rasctl(RAS_ADDR(_atomic_cas_16), RAS_SIZE(_atomic_cas_16), - RAS_INSTALL) == 0) { - _atomic_cas_16_fn = _atomic_cas_16_up; - return; - } - - if (rasctl(RAS_ADDR(_atomic_cas_8), RAS_SIZE(_atomic_cas_8), - RAS_INSTALL) == 0) { - _atomic_cas_8_fn = _atomic_cas_8_up; - return; - } } #undef atomic_cas_32 @@ -348,15 +156,3 @@ atomic_op_alias(atomic_cas_ulong_ni,_ato __strong_alias(_atomic_cas_ulong_ni,_atomic_cas_32) atomic_op_alias(atomic_cas_ptr_ni,_atomic_cas_32) __strong_alias(_atomic_cas_ptr_ni,_atomic_cas_32) - -//atomic_op_alias(atomic_cas_16,_atomic_cas_16) -//atomic_op_alias(atomic_cas_16_ni,_atomic_cas_16) -//atomic_op_alias(atomic_cas_8,_atomic_cas_8) -//atomic_op_alias(atomic_cas_8_ni,_atomic_cas_8) -#ifdef __HAVE_ATOMIC_CAS_64_UP -//atomic_op_alias(atomic_cas_64_ni,_atomic_cas_64) -crt_alias(__sync_val_compare_and_swap_8,_atomic_cas_64) -#endif -crt_alias(__sync_val_compare_and_swap_4,_atomic_cas_32) -crt_alias(__sync_val_compare_and_swap_2,_atomic_cas_16) -crt_alias(__sync_val_compare_and_swap_1,_atomic_cas_8)