add fallback blas_lock implementation
to be used on armv5 and new platforms
This commit is contained in:
parent
f2ac1a5cee
commit
6b92204a7c
14
common.h
14
common.h
|
@ -435,9 +435,23 @@ static inline unsigned long long rpcc(void){
|
|||
#define RPCC64BIT
|
||||
#endif // !RPCC_DEFINED
|
||||
|
||||
#if !defined(BLAS_LOCK_DEFINED) && defined(__GNUC__)
|
||||
static void __inline blas_lock(volatile BLASULONG *address){
|
||||
|
||||
do {
|
||||
while (*address) {YIELDING;};
|
||||
|
||||
} while (!__sync_bool_compare_and_swap(address, 0, 1));
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
#endif
|
||||
|
||||
#ifndef RPCC_DEFINED
|
||||
#error "rpcc() implementation is missing for your platform"
|
||||
#endif
|
||||
#ifndef BLAS_LOCK_DEFINED
|
||||
#error "blas_lock() implementation is missing for your platform"
|
||||
#endif
|
||||
#endif // !ASSEMBLER
|
||||
|
||||
#ifdef OS_LINUX
|
||||
|
|
|
@ -76,6 +76,7 @@ static void __inline blas_lock(unsigned long *address){
|
|||
"30:", address);
|
||||
#endif
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static __inline unsigned int rpcc(void){
|
||||
|
||||
|
|
|
@ -51,6 +51,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
||||
#ifndef ASSEMBLER
|
||||
|
||||
#if defined(ARMV6) || defined(ARMV7) || defined(ARMV8)
|
||||
|
||||
static void __inline blas_lock(volatile BLASULONG *address){
|
||||
|
||||
int register ret;
|
||||
|
@ -71,6 +73,8 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
|||
MB;
|
||||
}
|
||||
|
||||
#define BLAS_LOCK_DEFINED
|
||||
#endif
|
||||
|
||||
static inline int blas_quickdivide(blasint x, blasint y){
|
||||
return x / y;
|
||||
|
|
|
@ -69,6 +69,7 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
|||
} while (ret);
|
||||
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
|
||||
static inline int blas_quickdivide(blasint x, blasint y){
|
||||
|
|
|
@ -68,6 +68,7 @@ static __inline void blas_lock(volatile unsigned long *address){
|
|||
: "ar.ccv", "memory");
|
||||
} while (ret);
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static __inline unsigned long rpcc(void) {
|
||||
unsigned long clocks;
|
||||
|
@ -100,6 +101,7 @@ static __inline void blas_lock(volatile unsigned long *address){
|
|||
while (*address || _InterlockedCompareExchange((volatile int *) address,1,0))
|
||||
;
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static __inline unsigned int rpcc(void) {
|
||||
return __getReg(_IA64_REG_AR_ITC);
|
||||
|
|
|
@ -98,6 +98,7 @@ static void INLINE blas_lock(volatile unsigned long *address){
|
|||
|
||||
} while (ret);
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static inline unsigned int rpcc(void){
|
||||
unsigned long ret;
|
||||
|
|
|
@ -87,6 +87,7 @@ static void INLINE blas_lock(volatile unsigned long *address){
|
|||
#endif
|
||||
} while (ret);
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static inline unsigned long rpcc(void){
|
||||
unsigned long ret;
|
||||
|
|
|
@ -58,6 +58,7 @@ static void __inline blas_lock(volatile unsigned long *address){
|
|||
: "memory");
|
||||
} while (ret);
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static __inline unsigned long rpcc(void){
|
||||
unsigned long clocks;
|
||||
|
|
|
@ -65,6 +65,7 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
|||
} while (ret);
|
||||
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static __inline unsigned long long rpcc(void){
|
||||
unsigned int a, d;
|
||||
|
|
|
@ -74,6 +74,7 @@ static void __inline blas_lock(volatile BLASULONG *address){
|
|||
|
||||
} while (ret);
|
||||
}
|
||||
#define BLAS_LOCK_DEFINED
|
||||
|
||||
static __inline BLASULONG rpcc(void){
|
||||
BLASULONG a, d;
|
||||
|
|
Loading…
Reference in New Issue