> +#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"