> +#ifdef __GNUCLIKE_ASM
> +     __asm __volatile (
> +             "1:\tlwarx %0, 0, %3\n\t"       /* load old value */
> +             "cmplw %4, %0\n\t"              /* compare */
> +             "bne 2f\n\t"                    /* exit if not equal */
> +             "stwcx. %5, 0, %3\n\t"          /* attempt to store */
> +             "bne- 1b\n\t"                   /* spin if failed */
> +             "li %0, 1\n\t"                  /* success - retval = 1 */
> +             "b 3f\n\t"                      /* we've succeeded */
> +             "2:\n\t"
> +             "stwcx. %0, 0, %3\n\t"          /* clear reservation (74xx) */
> +             "stwx %0, 0, %7\n\t"
> +             "li %0, 0\n\t"                  /* failure - retval = 0 */
> +             "3:\n\t"
> +             : "=&r" (ret), "=m" (*p), "=m" (*cmpval)
> +             : "r" (p), "r" (*cmpval), "r" (newval), "m" (*p), "r"(cmpval)
> +             : "cr0", "memory");
> +#endif

It seems that in case of failed conditional store, the code retries.
Note that this is not incorrect but also not a desirable behaviour
with fcmpset:  the function should return error and leave the retry
to the caller.  There is no point in having embedded loop.
_______________________________________________
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