]> granicus.if.org Git - libatomic_ops/commitdiff
2009-10-05 Ivan Maidanski <ivmai@mail.ru> (really Takashi YOSHII)
authorivmai <ivmai>
Mon, 5 Oct 2009 16:43:01 +0000 (16:43 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Mon, 25 Jul 2011 12:03:25 +0000 (16:03 +0400)
* src/atomic_ops/sysdeps/gcc/sh.h: New file.
* src/atomic_ops.h: Include gcc/sh.h if __arm__.
* src/atomic_ops/sysdeps/Makefile.am: Add gcc/sh.h entry.

ChangeLog
src/atomic_ops.h
src/atomic_ops/sysdeps/Makefile.am
src/atomic_ops/sysdeps/gcc/sh.h [new file with mode: 0644]

index cbf2158586ef6634ecd0eb95cbbb9b305781a176..8de5720b4a8eebbc7cec36d355ed3a93b00edb3e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,14 @@
+2009-10-05  Ivan Maidanski <ivmai@mail.ru> (really Takashi YOSHII)
+
+       * src/atomic_ops/sysdeps/gcc/sh.h: New file.
+       * src/atomic_ops.h: Include gcc/sh.h if __arm__.
+       * src/atomic_ops/sysdeps/Makefile.am: Add gcc/sh.h entry.
+
 2009-10-02  Ivan Maidanski <ivmai@mail.ru>
 
-       * Makefile.am: Add armcc/arm_v6.h, msftc/arm.h,
-       msftc/common32_defs.h, sunc/x86.h sunc/x86_64.h entries; order all
-       entries alphabetically.
+       * src/atomic_ops/sysdeps/Makefile.am: Add armcc/arm_v6.h,
+       msftc/arm.h, msftc/common32_defs.h, sunc/x86.h sunc/x86_64.h
+       entries; order all entries alphabetically.
        * Makefile.in: Regenerate.
 
 2009-10-01  Ivan Maidanski <ivmai@mail.ru>
index 5edcf1a359b680eaef8b88c9563d4e3e2bd2a424..14247117253ce730543c22bc5f2b4838b72b80a9 100644 (file)
 # if defined(__mips__)
 #   include "atomic_ops/sysdeps/gcc/mips.h"
 # endif /* __mips__ */
+# if defined(__sh__) || defined(SH4)
+#   include "atomic_ops/sysdeps/gcc/sh.h"
+#   define AO_CAN_EMUL_CAS
+# endif /* __sh__ */
 #endif /* __GNUC__ && !AO_USE_PTHREAD_DEFS */
 
 #if defined(__INTEL_COMPILER) && !defined(AO_USE_PTHREAD_DEFS)
index b06d712dc3d9ea2d8a282363554e7e15755dc35a..d0274f01809e73581e1613996d916c9c53554a36 100644 (file)
@@ -29,7 +29,7 @@ nobase_sysdep_HEADERS= generic_pthread.h \
          gcc/alpha.h gcc/arm.h gcc/cris.h \
          gcc/hppa.h gcc/ia64.h gcc/m68k.h \
          gcc/mips.h gcc/powerpc.h gcc/s390.h \
-         gcc/sparc.h gcc/x86.h gcc/x86_64.h \
+         gcc/sh.h gcc/sparc.h gcc/x86.h gcc/x86_64.h \
        \
          hpc/hppa.h hpc/ia64.h \
        \
diff --git a/src/atomic_ops/sysdeps/gcc/sh.h b/src/atomic_ops/sysdeps/gcc/sh.h
new file mode 100644 (file)
index 0000000..95a89c7
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2009 by Takashi YOSHII. 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 "../all_atomic_load_store.h"
+#include "../ordered.h"
+
+/* sh has tas.b(byte) only */
+#include "../test_and_set_t_is_char.h"
+
+/* FIXME: Is AO_TS_SET redefining needed? */
+/* #undef AO_TS_SET */
+/* #define AO_TS_SET (1<<7) */
+
+AO_INLINE AO_TS_VAL_t
+AO_test_and_set_full(volatile AO_TS_t *addr)
+{
+  int oldval;
+
+  __asm__ __volatile__(
+       "tas.b @%1; movt %0"
+       : "=r" (oldval)
+       : "r" (addr)
+       : "t", "memory");
+   return oldval? AO_TS_CLEAR : AO_TS_SET;
+}
+#define AO_HAVE_test_and_set_full