svn commit: r312973 - head/sys/powerpc/include

Justin Hibbits jhibbits at freebsd.org
Mon Jan 30 15:37:06 UTC 2017


On Mon, Jan 30, 2017 at 9:32 AM, Justin Hibbits <jhibbits at freebsd.org> wrote:
> On Mon, Jan 30, 2017 at 4:53 AM, Konstantin Belousov
> <kostikbel at gmail.com> wrote:
>>> +#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.

(stupid gmail web UI being so slow it registered me clicking Send when
I clicked the ...)

Thanks, Kib.  I discussed this with mjg on IRC, and it was kind of a
toss-up how to implement it, so I took the easiest route.  I'll update
it tonight and remove the loop.

There is an instruction on newer ISAs that would reduce this inline
asm even further, 'mfocrf', but it doesn't exist on all supported
PowerPC architectures, so it will be just a minor tweak.

- Justin


More information about the svn-src-head mailing list