diff --git a/libatomic_ops-aarch64.patch b/libatomic_ops-aarch64.patch new file mode 100644 index 0000000..d01f8d1 --- /dev/null +++ b/libatomic_ops-aarch64.patch @@ -0,0 +1,1381 @@ +From: Andreas Schwab +Date: Sat May 18 08:10:09 UTC 2013 + +"libatomic_ops-aarch64.patch: aarch64 support for libatomic_ops from +upstream add-aarch64-support branch" + +Index: libatomic_ops/src/atomic_ops.h +=================================================================== +--- libatomic_ops/src/atomic_ops.h.orig ++++ libatomic_ops/src/atomic_ops.h +@@ -244,6 +244,10 @@ + || defined(__powerpc64__) || defined(__ppc64__) + # include "atomic_ops/sysdeps/gcc/powerpc.h" + # endif /* __powerpc__ */ ++# if defined(__aarch64__) ++# include "atomic_ops/sysdeps/gcc/aarch64.h" ++# define AO_CAN_EMUL_CAS ++# endif /* __aarch64__ */ + # if defined(__arm__) && !defined(AO_USE_PTHREAD_DEFS) + # include "atomic_ops/sysdeps/gcc/arm.h" + # define AO_CAN_EMUL_CAS +Index: libatomic_ops/src/atomic_ops/sysdeps/Makefile.am +=================================================================== +--- libatomic_ops/src/atomic_ops/sysdeps/Makefile.am.orig ++++ libatomic_ops/src/atomic_ops/sysdeps/Makefile.am +@@ -30,6 +30,8 @@ nobase_sysdep_HEADERS= generic_pthread.h + gcc/hexagon.h gcc/hppa.h gcc/ia64.h gcc/m68k.h \ + gcc/mips.h gcc/powerpc.h gcc/s390.h \ + gcc/sh.h gcc/sparc.h gcc/x86.h gcc/x86_64.h \ ++ gcc/aarch64.h gcc/generic.h \ ++ gcc/generic-small.h gcc/generic-arithm.h \ + \ + hpc/hppa.h hpc/ia64.h \ + \ +Index: libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h +=================================================================== +--- /dev/null ++++ libatomic_ops/src/atomic_ops/sysdeps/gcc/aarch64.h +@@ -0,0 +1,176 @@ ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 1999-2003 by Hewlett-Packard Company. All rights reserved. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++#include "../test_and_set_t_is_ao_t.h" ++ ++#include "../standard_ao_double_t.h" ++ ++#ifndef AO_UNIPROCESSOR ++ AO_INLINE void ++ AO_nop_write(void) ++ { ++ __asm__ __volatile__("dmb st" : : : "memory"); ++ } ++# define AO_HAVE_nop_write ++#endif ++ ++/* TODO: Adjust version check on fixing double-wide AO support in GCC. */ ++#if __GNUC__ == 4 ++ ++ AO_INLINE AO_double_t ++ AO_double_load(const volatile AO_double_t *addr) ++ { ++ AO_double_t result; ++ int status; ++ ++ /* Note that STXP cannot be discarded because LD[A]XP is not */ ++ /* single-copy atomic (unlike LDREXD for 32-bit ARM). */ ++ do { ++ __asm__ __volatile__("//AO_double_load\n" ++ " ldxp %0, %1, %3\n" ++ " stxp %w2, %0, %1, %3" ++ : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status) ++ : "Q" (*addr)); ++ } while (status); ++ return result; ++ } ++# define AO_HAVE_double_load ++ ++ AO_INLINE AO_double_t ++ AO_double_load_acquire(const volatile AO_double_t *addr) ++ { ++ AO_double_t result; ++ int status; ++ ++ do { ++ __asm__ __volatile__("//AO_double_load_acquire\n" ++ " ldaxp %0, %1, %3\n" ++ " stxp %w2, %0, %1, %3" ++ : "=&r" (result.AO_val1), "=&r" (result.AO_val2), "=&r" (status) ++ : "Q" (*addr)); ++ } while (status); ++ return result; ++ } ++# define AO_HAVE_double_load_acquire ++ ++ AO_INLINE void ++ AO_double_store(volatile AO_double_t *addr, AO_double_t value) ++ { ++ AO_double_t old_val; ++ int status; ++ ++ do { ++ __asm__ __volatile__("//AO_double_store\n" ++ " ldxp %0, %1, %3\n" ++ " stxp %w2, %4, %5, %3" ++ : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status), ++ "=Q" (*addr) ++ : "r" (value.AO_val1), "r" (value.AO_val2)); ++ /* Compared to the arm.h implementation, the 'cc' (flags) are not */ ++ /* clobbered because A64 has no concept of conditional execution. */ ++ } while (status); ++ } ++# define AO_HAVE_double_store ++ ++ AO_INLINE void ++ AO_double_store_release(volatile AO_double_t *addr, AO_double_t value) ++ { ++ AO_double_t old_val; ++ int status; ++ ++ do { ++ __asm__ __volatile__("//AO_double_store_release\n" ++ " ldxp %0, %1, %3\n" ++ " stlxp %w2, %4, %5, %3" ++ : "=&r" (old_val.AO_val1), "=&r" (old_val.AO_val2), "=&r" (status), ++ "=Q" (*addr) ++ : "r" (value.AO_val1), "r" (value.AO_val2)); ++ } while (status); ++ } ++# define AO_HAVE_double_store_release ++ ++ AO_INLINE int ++ AO_double_compare_and_swap(volatile AO_double_t *addr, ++ AO_double_t old_val, AO_double_t new_val) ++ { ++ AO_double_t tmp; ++ int result = 1; ++ ++ do { ++ __asm__ __volatile__("//AO_double_compare_and_swap\n" ++ " ldxp %0, %1, %2\n" ++ : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) ++ : "Q" (*addr)); ++ if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) ++ break; ++ __asm__ __volatile__( ++ " stxp %w0, %2, %3, %1\n" ++ : "=&r" (result), "=Q" (*addr) ++ : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); ++ } while (result); ++ return !result; ++ } ++# define AO_HAVE_double_compare_and_swap ++ ++ AO_INLINE int ++ AO_double_compare_and_swap_acquire(volatile AO_double_t *addr, ++ AO_double_t old_val, AO_double_t new_val) ++ { ++ AO_double_t tmp; ++ int result = 1; ++ ++ do { ++ __asm__ __volatile__("//AO_double_compare_and_swap_acquire\n" ++ " ldaxp %0, %1, %2\n" ++ : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) ++ : "Q" (*addr)); ++ if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) ++ break; ++ __asm__ __volatile__( ++ " stxp %w0, %2, %3, %1\n" ++ : "=&r" (result), "=Q" (*addr) ++ : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); ++ } while (result); ++ return !result; ++ } ++# define AO_HAVE_double_compare_and_swap_acquire ++ ++ AO_INLINE int ++ AO_double_compare_and_swap_release(volatile AO_double_t *addr, ++ AO_double_t old_val, AO_double_t new_val) ++ { ++ AO_double_t tmp; ++ int result = 1; ++ ++ do { ++ __asm__ __volatile__("//AO_double_compare_and_swap_release\n" ++ " ldxp %0, %1, %2\n" ++ : "=&r" (tmp.AO_val1), "=&r" (tmp.AO_val2) ++ : "Q" (*addr)); ++ if (tmp.AO_val1 != old_val.AO_val1 || tmp.AO_val2 != old_val.AO_val2) ++ break; ++ __asm__ __volatile__( ++ " stlxp %w0, %2, %3, %1\n" ++ : "=&r" (result), "=Q" (*addr) ++ : "r" (new_val.AO_val1), "r" (new_val.AO_val2)); ++ } while (result); ++ return !result; ++ } ++# define AO_HAVE_double_compare_and_swap_release ++#endif ++ ++#include "generic.h" +Index: libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h +=================================================================== +--- /dev/null ++++ libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-arithm.h +@@ -0,0 +1,704 @@ ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/char ++AO_char_fetch_and_add(volatile unsigned/**/char *addr, unsigned/**/char incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_char_fetch_and_add ++ ++AO_INLINE void ++AO_char_and(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_char_and ++ ++AO_INLINE void ++AO_char_or(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_char_or ++ ++AO_INLINE void ++AO_char_xor(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_char_xor ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/short ++AO_short_fetch_and_add(volatile unsigned/**/short *addr, unsigned/**/short incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_short_fetch_and_add ++ ++AO_INLINE void ++AO_short_and(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_short_and ++ ++AO_INLINE void ++AO_short_or(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_short_or ++ ++AO_INLINE void ++AO_short_xor(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_short_xor ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned ++AO_int_fetch_and_add(volatile unsigned *addr, unsigned incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_int_fetch_and_add ++ ++AO_INLINE void ++AO_int_and(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_int_and ++ ++AO_INLINE void ++AO_int_or(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_int_or ++ ++AO_INLINE void ++AO_int_xor(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_int_xor ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE AO_t ++AO_fetch_and_add(volatile AO_t *addr, AO_t incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_fetch_and_add ++ ++AO_INLINE void ++AO_and(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_and ++ ++AO_INLINE void ++AO_or(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_or ++ ++AO_INLINE void ++AO_xor(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_xor ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/char ++AO_char_fetch_and_add_acquire(volatile unsigned/**/char *addr, unsigned/**/char incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_char_fetch_and_add_acquire ++ ++AO_INLINE void ++AO_char_and_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_char_and_acquire ++ ++AO_INLINE void ++AO_char_or_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_char_or_acquire ++ ++AO_INLINE void ++AO_char_xor_acquire(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_char_xor_acquire ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/short ++AO_short_fetch_and_add_acquire(volatile unsigned/**/short *addr, unsigned/**/short incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_short_fetch_and_add_acquire ++ ++AO_INLINE void ++AO_short_and_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_short_and_acquire ++ ++AO_INLINE void ++AO_short_or_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_short_or_acquire ++ ++AO_INLINE void ++AO_short_xor_acquire(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_short_xor_acquire ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned ++AO_int_fetch_and_add_acquire(volatile unsigned *addr, unsigned incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_int_fetch_and_add_acquire ++ ++AO_INLINE void ++AO_int_and_acquire(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_int_and_acquire ++ ++AO_INLINE void ++AO_int_or_acquire(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_int_or_acquire ++ ++AO_INLINE void ++AO_int_xor_acquire(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_int_xor_acquire ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE AO_t ++AO_fetch_and_add_acquire(volatile AO_t *addr, AO_t incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_fetch_and_add_acquire ++ ++AO_INLINE void ++AO_and_acquire(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_and_acquire ++ ++AO_INLINE void ++AO_or_acquire(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_or_acquire ++ ++AO_INLINE void ++AO_xor_acquire(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_xor_acquire ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/char ++AO_char_fetch_and_add_release(volatile unsigned/**/char *addr, unsigned/**/char incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_char_fetch_and_add_release ++ ++AO_INLINE void ++AO_char_and_release(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_char_and_release ++ ++AO_INLINE void ++AO_char_or_release(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_char_or_release ++ ++AO_INLINE void ++AO_char_xor_release(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_char_xor_release ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/short ++AO_short_fetch_and_add_release(volatile unsigned/**/short *addr, unsigned/**/short incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_short_fetch_and_add_release ++ ++AO_INLINE void ++AO_short_and_release(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_short_and_release ++ ++AO_INLINE void ++AO_short_or_release(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_short_or_release ++ ++AO_INLINE void ++AO_short_xor_release(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_short_xor_release ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned ++AO_int_fetch_and_add_release(volatile unsigned *addr, unsigned incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_int_fetch_and_add_release ++ ++AO_INLINE void ++AO_int_and_release(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_int_and_release ++ ++AO_INLINE void ++AO_int_or_release(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_int_or_release ++ ++AO_INLINE void ++AO_int_xor_release(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_int_xor_release ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE AO_t ++AO_fetch_and_add_release(volatile AO_t *addr, AO_t incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_fetch_and_add_release ++ ++AO_INLINE void ++AO_and_release(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_and_release ++ ++AO_INLINE void ++AO_or_release(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_or_release ++ ++AO_INLINE void ++AO_xor_release(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_xor_release ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/char ++AO_char_fetch_and_add_full(volatile unsigned/**/char *addr, unsigned/**/char incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_char_fetch_and_add_full ++ ++AO_INLINE void ++AO_char_and_full(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_char_and_full ++ ++AO_INLINE void ++AO_char_or_full(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_char_or_full ++ ++AO_INLINE void ++AO_char_xor_full(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_char_xor_full ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/short ++AO_short_fetch_and_add_full(volatile unsigned/**/short *addr, unsigned/**/short incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_short_fetch_and_add_full ++ ++AO_INLINE void ++AO_short_and_full(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_short_and_full ++ ++AO_INLINE void ++AO_short_or_full(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_short_or_full ++ ++AO_INLINE void ++AO_short_xor_full(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_short_xor_full ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned ++AO_int_fetch_and_add_full(volatile unsigned *addr, unsigned incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_int_fetch_and_add_full ++ ++AO_INLINE void ++AO_int_and_full(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_int_and_full ++ ++AO_INLINE void ++AO_int_or_full(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_int_or_full ++ ++AO_INLINE void ++AO_int_xor_full(volatile unsigned *addr, unsigned value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_int_xor_full ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE AO_t ++AO_fetch_and_add_full(volatile AO_t *addr, AO_t incr) ++{ ++ return __atomic_fetch_add(addr, incr, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_fetch_and_add_full ++ ++AO_INLINE void ++AO_and_full(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_and_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_and_full ++ ++AO_INLINE void ++AO_or_full(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_or_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_or_full ++ ++AO_INLINE void ++AO_xor_full(volatile AO_t *addr, AO_t value) ++{ ++ (void)__atomic_xor_fetch(addr, value, __ATOMIC_SEQ_CST); ++} ++#define AO_HAVE_xor_full +Index: libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h +=================================================================== +--- /dev/null ++++ libatomic_ops/src/atomic_ops/sysdeps/gcc/generic-small.h +@@ -0,0 +1,280 @@ ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/char ++AO_char_load(const volatile unsigned/**/char *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_char_load ++ ++AO_INLINE unsigned/**/char ++AO_char_load_acquire(const volatile unsigned/**/char *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_char_load_acquire ++ ++/* char_load_full is generalized using load and nop_full, so that */ ++/* char_load_read is defined using load and nop_read. */ ++/* char_store_full definition is omitted similar to load_full reason. */ ++ ++AO_INLINE void ++AO_char_store(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_char_store ++ ++AO_INLINE void ++AO_char_store_release(volatile unsigned/**/char *addr, unsigned/**/char value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_char_store_release ++ ++AO_INLINE unsigned/**/char ++AO_char_fetch_compare_and_swap(volatile unsigned/**/char *addr, ++ unsigned/**/char old_val, unsigned/**/char new_val) ++{ ++ return __sync_val_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++} ++#define AO_HAVE_char_fetch_compare_and_swap ++ ++/* TODO: Add CAS _acquire/release/full primitives. */ ++ ++#ifndef AO_GENERALIZE_ASM_BOOL_CAS ++ AO_INLINE int ++ AO_char_compare_and_swap(volatile unsigned/**/char *addr, ++ unsigned/**/char old_val, unsigned/**/char new_val) ++ { ++ return __sync_bool_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++ } ++# define AO_HAVE_char_compare_and_swap ++#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned/**/short ++AO_short_load(const volatile unsigned/**/short *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_short_load ++ ++AO_INLINE unsigned/**/short ++AO_short_load_acquire(const volatile unsigned/**/short *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_short_load_acquire ++ ++/* short_load_full is generalized using load and nop_full, so that */ ++/* short_load_read is defined using load and nop_read. */ ++/* short_store_full definition is omitted similar to load_full reason. */ ++ ++AO_INLINE void ++AO_short_store(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_short_store ++ ++AO_INLINE void ++AO_short_store_release(volatile unsigned/**/short *addr, unsigned/**/short value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_short_store_release ++ ++AO_INLINE unsigned/**/short ++AO_short_fetch_compare_and_swap(volatile unsigned/**/short *addr, ++ unsigned/**/short old_val, unsigned/**/short new_val) ++{ ++ return __sync_val_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++} ++#define AO_HAVE_short_fetch_compare_and_swap ++ ++/* TODO: Add CAS _acquire/release/full primitives. */ ++ ++#ifndef AO_GENERALIZE_ASM_BOOL_CAS ++ AO_INLINE int ++ AO_short_compare_and_swap(volatile unsigned/**/short *addr, ++ unsigned/**/short old_val, unsigned/**/short new_val) ++ { ++ return __sync_bool_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++ } ++# define AO_HAVE_short_compare_and_swap ++#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE unsigned ++AO_int_load(const volatile unsigned *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_int_load ++ ++AO_INLINE unsigned ++AO_int_load_acquire(const volatile unsigned *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_int_load_acquire ++ ++/* int_load_full is generalized using load and nop_full, so that */ ++/* int_load_read is defined using load and nop_read. */ ++/* int_store_full definition is omitted similar to load_full reason. */ ++ ++AO_INLINE void ++AO_int_store(volatile unsigned *addr, unsigned value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_int_store ++ ++AO_INLINE void ++AO_int_store_release(volatile unsigned *addr, unsigned value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_int_store_release ++ ++AO_INLINE unsigned ++AO_int_fetch_compare_and_swap(volatile unsigned *addr, ++ unsigned old_val, unsigned new_val) ++{ ++ return __sync_val_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++} ++#define AO_HAVE_int_fetch_compare_and_swap ++ ++/* TODO: Add CAS _acquire/release/full primitives. */ ++ ++#ifndef AO_GENERALIZE_ASM_BOOL_CAS ++ AO_INLINE int ++ AO_int_compare_and_swap(volatile unsigned *addr, ++ unsigned old_val, unsigned new_val) ++ { ++ return __sync_bool_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++ } ++# define AO_HAVE_int_compare_and_swap ++#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++AO_INLINE AO_t ++AO_load(const volatile AO_t *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_load ++ ++AO_INLINE AO_t ++AO_load_acquire(const volatile AO_t *addr) ++{ ++ return __atomic_load_n(addr, __ATOMIC_ACQUIRE); ++} ++#define AO_HAVE_load_acquire ++ ++/* load_full is generalized using load and nop_full, so that */ ++/* load_read is defined using load and nop_read. */ ++/* store_full definition is omitted similar to load_full reason. */ ++ ++AO_INLINE void ++AO_store(volatile AO_t *addr, AO_t value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELAXED); ++} ++#define AO_HAVE_store ++ ++AO_INLINE void ++AO_store_release(volatile AO_t *addr, AO_t value) ++{ ++ __atomic_store_n(addr, value, __ATOMIC_RELEASE); ++} ++#define AO_HAVE_store_release ++ ++AO_INLINE AO_t ++AO_fetch_compare_and_swap(volatile AO_t *addr, ++ AO_t old_val, AO_t new_val) ++{ ++ return __sync_val_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++} ++#define AO_HAVE_fetch_compare_and_swap ++ ++/* TODO: Add CAS _acquire/release/full primitives. */ ++ ++#ifndef AO_GENERALIZE_ASM_BOOL_CAS ++ AO_INLINE int ++ AO_compare_and_swap(volatile AO_t *addr, ++ AO_t old_val, AO_t new_val) ++ { ++ return __sync_bool_compare_and_swap(addr, old_val, new_val ++ /* empty protection list */); ++ } ++# define AO_HAVE_compare_and_swap ++#endif /* !AO_GENERALIZE_ASM_BOOL_CAS */ +Index: libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h +=================================================================== +--- /dev/null ++++ libatomic_ops/src/atomic_ops/sysdeps/gcc/generic.h +@@ -0,0 +1,154 @@ ++/* ++ * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. ++ * Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. ++ * Copyright (c) 2003-2011 Hewlett-Packard Development Company, L.P. ++ * ++ * ++ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED ++ * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. ++ * ++ * Permission is hereby granted to use or copy this program ++ * for any purpose, provided the above notices are retained on all copies. ++ * Permission to modify the code and to distribute modified code is granted, ++ * provided the above notices are retained, and a notice that the code was ++ * modified is included with the above copyright notice. ++ * ++ */ ++ ++/* The following implementation assumes GCC 4.7 or later. */ ++/* For the details, see GNU Manual, chapter 6.52 (Built-in functions */ ++/* for memory model aware atomic operations). */ ++ ++/* TODO: Include this file for other targets if gcc 4.7+ */ ++ ++#ifdef AO_UNIPROCESSOR ++ /* If only a single processor (core) is used, AO_UNIPROCESSOR could */ ++ /* be defined by the client to avoid unnecessary memory barrier. */ ++ AO_INLINE void ++ AO_nop_full(void) ++ { ++ AO_compiler_barrier(); ++ } ++# define AO_HAVE_nop_full ++ ++#else ++ AO_INLINE void ++ AO_nop_read(void) ++ { ++ __atomic_thread_fence(__ATOMIC_ACQUIRE); ++ } ++# define AO_HAVE_nop_read ++ ++# ifndef AO_HAVE_nop_write ++ AO_INLINE void ++ AO_nop_write(void) ++ { ++ __atomic_thread_fence(__ATOMIC_RELEASE); ++ } ++# define AO_HAVE_nop_write ++# endif ++ ++ AO_INLINE void ++ AO_nop_full(void) ++ { ++ /* __sync_synchronize() could be used instead. */ ++ __atomic_thread_fence(__ATOMIC_SEQ_CST); ++ } ++# define AO_HAVE_nop_full ++#endif /* !AO_UNIPROCESSOR */ ++ ++#include "generic-small.h" ++ ++#ifndef AO_PREFER_GENERALIZED ++# include "generic-arithm.h" ++ ++ AO_INLINE AO_TS_VAL_t ++ AO_test_and_set(volatile AO_TS_t *addr) ++ { ++ return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_RELAXED); ++ } ++# define AO_HAVE_test_and_set ++ ++ AO_INLINE AO_TS_VAL_t ++ AO_test_and_set_acquire(volatile AO_TS_t *addr) ++ { ++ return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_ACQUIRE); ++ } ++# define AO_HAVE_test_and_set_acquire ++ ++ AO_INLINE AO_TS_VAL_t ++ AO_test_and_set_release(volatile AO_TS_t *addr) ++ { ++ return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_RELEASE); ++ } ++# define AO_HAVE_test_and_set_release ++ ++ AO_INLINE AO_TS_VAL_t ++ AO_test_and_set_full(volatile AO_TS_t *addr) ++ { ++ return (AO_TS_VAL_t)__atomic_test_and_set(addr, __ATOMIC_SEQ_CST); ++ } ++# define AO_HAVE_test_and_set_full ++#endif /* !AO_PREFER_GENERALIZED */ ++ ++#ifdef AO_HAVE_DOUBLE_PTR_STORAGE ++ ++# ifndef AO_HAVE_double_load ++ AO_INLINE AO_double_t ++ AO_double_load(const volatile AO_double_t *addr) ++ { ++ AO_double_t result; ++ ++ result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_RELAXED); ++ return result; ++ } ++# define AO_HAVE_double_load ++# endif ++ ++# ifndef AO_HAVE_double_load_acquire ++ AO_INLINE AO_double_t ++ AO_double_load_acquire(const volatile AO_double_t *addr) ++ { ++ AO_double_t result; ++ ++ result.AO_whole = __atomic_load_n(&addr->AO_whole, __ATOMIC_ACQUIRE); ++ return result; ++ } ++# define AO_HAVE_double_load_acquire ++# endif ++ ++# ifndef AO_HAVE_double_store ++ AO_INLINE void ++ AO_double_store(volatile AO_double_t *addr, AO_double_t value) ++ { ++ __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELAXED); ++ } ++# define AO_HAVE_double_store ++# endif ++ ++# ifndef AO_HAVE_double_store_release ++ AO_INLINE void ++ AO_double_store_release(volatile AO_double_t *addr, AO_double_t value) ++ { ++ __atomic_store_n(&addr->AO_whole, value.AO_whole, __ATOMIC_RELEASE); ++ } ++# define AO_HAVE_double_store_release ++# endif ++ ++# ifndef AO_HAVE_double_compare_and_swap ++ AO_INLINE int ++ AO_double_compare_and_swap(volatile AO_double_t *addr, ++ AO_double_t old_val, AO_double_t new_val) ++ { ++ return (int)__atomic_compare_exchange_n(&addr->AO_whole, ++ &old_val.AO_whole /* p_expected */, ++ new_val.AO_whole /* desired */, ++ 0 /* is_weak: false */, ++ __ATOMIC_RELAXED /* success */, ++ __ATOMIC_RELAXED /* failure */); ++ } ++# define AO_HAVE_double_compare_and_swap ++# endif ++ ++ /* TODO: Add double CAS _acquire/release/full primitives. */ ++#endif /* AO_HAVE_DOUBLE_PTR_STORAGE */ +Index: libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h +=================================================================== +--- libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h.orig ++++ libatomic_ops/src/atomic_ops/sysdeps/standard_ao_double_t.h +@@ -11,6 +11,8 @@ + typedef __m128 double_ptr_storage; + #elif defined(_WIN32) && !defined(__GNUC__) + typedef unsigned __int64 double_ptr_storage; ++#elif defined(__aarch64__) ++ typedef unsigned __int128 double_ptr_storage; + #else + typedef unsigned long long double_ptr_storage; + #endif diff --git a/libatomic_ops.changes b/libatomic_ops.changes index 2a13c8b..b518c4f 100644 --- a/libatomic_ops.changes +++ b/libatomic_ops.changes @@ -4,6 +4,7 @@ Sun May 26 20:05:34 UTC 2013 - jengelh@inai.de - Update to upstream release 7.2d - pkgconfig support, testsuite was fixed and no longer loops endlessy/crashes +- Transplant libatomic_ops-aarch64.patch from "gc" package ------------------------------------------------------------------- Wed May 23 12:45:39 UTC 2012 - jengelh@inai.de diff --git a/libatomic_ops.spec b/libatomic_ops.spec index c75a2ab..0f48c04 100644 --- a/libatomic_ops.spec +++ b/libatomic_ops.spec @@ -25,6 +25,7 @@ Release: 0 Url: http://www.hpl.hp.com/research/linux/atomic_ops/ Source: http://www.hpl.hp.com/research/linux/atomic_ops/download/libatomic_ops-%version.tar.gz +Patch1: libatomic_ops-aarch64.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: autoconf BuildRequires: automake @@ -52,6 +53,7 @@ that involves minimum overhead across a variety of architectures. %prep %setup -qn %name-7.2 +%patch -P 1 -p1 %build autoreconf -fi