Author: mjg
Date: Mon Jan 30 02:24:54 2017
New Revision: 312975
URL: https://svnweb.freebsd.org/changeset/base/312975

Log:
  i386: add atomic_fcmpset
  
  Tested by:    pho

Modified:
  head/sys/i386/include/atomic.h

Modified: head/sys/i386/include/atomic.h
==============================================================================
--- head/sys/i386/include/atomic.h      Mon Jan 30 02:21:29 2017        
(r312974)
+++ head/sys/i386/include/atomic.h      Mon Jan 30 02:24:54 2017        
(r312975)
@@ -106,6 +106,7 @@ void atomic_##NAME##_##TYPE(volatile u_#
 void atomic_##NAME##_barr_##TYPE(volatile u_##TYPE *p, u_##TYPE v)
 
 int    atomic_cmpset_int(volatile u_int *dst, u_int expect, u_int src);
+int    atomic_fcmpset_int(volatile u_int *dst, u_int *expect, u_int src);
 u_int  atomic_fetchadd_int(volatile u_int *p, u_int v);
 int    atomic_testandset_int(volatile u_int *p, u_int v);
 int    atomic_testandclear_int(volatile u_int *p, u_int v);
@@ -214,6 +215,24 @@ atomic_cmpset_int(volatile u_int *dst, u
        return (res);
 }
 
+static __inline int
+atomic_fcmpset_int(volatile u_int *dst, u_int *expect, u_int src)
+{
+       u_char res;
+
+       __asm __volatile(
+       "       " MPLOCKED "            "
+       "       cmpxchgl %3,%1 ;        "
+       "       sete    %0 ;            "
+       "# atomic_cmpset_int"
+       : "=r" (res),                   /* 0 */
+         "+m" (*dst),                  /* 1 */
+         "+a" (*expect)                        /* 2 */
+       : "r" (src)                     /* 3 */
+       : "memory", "cc");
+       return (res);
+}
+
 #endif /* CPU_DISABLE_CMPXCHG */
 
 /*
@@ -684,6 +703,8 @@ u_long      atomic_swap_long(volatile u_long 
 #define        atomic_subtract_rel_int         atomic_subtract_barr_int
 #define        atomic_cmpset_acq_int           atomic_cmpset_int
 #define        atomic_cmpset_rel_int           atomic_cmpset_int
+#define        atomic_fcmpset_acq_int          atomic_fcmpset_int
+#define        atomic_fcmpset_rel_int          atomic_fcmpset_int
 
 #define        atomic_set_acq_long             atomic_set_barr_long
 #define        atomic_set_rel_long             atomic_set_barr_long
@@ -695,6 +716,8 @@ u_long      atomic_swap_long(volatile u_long 
 #define        atomic_subtract_rel_long        atomic_subtract_barr_long
 #define        atomic_cmpset_acq_long          atomic_cmpset_long
 #define        atomic_cmpset_rel_long          atomic_cmpset_long
+#define        atomic_fcmpset_acq_long         atomic_fcmpset_long
+#define        atomic_fcmpset_rel_long         atomic_fcmpset_long
 
 #define        atomic_readandclear_int(p)      atomic_swap_int(p, 0)
 #define        atomic_readandclear_long(p)     atomic_swap_long(p, 0)
@@ -749,6 +772,9 @@ u_long      atomic_swap_long(volatile u_long 
 #define        atomic_cmpset_32        atomic_cmpset_int
 #define        atomic_cmpset_acq_32    atomic_cmpset_acq_int
 #define        atomic_cmpset_rel_32    atomic_cmpset_rel_int
+#define        atomic_fcmpset_32       atomic_fcmpset_int
+#define        atomic_fcmpset_acq_32   atomic_fcmpset_acq_int
+#define        atomic_fcmpset_rel_32   atomic_fcmpset_rel_int
 #define        atomic_swap_32          atomic_swap_int
 #define        atomic_readandclear_32  atomic_readandclear_int
 #define        atomic_fetchadd_32      atomic_fetchadd_int
@@ -792,6 +818,14 @@ u_long     atomic_swap_long(volatile u_long 
 #define        atomic_cmpset_rel_ptr(dst, old, new) \
        atomic_cmpset_rel_int((volatile u_int *)(dst), (u_int)(old), \
            (u_int)(new))
+#define        atomic_fcmpset_ptr(dst, old, new) \
+       atomic_fcmpset_int((volatile u_int *)(dst), (u_int *)(old), 
(u_int)(new))
+#define        atomic_fcmpset_acq_ptr(dst, old, new) \
+       atomic_fcmpset_acq_int((volatile u_int *)(dst), (u_int *)(old), \
+           (u_int)(new))
+#define        atomic_fcmpset_rel_ptr(dst, old, new) \
+       atomic_fcmpset_rel_int((volatile u_int *)(dst), (u_int *)(old), \
+           (u_int)(new))
 #define        atomic_swap_ptr(p, v) \
        atomic_swap_int((volatile u_int *)(p), (u_int)(v))
 #define        atomic_readandclear_ptr(p) \
_______________________________________________
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