diff options
author | ivmai <ivmai> | 2011-06-06 20:28:43 +0000 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2011-07-25 16:03:27 +0400 |
commit | 28f11cc87457c812ff43ec827b11bf3af13feeab (patch) | |
tree | 1b6373427d13e6024d0fa567e2183c3d2bb2c821 | |
parent | ce96c1783988dbeef95ac5f7f53b59e9cf8dd8bb (diff) | |
download | libatomic_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-- | ChangeLog | 9 | ||||
-rw-r--r-- | src/atomic_ops/sysdeps/gcc/arm.h | 14 |
2 files changed, 16 insertions, 7 deletions
@@ -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" |