summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorivmai <ivmai>2011-06-06 20:28:43 +0000
committerIvan Maidanski <ivmai@mail.ru>2011-07-25 16:03:27 +0400
commit28f11cc87457c812ff43ec827b11bf3af13feeab (patch)
tree1b6373427d13e6024d0fa567e2183c3d2bb2c821
parentce96c1783988dbeef95ac5f7f53b59e9cf8dd8bb (diff)
downloadlibatomic_ops-28f11cc87457c812ff43ec827b11bf3af13feeab.tar.gz
2011-06-06 Ivan Maidanski <ivmai@mail.ru>
* src/atomic_ops/sysdeps/gcc/arm.h (AO_THUMB_GO_ARM, AO_THUMB_RESTORE_MODE): Use single-digit labels (to workaround a bug in GCC v4.2.1 which reports "garbage following instruction" otherwise). * src/atomic_ops/sysdeps/gcc/arm.h (AO_compare_and_swap): Use "IT" instruction only for Thumb-2 mode.
-rw-r--r--ChangeLog9
-rw-r--r--src/atomic_ops/sysdeps/gcc/arm.h14
2 files changed, 16 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 6dcaf65..e13d570 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,15 @@
2011-06-06 Ivan Maidanski <ivmai@mail.ru>
* src/atomic_ops/sysdeps/gcc/arm.h (AO_THUMB_GO_ARM,
+ AO_THUMB_RESTORE_MODE): Use single-digit labels (to workaround
+ a bug in GCC v4.2.1 which reports "garbage following instruction"
+ otherwise).
+ * src/atomic_ops/sysdeps/gcc/arm.h (AO_compare_and_swap): Use "IT"
+ instruction only for Thumb-2 mode.
+
+2011-06-06 Ivan Maidanski <ivmai@mail.ru>
+
+ * src/atomic_ops/sysdeps/gcc/arm.h (AO_THUMB_GO_ARM,
AO_THUMB_RESTORE_MODE, AO_THUMB_SWITCH_CLOBBERS): Define as empty
for Thumb-2 mode.
* src/atomic_ops/sysdeps/gcc/arm.h (AO_store, AO_test_and_set,
diff --git a/src/atomic_ops/sysdeps/gcc/arm.h b/src/atomic_ops/sysdeps/gcc/arm.h
index fbf0717..2d27920 100644
--- a/src/atomic_ops/sysdeps/gcc/arm.h
+++ b/src/atomic_ops/sysdeps/gcc/arm.h
@@ -35,16 +35,16 @@
/* instructions, so we temporarily switch to ARM mode and go back */
/* afterwards (clobbering "r3" register). */
# define AO_THUMB_GO_ARM \
- " adr r3, 101f\n" \
+ " adr r3, 4f\n" \
" bx r3\n" \
" .align\n" \
" .arm\n" \
- "101:\n"
+ "4:\n"
# define AO_THUMB_RESTORE_MODE \
- " adr r3, 102f + 1\n" \
+ " adr r3, 5f + 1\n" \
" bx r3\n" \
" .thumb\n" \
- "102:\n"
+ "5:\n"
# define AO_THUMB_SWITCH_CLOBBERS "r3",
#else
# define AO_THUMB_GO_ARM /* empty */
@@ -179,7 +179,7 @@ AO_fetch_and_add(volatile AO_t *p, AO_t incr)
" bne 1b\n"
AO_THUMB_RESTORE_MODE
: "=&r"(result), "=&r"(flag), "=&r"(tmp), "+m"(*p) /* 0..3 */
- : "r"(incr), "r"(p) /* 4..5 */
+ : "r"(incr), "r"(p) /* 4..5 */
: AO_THUMB_SWITCH_CLOBBERS "cc");
return result;
}
@@ -241,8 +241,8 @@ AO_compare_and_swap(volatile AO_t *addr, AO_t old_val, AO_t new_val)
"1: mov %0, #2\n" /* store a flag */
" ldrex %1, [%3]\n" /* get original */
" teq %1, %4\n" /* see if match */
-# ifdef __thumb__
- " it eq\n" /* for Thumb-2, in fact */
+# ifdef __thumb2__
+ " it eq\n"
# endif
" strexeq %0, %5, [%3]\n" /* store new one if matched */
" teq %0, #1\n"