Make the _and_fetch_8 primitives return the new value they calculated and set - not whatever is found in memory later.diff -r1.1 -r1.2 src/common/lib/libc/atomic/atomic_nand_64_cas.c
(martin)
--- src/common/lib/libc/atomic/atomic_nand_64_cas.c 2014/02/18 10:16:55 1.1
+++ src/common/lib/libc/atomic/atomic_nand_64_cas.c 2014/02/18 13:21:04 1.2
@@ -1,65 +1,65 @@ | @@ -1,65 +1,65 @@ | |||
1 | /* $NetBSD: atomic_nand_64_cas.c,v 1.1 2014/02/18 10:16:55 martin Exp $ */ | 1 | /* $NetBSD: atomic_nand_64_cas.c,v 1.2 2014/02/18 13:21:04 martin Exp $ */ | |
2 | 2 | |||
3 | /*- | 3 | /*- | |
4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Jason R. Thorpe. | 8 | * by Jason R. Thorpe. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | 13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright | |
16 | * notice, this list of conditions and the following disclaimer in the | 16 | * notice, this list of conditions and the following disclaimer in the | |
17 | * documentation and/or other materials provided with the distribution. | 17 | * documentation and/or other materials provided with the distribution. | |
18 | * | 18 | * | |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | 19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
29 | * POSSIBILITY OF SUCH DAMAGE. | 29 | * POSSIBILITY OF SUCH DAMAGE. | |
30 | */ | 30 | */ | |
31 | 31 | |||
32 | #include <sys/atomic.h> | 32 | #include <sys/atomic.h> | |
33 | 33 | |||
34 | #ifdef __HAVE_ATOMIC64_OPS | 34 | #ifdef __HAVE_ATOMIC64_OPS | |
35 | 35 | |||
36 | uint64_t fetch_and_nand_8(volatile uint64_t *, uint64_t, ...) | 36 | uint64_t fetch_and_nand_8(volatile uint64_t *, uint64_t, ...) | |
37 | asm("__sync_fetch_and_nand_8"); | 37 | asm("__sync_fetch_and_nand_8"); | |
38 | uint64_t nand_and_fetch_8(volatile uint64_t *, uint64_t, ...) | 38 | uint64_t nand_and_fetch_8(volatile uint64_t *, uint64_t, ...) | |
39 | asm("__sync_nand_and_fetch_8"); | 39 | asm("__sync_nand_and_fetch_8"); | |
40 | 40 | |||
41 | uint64_t | 41 | uint64_t | |
42 | fetch_and_nand_8(volatile uint64_t *addr, uint64_t val, ...) | 42 | fetch_and_nand_8(volatile uint64_t *addr, uint64_t val, ...) | |
43 | { | 43 | { | |
44 | uint64_t old, new; | 44 | uint64_t old, new; | |
45 | 45 | |||
46 | do { | 46 | do { | |
47 | old = *addr; | 47 | old = *addr; | |
48 | new = ~(old & val); | 48 | new = ~(old & val); | |
49 | } while (atomic_cas_64(addr, old, new) != old); | 49 | } while (atomic_cas_64(addr, old, new) != old); | |
50 | return old; | 50 | return old; | |
51 | } | 51 | } | |
52 | 52 | |||
53 | uint64_t | 53 | uint64_t | |
54 | nand_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | 54 | nand_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | |
55 | { | 55 | { | |
56 | uint64_t old, new; | 56 | uint64_t old, new; | |
57 | 57 | |||
58 | do { | 58 | do { | |
59 | old = *addr; | 59 | old = *addr; | |
60 | new = ~(old & val); | 60 | new = ~(old & val); | |
61 | } while (atomic_cas_64(addr, old, new) != old); | 61 | } while (atomic_cas_64(addr, old, new) != old); | |
62 | return *addr; | 62 | return new; | |
63 | } | 63 | } | |
64 | 64 | |||
65 | #endif | 65 | #endif |
--- src/common/lib/libc/atomic/atomic_sub_64_cas.c 2014/02/18 10:16:55 1.1
+++ src/common/lib/libc/atomic/atomic_sub_64_cas.c 2014/02/18 13:21:04 1.2
@@ -1,65 +1,65 @@ | @@ -1,65 +1,65 @@ | |||
1 | /* $NetBSD: atomic_sub_64_cas.c,v 1.1 2014/02/18 10:16:55 martin Exp $ */ | 1 | /* $NetBSD: atomic_sub_64_cas.c,v 1.2 2014/02/18 13:21:04 martin Exp $ */ | |
2 | 2 | |||
3 | /*- | 3 | /*- | |
4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Jason R. Thorpe. | 8 | * by Jason R. Thorpe. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | 13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright | |
16 | * notice, this list of conditions and the following disclaimer in the | 16 | * notice, this list of conditions and the following disclaimer in the | |
17 | * documentation and/or other materials provided with the distribution. | 17 | * documentation and/or other materials provided with the distribution. | |
18 | * | 18 | * | |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | 19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
29 | * POSSIBILITY OF SUCH DAMAGE. | 29 | * POSSIBILITY OF SUCH DAMAGE. | |
30 | */ | 30 | */ | |
31 | 31 | |||
32 | #include <sys/atomic.h> | 32 | #include <sys/atomic.h> | |
33 | 33 | |||
34 | #ifdef __HAVE_ATOMIC64_OPS | 34 | #ifdef __HAVE_ATOMIC64_OPS | |
35 | 35 | |||
36 | uint64_t fetch_and_sub_8(volatile uint64_t *, uint64_t, ...) | 36 | uint64_t fetch_and_sub_8(volatile uint64_t *, uint64_t, ...) | |
37 | asm("__sync_fetch_and_sub_8"); | 37 | asm("__sync_fetch_and_sub_8"); | |
38 | uint64_t sub_and_fetch_8(volatile uint64_t *, uint64_t, ...) | 38 | uint64_t sub_and_fetch_8(volatile uint64_t *, uint64_t, ...) | |
39 | asm("__sync_sub_and_fetch_8"); | 39 | asm("__sync_sub_and_fetch_8"); | |
40 | 40 | |||
41 | uint64_t | 41 | uint64_t | |
42 | fetch_and_sub_8(volatile uint64_t *addr, uint64_t val, ...) | 42 | fetch_and_sub_8(volatile uint64_t *addr, uint64_t val, ...) | |
43 | { | 43 | { | |
44 | uint64_t old, new; | 44 | uint64_t old, new; | |
45 | 45 | |||
46 | do { | 46 | do { | |
47 | old = *addr; | 47 | old = *addr; | |
48 | new = old - val; | 48 | new = old - val; | |
49 | } while (atomic_cas_64(addr, old, new) != old); | 49 | } while (atomic_cas_64(addr, old, new) != old); | |
50 | return old; | 50 | return old; | |
51 | } | 51 | } | |
52 | 52 | |||
53 | uint64_t | 53 | uint64_t | |
54 | sub_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | 54 | sub_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | |
55 | { | 55 | { | |
56 | uint64_t old, new; | 56 | uint64_t old, new; | |
57 | 57 | |||
58 | do { | 58 | do { | |
59 | old = *addr; | 59 | old = *addr; | |
60 | new = old - val; | 60 | new = old - val; | |
61 | } while (atomic_cas_64(addr, old, new) != old); | 61 | } while (atomic_cas_64(addr, old, new) != old); | |
62 | return *addr; | 62 | return new; | |
63 | } | 63 | } | |
64 | 64 | |||
65 | #endif | 65 | #endif |
--- src/common/lib/libc/atomic/atomic_xor_64_cas.c 2014/02/18 10:16:55 1.1
+++ src/common/lib/libc/atomic/atomic_xor_64_cas.c 2014/02/18 13:21:04 1.2
@@ -1,65 +1,65 @@ | @@ -1,65 +1,65 @@ | |||
1 | /* $NetBSD: atomic_xor_64_cas.c,v 1.1 2014/02/18 10:16:55 martin Exp $ */ | 1 | /* $NetBSD: atomic_xor_64_cas.c,v 1.2 2014/02/18 13:21:04 martin Exp $ */ | |
2 | 2 | |||
3 | /*- | 3 | /*- | |
4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | 4 | * Copyright (c) 2014 The NetBSD Foundation, Inc. | |
5 | * All rights reserved. | 5 | * All rights reserved. | |
6 | * | 6 | * | |
7 | * This code is derived from software contributed to The NetBSD Foundation | 7 | * This code is derived from software contributed to The NetBSD Foundation | |
8 | * by Jason R. Thorpe. | 8 | * by Jason R. Thorpe. | |
9 | * | 9 | * | |
10 | * Redistribution and use in source and binary forms, with or without | 10 | * Redistribution and use in source and binary forms, with or without | |
11 | * modification, are permitted provided that the following conditions | 11 | * modification, are permitted provided that the following conditions | |
12 | * are met: | 12 | * are met: | |
13 | * 1. Redistributions of source code must retain the above copyright | 13 | * 1. Redistributions of source code must retain the above copyright | |
14 | * notice, this list of conditions and the following disclaimer. | 14 | * notice, this list of conditions and the following disclaimer. | |
15 | * 2. Redistributions in binary form must reproduce the above copyright | 15 | * 2. Redistributions in binary form must reproduce the above copyright | |
16 | * notice, this list of conditions and the following disclaimer in the | 16 | * notice, this list of conditions and the following disclaimer in the | |
17 | * documentation and/or other materials provided with the distribution. | 17 | * documentation and/or other materials provided with the distribution. | |
18 | * | 18 | * | |
19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | 19 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | |
20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | 20 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 21 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | 22 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | |
23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 23 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | |
24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 24 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | |
25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 25 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | |
26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 26 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | |
27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 27 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |
28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 28 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | |
29 | * POSSIBILITY OF SUCH DAMAGE. | 29 | * POSSIBILITY OF SUCH DAMAGE. | |
30 | */ | 30 | */ | |
31 | 31 | |||
32 | #include <sys/atomic.h> | 32 | #include <sys/atomic.h> | |
33 | 33 | |||
34 | #ifdef __HAVE_ATOMIC64_OPS | 34 | #ifdef __HAVE_ATOMIC64_OPS | |
35 | 35 | |||
36 | uint64_t fetch_and_xor_8(volatile uint64_t *, uint64_t, ...) | 36 | uint64_t fetch_and_xor_8(volatile uint64_t *, uint64_t, ...) | |
37 | asm("__sync_fetch_and_xor_8"); | 37 | asm("__sync_fetch_and_xor_8"); | |
38 | uint64_t xor_and_fetch_8(volatile uint64_t *, uint64_t, ...) | 38 | uint64_t xor_and_fetch_8(volatile uint64_t *, uint64_t, ...) | |
39 | asm("__sync_xor_and_fetch_8"); | 39 | asm("__sync_xor_and_fetch_8"); | |
40 | 40 | |||
41 | uint64_t | 41 | uint64_t | |
42 | fetch_and_xor_8(volatile uint64_t *addr, uint64_t val, ...) | 42 | fetch_and_xor_8(volatile uint64_t *addr, uint64_t val, ...) | |
43 | { | 43 | { | |
44 | uint64_t old, new; | 44 | uint64_t old, new; | |
45 | 45 | |||
46 | do { | 46 | do { | |
47 | old = *addr; | 47 | old = *addr; | |
48 | new = old ^ val; | 48 | new = old ^ val; | |
49 | } while (atomic_cas_64(addr, old, new) != old); | 49 | } while (atomic_cas_64(addr, old, new) != old); | |
50 | return old; | 50 | return old; | |
51 | } | 51 | } | |
52 | 52 | |||
53 | uint64_t | 53 | uint64_t | |
54 | xor_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | 54 | xor_and_fetch_8(volatile uint64_t *addr, uint64_t val, ...) | |
55 | { | 55 | { | |
56 | uint64_t old, new; | 56 | uint64_t old, new; | |
57 | 57 | |||
58 | do { | 58 | do { | |
59 | old = *addr; | 59 | old = *addr; | |
60 | new = old ^ val; | 60 | new = old ^ val; | |
61 | } while (atomic_cas_64(addr, old, new) != old); | 61 | } while (atomic_cas_64(addr, old, new) != old); | |
62 | return *addr; | 62 | return new; | |
63 | } | 63 | } | |
64 | 64 | |||
65 | #endif | 65 | #endif |