Module Name: src
Committed By: matt
Date: Sat Aug 10 19:59:21 UTC 2013
Modified Files:
src/common/lib/libc/arch/arm/atomic: atomic_add_32.S atomic_add_64.S
atomic_and_32.S atomic_and_64.S atomic_cas_32.S atomic_cas_64.S
atomic_cas_8.S atomic_cas_up.S atomic_dec_32.S atomic_dec_64.S
atomic_inc_32.S atomic_inc_64.S atomic_or_32.S atomic_or_64.S
atomic_swap.S atomic_swap_64.S
Log Message:
Make these under Thumb2
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/common/lib/libc/arch/arm/atomic/atomic_add_32.S \
src/common/lib/libc/arch/arm/atomic/atomic_and_32.S \
src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S \
src/common/lib/libc/arch/arm/atomic/atomic_or_32.S \
src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S
cvs rdiff -u -r1.5 -r1.6 src/common/lib/libc/arch/arm/atomic/atomic_add_64.S \
src/common/lib/libc/arch/arm/atomic/atomic_swap.S
cvs rdiff -u -r1.4 -r1.5 src/common/lib/libc/arch/arm/atomic/atomic_and_64.S \
src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S \
src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S \
src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S \
src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S \
src/common/lib/libc/arch/arm/atomic/atomic_or_64.S
cvs rdiff -u -r1.2 -r1.3 src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S \
src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S
cvs rdiff -u -r1.6 -r1.7 src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/common/lib/libc/arch/arm/atomic/atomic_add_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.4
--- src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.3 Fri Aug 31 23:41:52 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_add_32.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_add_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */
+/* $NetBSD: atomic_add_32.S,v 1.4 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -34,19 +34,19 @@
#ifdef _ARM_ARCH_6
ENTRY_NP(_atomic_add_32)
- mov r3, r0 /* need r0 for return value */
-1: ldrex r0, [r3] /* load old value (to be returned) */
- add r2, r0, r1 /* calculate new value */
- strex ip, r2, [r3] /* try to store */
- cmp ip, #0 /* succeed? */
+1: ldrex r3, [r0] /* load old value */
+ add r3, r3, r1 /* calculate new value */
+ strex r2, r3, [r0] /* try to store */
+ cmp r2, #0 /* succeed? */
bne 1b /* no, try again */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return old value */
- END(_atomic_add_32)
+END(_atomic_add_32)
+
ATOMIC_OP_ALIAS(atomic_add_32,_atomic_add_32)
ATOMIC_OP_ALIAS(atomic_add_int,_atomic_add_32)
ATOMIC_OP_ALIAS(atomic_add_long,_atomic_add_32)
@@ -56,16 +56,16 @@ STRONG_ALIAS(_atomic_add_long,_atomic_ad
STRONG_ALIAS(_atomic_add_ptr,_atomic_add_32)
ENTRY_NP(_atomic_add_32_nv)
- mov r3, r0 /* need r0 for return value */
-1: ldrex r0, [r3] /* load old value */
+ mov ip, r0 /* need r0 for return value */
+1: ldrex r0, [ip] /* load old value */
add r0, r0, r1 /* calculate new value (return value) */
- strex r2, r0, [r3] /* try to store */
+ strex r2, r0, [ip] /* try to store */
cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
END(_atomic_add_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_and_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.4
--- src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.3 Fri Aug 31 23:41:52 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_and_32.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_and_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */
+/* $NetBSD: atomic_and_32.S,v 1.4 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -34,19 +34,19 @@
#ifdef _ARM_ARCH_6
ENTRY_NP(_atomic_and_32)
- mov r3, r0 /* need r0 for return value */
-1: ldrex r0, [r3] /* load old value (to be returned) */
- and r2, r0, r1 /* calculate new value */
- strex ip, r2, [r3] /* try to store */
- cmp ip, #0 /* succeed? */
+1: ldrex r3, [r0] /* load old value (to be returned) */
+ and r3, r3, r1 /* calculate new value */
+ strex r2, r3, [r0] /* try to store */
+ cmp r2, #0 /* succeed? */
bne 1b /* no, try again */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return old value */
- END(_atomic_and_32)
+END(_atomic_and_32)
+
ATOMIC_OP_ALIAS(atomic_and_32,_atomic_and_32)
ATOMIC_OP_ALIAS(atomic_and_uint,_atomic_and_32)
ATOMIC_OP_ALIAS(atomic_and_ulong,_atomic_and_32)
@@ -63,10 +63,11 @@ ENTRY_NP(_atomic_and_32_nv)
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
- END(_atomic_and_32_nv)
+END(_atomic_and_32_nv)
+
ATOMIC_OP_ALIAS(atomic_and_32_nv,_atomic_and_32_nv)
ATOMIC_OP_ALIAS(atomic_and_uint_nv,_atomic_and_32_nv)
ATOMIC_OP_ALIAS(atomic_and_ulong_nv,_atomic_and_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.4
--- src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.3 Fri Aug 31 23:41:52 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_dec_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */
+/* $NetBSD: atomic_dec_32.S,v 1.4 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -33,19 +33,19 @@
#ifdef _ARM_ARCH_6
ENTRY_NP(_atomic_dec_32)
- mov r2, r0 /* need r0 for return value */
-1: ldrex r0, [r2] /* load old value (return value) */
- sub r1, r0, #1 /* calculate new value */
- strex r3, r1, [r2] /* try to store */
- cmp r3, #0 /* succeed? */
+1: ldrex r3, [r0] /* load old value (return value) */
+ sub r3, r3, #1 /* calculate new value */
+ strex r2, r3, [r0] /* try to store */
+ cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
- END(_atomic_dec_32)
+END(_atomic_dec_32)
+
ATOMIC_OP_ALIAS(atomic_dec_32,_atomic_dec_32)
ATOMIC_OP_ALIAS(atomic_dec_uint,_atomic_dec_32)
ATOMIC_OP_ALIAS(atomic_dec_ulong,_atomic_dec_32)
@@ -55,19 +55,20 @@ STRONG_ALIAS(_atomic_dec_ulong,_atomic_d
STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_32)
ENTRY_NP(_atomic_dec_32_nv)
- mov r2, r0 /* need r0 for return value */
-1: ldrex r0, [r2] /* load old value */
+ mov ip, r0 /* need r0 for return value */
+1: ldrex r0, [ip] /* load old value */
sub r0, r0, #1 /* calculate new value (return value) */
- strex r1, r0, [r2] /* try to store */
- cmp r1, #0 /* succeed? */
+ strex r2, r0, [ip] /* try to store */
+ cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
- END(_atomic_dec_32_nv)
+END(_atomic_dec_32_nv)
+
ATOMIC_OP_ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv)
ATOMIC_OP_ALIAS(atomic_dec_uint_nv,_atomic_dec_32_nv)
ATOMIC_OP_ALIAS(atomic_dec_ulong_nv,_atomic_dec_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_or_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.4
--- src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.3 Fri Aug 31 23:41:52 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_or_32.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_or_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */
+/* $NetBSD: atomic_or_32.S,v 1.4 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -33,19 +33,19 @@
#ifdef _ARM_ARCH_6
ENTRY_NP(_atomic_or_32)
- mov r3, r0 /* need r0 for return value */
-1: ldrex r0, [r3] /* load old value (to be returned) */
- orr r2, r0, r1 /* calculate new value */
- strex ip, r2, [r3] /* try to store */
- cmp ip, #0 /* succeed? */
+1: ldrex r3, [r0] /* load old value (to be returned) */
+ orr r3, r3, r1 /* calculate new value */
+ strex r2, r3, [r0] /* try to store */
+ cmp r2, #0 /* succeed? */
bne 1b /* no, try again */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return old value */
- END(_atomic_or_32)
+END(_atomic_or_32)
+
ATOMIC_OP_ALIAS(atomic_or_32,_atomic_or_32)
ATOMIC_OP_ALIAS(atomic_or_uint,_atomic_or_32)
ATOMIC_OP_ALIAS(atomic_or_ulong,_atomic_or_32)
@@ -53,19 +53,20 @@ STRONG_ALIAS(_atomic_or_uint,_atomic_or_
STRONG_ALIAS(_atomic_or_ulong,_atomic_or_32)
ENTRY_NP(_atomic_or_32_nv)
- mov r3, r0 /* need r0 for return value */
-1: ldrex r0, [r3] /* load old value */
+ mov ip, r0 /* need r0 for return value */
+1: ldrex r0, [ip] /* load old value */
orr r0, r0, r1 /* calculate new value (return value) */
- strex r2, r0, [r3] /* try to store */
+ strex r2, r0, [ip] /* try to store */
cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
- END(_atomic_or_32_nv)
+END(_atomic_or_32_nv)
+
ATOMIC_OP_ALIAS(atomic_or_32_nv,_atomic_or_32_nv)
ATOMIC_OP_ALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
ATOMIC_OP_ALIAS(atomic_or_ulong_nv,_atomic_or_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S:1.4
--- src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S:1.3 Sat Aug 10 18:38:33 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap_64.S,v 1.3 2013/08/10 18:38:33 matt Exp $ */
+/* $NetBSD: atomic_swap_64.S,v 1.4 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,20 +32,19 @@
ENTRY_NP(_atomic_swap_64)
push {r4} /* save temporary */
- mov r4, r0 /* return value will be in r0 */
+ mov ip, r0 /* return value will be in r0 */
#ifndef __ARM_EABI__
mov r3, r2 /* r2 will be overwriten by r1 */
mov r2, r1 /* and r1 will be overwritten by ldrexd */
#endif
-1:
- ldrexd r0, [r4] /* load old value */
- strexd ip, r2, [r4] /* store new value */
- cmp ip, #0 /* succeed? */
+1: ldrexd r0, [ip] /* load old value */
+ strexd r4, r2, [ip] /* store new value */
+ cmp r4, #0 /* succeed? */
bne 1b /* no, try again */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r4, c7, c10, 5 /* data memory barrier */
#endif
pop {r4} /* restore temporary */
RET
Index: src/common/lib/libc/arch/arm/atomic/atomic_add_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_add_64.S:1.5 src/common/lib/libc/arch/arm/atomic/atomic_add_64.S:1.6
--- src/common/lib/libc/arch/arm/atomic/atomic_add_64.S:1.5 Sat Aug 10 19:02:22 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_add_64.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_add_64.S,v 1.5 2013/08/10 19:02:22 matt Exp $ */
+/* $NetBSD: atomic_add_64.S,v 1.6 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,50 +32,34 @@
#ifdef _ARM_ARCH_6
-ENTRY_NP(_atomic_add_64)
- push {r4} /* save temporary */
- mov r4, r0 /* need r0 for return value */
-#ifndef __ARM_EABI__
- mov r3, r2
- mov r2, r1
-#endif
-1: ldrexd r0, [r4] /* load old value (to be returned) */
- adds LO, LO, NLO /* calculate new value */
- adc HI, HI, NHI /* calculate new value */
- strexd ip, r0, [r4] /* try to store */
- cmp ip, #0 /* succeed? */
- bne 1b /* no, try again */
-#ifdef _ARM_ARCH_7
- dmb
-#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
-#endif
- pop {r4} /* restore temporary */
- RET
- END(_atomic_add_64)
-ATOMIC_OP_ALIAS(atomic_add_64,_atomic_add_64)
-
ENTRY_NP(_atomic_add_64_nv)
push {r4} /* save temporary */
- mov r4, r0 /* need r0 for return value */
+ mov ip, r0 /* need r0 for return value */
#ifndef __ARM_EABI__
mov r3, r2
mov r2, r1
#endif
-1: ldrexd r0, [r4] /* load old value */
+1: ldrexd r0, [ip] /* load old value */
+#ifdef __thumb__
+ add LO, LO, NLO /* calculate new value lo */
+#else
adds LO, LO, NLO /* calculate new value lo */
+#endif
adc HI, HI, NHI /* calculate new value hi */
- strexd ip, r0, [r4] /* try to store */
- cmp ip, #0 /* succeed? */
+ strexd r4, r0, [ip] /* try to store */
+ cmp r4, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r4, c7, c10, 5 /* data memory barrier */
#endif
pop {r4} /* restore temporary */
RET /* return new value */
- END(_atomic_add_64_nv)
+END(_atomic_add_64_nv)
+
+STRONG_ALIAS(_atomic_add_64,_atomic_add_64_nv)
ATOMIC_OP_ALIAS(atomic_add_64_nv,_atomic_add_64_nv)
+ATOMIC_OP_ALIAS(atomic_add_64,_atomic_add_64)
#endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_swap.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.5 src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.6
--- src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.5 Mon Jan 28 06:22:34 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_swap.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_swap.S,v 1.5 2013/01/28 06:22:34 matt Exp $ */
+/* $NetBSD: atomic_swap.S,v 1.6 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2007,2012 The NetBSD Foundation, Inc.
@@ -45,24 +45,32 @@
*/
ENTRY_NP(_atomic_swap_32)
- mov r2, r0
+ mov ip, r0
1:
#ifdef _ARM_ARCH_6
- ldrex r0, [r2]
+ ldrex r0, [ip]
cmp r0, r1
- strexne ip, r1, [r2]
+#ifdef __thumb__
+ beq 99f
+ strex r3, r1, [ip]
+ cmp r3, #0
#else
- swp r0, r1, [r2]
+ strexne r3, r1, [ip]
+ cmpne r3, #0
+#endif
+#else
+ swp r0, r1, [ip]
cmp r0, r1
- movnes ip, #0
+ movnes r3, #0
+ cmpne r3, #0
#endif
- cmpne ip, #0
bne 1b
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r3, c7, c10, 5 /* data memory barrier */
#endif
+99:
RET
END(_atomic_swap_32)
ATOMIC_OP_ALIAS(atomic_swap_32,_atomic_swap_32)
Index: src/common/lib/libc/arch/arm/atomic/atomic_and_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_and_64.S:1.4 src/common/lib/libc/arch/arm/atomic/atomic_and_64.S:1.5
--- src/common/lib/libc/arch/arm/atomic/atomic_and_64.S:1.4 Sat Aug 10 19:02:22 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_and_64.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_and_64.S,v 1.4 2013/08/10 19:02:22 matt Exp $ */
+/* $NetBSD: atomic_and_64.S,v 1.5 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,50 +32,30 @@
#ifdef _ARM_ARCH_6
-ENTRY_NP(_atomic_and_64)
- push {r4} /* save temporary */
-#ifndef __ARM_EABI__
- mov r3, r2
- mov r2, r1
-#endif
- mov r4, r0 /* need r0 for return value */
-1: ldrexd r0, [r4] /* load old value (to be returned) */
- and r0, r0, r2 /* calculate new value */
- and r1, r1, r3 /* calculate new value */
- strexd ip, r0, [r4] /* try to store */
- cmp ip, #0 /* succeed? */
- bne 1b /* no, try again */
-#ifdef _ARM_ARCH_7
- dmb
-#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
-#endif
- pop {r4} /* restore temporary */
- RET
- END(_atomic_and_64)
-ATOMIC_OP_ALIAS(atomic_and_64,_atomic_and_64)
-
ENTRY_NP(_atomic_and_64_nv)
push {r4} /* save temporary */
#ifndef __ARM_EABI__
mov r3, r2
mov r2, r1
#endif
- mov r4, r0 /* need r0 for return value */
-1: ldrexd r0, [r4] /* load old value */
+ mov ip, r0 /* need r0 for return value */
+1: ldrexd r0, [ip] /* load old value */
and r0, r0, r2 /* calculate new value */
and r1, r1, r3 /* calculate new value */
- strexd ip, r0, [r4] /* try to store */
- cmp ip, #0 /* succeed? */
+ strexd r4, r0, [ip] /* try to store */
+ cmp r4, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r4, c7, c10, 5 /* data memory barrier */
#endif
pop {r4} /* restore temporary */
RET /* return new value */
- END(_atomic_and_64_nv)
+END(_atomic_and_64_nv)
+
+STRONG_ALIAS(_atomic_and_64,_atomic_and_64_nv)
ATOMIC_OP_ALIAS(atomic_and_64_nv,_atomic_and_64_nv)
+ATOMIC_OP_ALIAS(atomic_and_64,_atomic_and_64_nv)
#endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.4 src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.5
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.4 Mon Oct 29 14:09:38 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_32.S,v 1.4 2012/10/29 14:09:38 chs Exp $ */
+/* $NetBSD: atomic_cas_32.S,v 1.5 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -36,21 +36,25 @@
* and kernel.
*/
ENTRY_NP(_atomic_cas_32)
- mov r3, r0 /* we need r0 for return value */
+ mov ip, r0 /* we need r0 for return value */
1:
- ldrex r0, [r3] /* load old value */
- teq r0, r1 /* compare? */
+ ldrex r0, [ip] /* load old value */
+ cmp r0, r1 /* compare? */
+#ifdef __thumb__
+ bne 2f /* return if different */
+#else
RETc(ne) /* return if different */
- strex ip, r2, [r3] /* store new value */
- cmp ip, #0 /* succeed? */
+#endif
+ strex r3, r2, [ip] /* store new value */
+ cmp r3, #0 /* succeed? */
bne 1b /* nope, try again. */
#ifdef _ARM_ARCH_7
dsb
#else
- mcr p15, 0, ip, c7, c10, 4 /* data synchronization barrier */
+ mcr p15, 0, r3, c7, c10, 4 /* data synchronization barrier */
#endif
- RET /* return. */
- END(_atomic_cas_32)
+2: RET /* return. */
+END(_atomic_cas_32)
ATOMIC_OP_ALIAS(atomic_cas_32,_atomic_cas_32)
ATOMIC_OP_ALIAS(atomic_cas_uint,_atomic_cas_32)
Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.4 src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.5
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.4 Mon Oct 29 14:09:38 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_8.S,v 1.4 2012/10/29 14:09:38 chs Exp $ */
+/* $NetBSD: atomic_cas_8.S,v 1.5 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -36,20 +36,24 @@
* and kernel.
*/
ENTRY_NP(_atomic_cas_8)
- mov r3, r0 /* we need r0 for return value */
+ mov ip, r0 /* we need r0 for return value */
1:
- ldrexb r0, [r3] /* load old value */
- teq r0, r1 /* compare? */
+ ldrexb r0, [ip] /* load old value */
+ cmp r0, r1 /* compare? */
+#ifdef __thumb__
+ bne 2f
+#else
RETc(ne) /* return if different */
- strexb ip, r2, [r3] /* store new value */
- cmp ip, #0 /* succeed? */
+#endif
+ strexb r3, r2, [ip] /* store new value */
+ cmp r3, #0 /* succeed? */
bne 1b /* nope, try again. */
#ifdef _ARM_ARCH_7
dsb /* data synchronization barrier */
#else
- mcr p15, 0, ip, c7, c10, 4 /* data synchronization barrier */
+ mcr p15, 0, r3, c7, c10, 4 /* data synchronization barrier */
#endif
- RET /* return. */
+2: RET /* return. */
END(_atomic_cas_8)
ATOMIC_OP_ALIAS(atomic_cas_8,_atomic_cas_8)
Index: src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S:1.4 src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S:1.5
--- src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S:1.4 Sat Aug 10 18:45:12 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_dec_64.S,v 1.4 2013/08/10 18:45:12 matt Exp $ */
+/* $NetBSD: atomic_dec_64.S,v 1.5 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,29 +32,20 @@
#ifdef _ARM_ARCH_6
-ENTRY_NP(_atomic_dec_64)
- mov r3, r0 /* need r0 for return value */
-1: ldrexd r0, [r3] /* load old value (return value) */
- subs LO, LO, #1 /* calculate new value */
- sbc HI, HI, #0 /* calculate new value */
- strexd r2, r0, [r3] /* try to store */
- cmp r2, #0 /* succeed? */
- bne 1b /* no, try again? */
-#ifdef _ARM_ARCH_7
- dmb
-#else
- mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
-#endif
- RET
- END(_atomic_dec_64)
-ATOMIC_OP_ALIAS(atomic_dec_64,_atomic_dec_64)
-
ENTRY_NP(_atomic_dec_64_nv)
- mov r3, r0 /* need r0 for return value */
-1: ldrexd r0, [r3] /* load old value */
+ mov ip, r0 /* need r0 for return value */
+#ifdef __thumb__
+ mov r2, #0
+#endif
+1: ldrexd r0, [ip] /* load old value */
+#ifdef __thumb__
+ sub LO, LO, #1 /* calculate new value */
+ sbc HI, HI, r2 /* calculate new value */
+#else
subs LO, LO, #1 /* calculate new value */
sbc HI, HI, #0 /* calculate new value */
- strexd r2, r0, [r3] /* try to store */
+#endif
+ strexd r2, r0, [ip] /* try to store */
cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
@@ -63,7 +54,10 @@ ENTRY_NP(_atomic_dec_64_nv)
mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
- END(_atomic_dec_64_nv)
+END(_atomic_dec_64_nv)
+
+STRONG_ALIAS(_atomic_dec_64,_atomic_dec_64_nv)
ATOMIC_OP_ALIAS(atomic_dec_64_nv,_atomic_dec_64_nv)
+ATOMIC_OP_ALIAS(atomic_dec_64,_atomic_dec_64)
#endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.4 src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.5
--- src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.4 Mon Oct 29 14:09:38 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_inc_32.S,v 1.4 2012/10/29 14:09:38 chs Exp $ */
+/* $NetBSD: atomic_inc_32.S,v 1.5 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -33,16 +33,15 @@
#ifdef _ARM_ARCH_6
ENTRY_NP(_atomic_inc_32)
- mov r2, r0 /* need r0 for return value */
-1: ldrex r0, [r2] /* load old value (return value) */
- add r1, r0, #1 /* calculate new value */
- strex r3, r1, [r2] /* try to store */
- cmp r3, #0 /* succeed? */
+1: ldrex r3, [r0] /* load old value (return value) */
+ add r3, r3, #1 /* calculate new value */
+ strex r2, r3, [r0] /* try to store */
+ cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
END(_atomic_inc_32)
@@ -55,16 +54,16 @@ STRONG_ALIAS(_atomic_inc_ulong,_atomic_i
STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_32)
ENTRY_NP(_atomic_inc_32_nv)
- mov r2, r0 /* need r0 for return value */
-1: ldrex r0, [r2] /* load old value */
+ mov ip, r0 /* need r0 for return value */
+1: ldrex r0, [ip] /* load old value */
add r0, r0, #1 /* calculate new value (return value) */
- strex r1, r0, [r2] /* try to store */
- cmp r1, #0 /* succeed? */
+ strex r2, r0, [ip] /* try to store */
+ cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
END(_atomic_inc_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_or_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_or_64.S:1.4 src/common/lib/libc/arch/arm/atomic/atomic_or_64.S:1.5
--- src/common/lib/libc/arch/arm/atomic/atomic_or_64.S:1.4 Sat Aug 10 19:02:22 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_or_64.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_or_64.S,v 1.4 2013/08/10 19:02:22 matt Exp $ */
+/* $NetBSD: atomic_or_64.S,v 1.5 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,31 +32,8 @@
#ifdef _ARM_ARCH_6
-ENTRY_NP(_atomic_or_64)
- push {r4} /* save temporary */
-#ifndef __ARM_EABI__
- mov r3, r2
- mov r2, r1
-#endif
- mov r4, r0 /* need r0 for return value */
-1: ldrexd r0, [r4] /* load old value (to be returned) */
- orr r0, r0, r2 /* calculate new value */
- orr r1, r1, r3 /* calculate new value */
- strexd ip, r0, [r4] /* try to store */
- cmp ip, #0 /* succeed? */
- bne 1b /* no, try again */
-#ifdef _ARM_ARCH_7
- dmb
-#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
-#endif
- pop {r4} /* restore temporary */
- RET
- END(_atomic_or_64)
-ATOMIC_OP_ALIAS(atomic_or_64,_atomic_or_64)
-
ENTRY_NP(_atomic_or_64_nv)
- push {r4} /* save temporary */
+ push {r4,r5} /* save temporary */
#ifndef __ARM_EABI__
mov r3, r2
mov r2, r1
@@ -65,17 +42,20 @@ ENTRY_NP(_atomic_or_64_nv)
1: ldrexd r0, [r4] /* load old value */
orr r0, r0, r2 /* calculate new value (return value) */
orr r1, r1, r3 /* calculate new value (return value) */
- strexd ip, r0, [r4] /* try to store */
- cmp ip, #0 /* succeed? */
+ strexd r5, r0, [r4] /* try to store */
+ cmp r5, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
dmb
#else
- mcr p15, 0, ip, c7, c10, 5 /* data memory barrier */
+ mcr p15, 0, r5, c7, c10, 5 /* data memory barrier */
#endif
- pop {r4} /* restore temporary */
+ pop {r4,r5} /* restore temporary */
RET /* return new value */
- END(_atomic_or_64_nv)
+END(_atomic_or_64_nv)
+
+STRONG_ALIAS(_atomic_or_64,_atomic_or_64_nv)
ATOMIC_OP_ALIAS(atomic_or_64_nv,_atomic_or_64_nv)
+ATOMIC_OP_ALIAS(atomic_or_64,_atomic_or_64)
#endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S:1.2 Mon Oct 29 14:09:38 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_64.S,v 1.2 2012/10/29 14:09:38 chs Exp $ */
+/* $NetBSD: atomic_cas_64.S,v 1.3 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -36,23 +36,28 @@
* and kernel.
*/
ENTRY_NP(_atomic_cas_64)
- stmfd sp!, {r4, r5, r6} /* save temporaries */
- mov r6, r0 /* we need r0 for return value */
+ push {r4, r5, r6} /* save temporaries */
+ mov ip, r0 /* we need r0 for return value */
#ifdef __ARM_EABI__
ldrd r4, [sp] /* fetch new value */
#else
- ldr r5, [sp, #4] /* fetch new value */
ldr r4, [sp, #0] /* fetch new value */
+ ldr r5, [sp, #4] /* fetch new value */
mov r3, r2 /* r2 will be overwritten by r1 which ... */
mov r2, r1 /* r1 will be overwritten by ldrexd */
#endif
1:
- ldrexd r0, [r6] /* load current value */
- teq r0, r2 /* compare to old? 1st half */
- teqeq r1, r3 /* compare to old? 2nd half */
+ ldrexd r0, [ip] /* load current value */
+ cmp r0, r2 /* compare to old? 1st half */
+#ifdef __thumb__
+ bne 2f /* jump to return if different */
+ cmp r1, r3 /* compare to old? 2nd half */
+#else
+ cmpeq r1, r3 /* compare to old? 2nd half */
+#endif
bne 2f /* jump to return if different */
- strexd ip, r4, [r6] /* store new value */
- cmp ip, #0 /* succeed? */
+ strexd r6, r4, [ip] /* store new value */
+ cmp r6, #0 /* succeed? */
bne 1b /* nope, try again. */
#ifdef _ARM_ARCH_7
dsb
@@ -60,9 +65,9 @@ ENTRY_NP(_atomic_cas_64)
mcr p15, 0, ip, c7, c10, 4 /* data synchronization barrier */
#endif
2:
- ldmfd sp!, {r4, r5, r6} /* restore temporaries */
+ pop {r4, r5, r6} /* restore temporaries */
RET /* return. */
- END(_atomic_cas_64)
+END(_atomic_cas_64)
ATOMIC_OP_ALIAS(atomic_cas_64,_atomic_cas_64)
Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S:1.2 Sun May 25 15:56:11 2008
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_up.S,v 1.2 2008/05/25 15:56:11 chs Exp $ */
+/* $NetBSD: atomic_cas_up.S,v 1.3 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -41,3 +41,4 @@ RAS_START_ASM_HIDDEN(_atomic_cas)
streq r2, [r3]
RAS_END_ASM_HIDDEN(_atomic_cas)
RET
+END(_atomic_cas_up)
Index: src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S:1.6 src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S:1.7
--- src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S:1.6 Sat Aug 10 18:45:12 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S Sat Aug 10 19:59:21 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_inc_64.S,v 1.6 2013/08/10 18:45:12 matt Exp $ */
+/* $NetBSD: atomic_inc_64.S,v 1.7 2013/08/10 19:59:21 matt Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,29 +32,20 @@
#ifdef _ARM_ARCH_6
-ENTRY_NP(_atomic_inc_64)
- mov r3, r0 /* need r0 for return value */
-1: ldrexd r0, [r3] /* load old value (return value) */
- adds LO, LO, #1 /* calculate new value */
- adc HI, HI, #0 /* zero means we carried */
- strexd r2, r0, [r3] /* try to store */
- cmp r2, #0 /* succeed? */
- bne 1b /* no, try again? */
-#ifdef _ARM_ARCH_7
- dmb
-#else
- mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
-#endif
- RET
- END(_atomic_inc_64)
-ATOMIC_OP_ALIAS(atomic_inc_64,_atomic_inc_64)
-
ENTRY_NP(_atomic_inc_64_nv)
- mov r3, r0 /* need r0 for return value */
-1: ldrexd r0, [r3] /* load old value */
+ mov ip, r0 /* need r0 for return value */
+#ifdef __thumb__
+ mov r2, #0
+#endif
+1: ldrexd r0, [ip] /* load old value */
+#ifdef __thumb__
+ add LO, LO, #1 /* calculate new value */
+ adc HI, HI, r2 /* zero means we carried */
+#else
adds LO, LO, #1 /* calculate new value (return value) */
adc HI, HI, #0 /* fold carry into high */
- strexd r2, r0, [r3] /* try to store */
+#endif
+ strexd r2, r0, [ip] /* try to store */
cmp r2, #0 /* succeed? */
bne 1b /* no, try again? */
#ifdef _ARM_ARCH_7
@@ -63,7 +54,10 @@ ENTRY_NP(_atomic_inc_64_nv)
mcr p15, 0, r2, c7, c10, 5 /* data memory barrier */
#endif
RET /* return new value */
- END(_atomic_inc_64_nv)
+END(_atomic_inc_64_nv)
+
+STRONG_ALIAS(_atomic_inc_64,_atomic_inc_64_nv)
ATOMIC_OP_ALIAS(atomic_inc_64_nv,_atomic_inc_64_nv)
+ATOMIC_OP_ALIAS(atomic_inc_64,_atomic_inc_64)
#endif /* _ARM_ARCH_6 */