On Dec 16, 2005, at 10:24, Linh Dang wrote:
Well, it may be true for ARM but for ppc (i dunno what exactly llsc means but someone in the thread put ppc in llsc group) it's:

   loop:
        load-reserve foo => old
        new = old * N
        store-conditional new => foo
        if failed goto loop

LLSC == Load-Locked/Store-Conditional. It's a slightly different name for your Load-Reserve/Store-Conditional

You still miss his point. That is _GOOD_ code. Russell's point is that if somebody does this in generic code:

do {
        old = atomic_read(&foo);
        new = old * 2;
} while (atomic_cmpxchg(&foo, old, new) != old);

On PPC or ARM or another LLSC architecture it does not end up looking like the good code, it looks like this (which is clearly inefficient):

And for architectures with llsc, this becomes:

loop:   load foo => old
        new = old * N
loop2:  load locked foo => ret
        compare ret & old
        if equal store conditional new in foo
                if store failed because we lost the lock, goto loop2
        compare ret & old
        if not equal goto loop

Cheers,
Kyle Moffett

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCM/CS/IT/E/U d- s++: a18 C++++>$ ULBX*++++(+++)>$ P++++(+++)>$ L++++ (+++)>$ !E- W+++(++) N+++(++) o? K? w--- O? M++ V? PS+() PE+(-) Y+ PGP + t+(+++) 5 X R? !tv-(--) b++++(++) DI+(++) D+++ G e>++++$ h*(+)>++$ r %(--) !y?-(--)
------END GEEK CODE BLOCK------



Reply via email to