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,
/* 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 */
" 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;
}
"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"