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;
> +}
> +
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to