svn commit: r313040 - head/sys/mips/include
Konstantin Belousov
kostikbel at gmail.com
Wed Feb 1 14:17:34 UTC 2017
On Wed, Feb 01, 2017 at 05:00:34AM +0000, Alexander Kabaev wrote:
> Author: kan
> Date: Wed Feb 1 05:00:34 2017
> New Revision: 313040
> URL: https://svnweb.freebsd.org/changeset/base/313040
>
> Log:
> Add atomic_fcmpset_*() inlines for MIPS
>
> atomic_fcmpset_*() is analogous to atomic_cmpset(), but saves off the
> read value from the target memory location into the 'old' pointer.
>
> Reviewed by: imp, brooks
> Requested by: mjg
> Differential Revision: https://reviews.freebsd.org/D9391
>
> Modified:
> head/sys/mips/include/atomic.h
>
> Modified: head/sys/mips/include/atomic.h
> ==============================================================================
> --- head/sys/mips/include/atomic.h Wed Feb 1 04:54:23 2017 (r313039)
> +++ head/sys/mips/include/atomic.h Wed Feb 1 05:00:34 2017 (r313040)
> @@ -362,7 +362,7 @@ atomic_load_64(__volatile uint64_t *p, u
> * zero if the compare failed, nonzero otherwise.
> */
> static __inline uint32_t
> -atomic_cmpset_32(__volatile uint32_t* p, uint32_t cmpval, uint32_t newval)
> +atomic_cmpset_32(__volatile uint32_t *p, uint32_t cmpval, uint32_t newval)
> {
> uint32_t ret;
>
> @@ -405,6 +405,46 @@ atomic_cmpset_rel_32(__volatile uint32_t
> return (atomic_cmpset_32(p, cmpval, newval));
> }
>
> +static __inline uint32_t
> +atomic_fcmpset_32(__volatile uint32_t *p, uint32_t *cmpval, uint32_t newval)
> +{
> + uint32_t ret;
> +
> + __asm __volatile (
> + "1:\n\t"
> + "ll %0, %1\n\t" /* load old value */
> + "bne %0, %4, 2f\n\t" /* compare */
> + "move %0, %3\n\t" /* value to store */
> + "sc %0, %1\n\t" /* attempt to store */
> + "beqz %0, 1b\n\t" /* if it failed, spin */
Please do not retry on sc failure, return the error to upper layer.
See also r313007 and preceeding discussion after r312973.
> + "j 3f\n\t"
> + "2:\n\t"
> + "sw %0, %2\n\t" /* save old value */
> + "li %0, 0\n\t"
> + "3:\n"
> + : "=&r" (ret), "+m" (*p), "=m" (*cmpval)
> + : "r" (newval), "r" (*cmpval)
> + : "memory");
> + return ret;
> +}
> +
More information about the svn-src-head
mailing list