diff options
Diffstat (limited to 'libpthread/linuxthreads')
| -rw-r--r-- | libpthread/linuxthreads/sysdeps/mips/pt-machine.h | 27 | 
1 files changed, 27 insertions, 0 deletions
diff --git a/libpthread/linuxthreads/sysdeps/mips/pt-machine.h b/libpthread/linuxthreads/sysdeps/mips/pt-machine.h index 527392308..c40ab9e3e 100644 --- a/libpthread/linuxthreads/sysdeps/mips/pt-machine.h +++ b/libpthread/linuxthreads/sysdeps/mips/pt-machine.h @@ -77,6 +77,7 @@ __compare_and_swap (long int *p, long int oldval, long int newval)  	"1:\tll\t%0,%4\n\t"  	".set\tnoreorder\n\t"  	"bne\t%0,%2,2f\n\t" +       "move\t%0,$0\n\t" /*[NDF] Failure case. */  	"move\t%0,%3\n\t"  	".set\treorder\n\t"  	"sc\t%0,%1\n\t" @@ -87,4 +88,30 @@ __compare_and_swap (long int *p, long int oldval, long int newval)  	: "r"(oldval), "r"(newval), "m"(*p));    return ret; + +  /* +    1:  load locked: into ret(%0), from *p(0(%4)) +        branch to 2 if ret(%0) != oldval(%2) +         Delay slot: move 0 into ret(%0) // [NDF] Added +       Don't branch case: +       move newval(%3) into ret(%0) +       setcompare ret(%0) into *p(0(%1)) +       branch to 1 if ret(%0) == 0 (sc failed) +         Delay slot: unknown/none +       return + +    2: Delay slot +       return + +ll a b +Sets a to the value pointed to by address b, and "locks" b so that if +any of a number of things are attempted that might access b then the +next sc will fail. + +sc a b +Sets the memory address pointed to by b to the value in a atomically. +If it succeeds then a will be set to 1, if it fails a will be set to 0. + +  */ +  }  | 
