]> Cypherpunks repositories - gostls13.git/commitdiff
arm runtime: attempt to fix build by adding casp (same as cas)
authorRob Pike <r@golang.org>
Thu, 17 Feb 2011 06:01:57 +0000 (22:01 -0800)
committerRob Pike <r@golang.org>
Thu, 17 Feb 2011 06:01:57 +0000 (22:01 -0800)
untested.

Fixes #1523.

R=rsc
CC=golang-dev
https://golang.org/cl/4171057

src/pkg/runtime/arm/cas5.s
src/pkg/runtime/arm/cas6.s

index 20bd3c3e2d704005582b5fad087989474b92a52c..d46cdf9371dd2fd92d07baaed5cef4f35b6dbdfa 100644 (file)
@@ -20,7 +20,6 @@ TEXT runtime·cas(SB),7,$0
        MOVW    8(FP), R2       // new
        MOVW    $1, R3
        MOVW    $runtime·cas_mutex(SB), R4
-l:
        SWPW    (R4), R3        // acquire mutex
        CMP             $0, R3
        BNE             fail0
@@ -38,6 +37,38 @@ fail1:
 fail0:
        MOVW    $0, R0
        RET
+
+// bool casp(void **p, void *old, void *new)
+// Atomically:
+//     if(*p == old){
+//             *p = new;
+//             return 1;
+//     }else
+//             return 0;
+
+TEXT runtime·casp(SB),7,$0
+       MOVW    0(FP), R0       // *p
+       MOVW    4(FP), R1       // old
+       MOVW    8(FP), R2       // new
+       MOVW    $1, R3
+       MOVW    $runtime·cas_mutex(SB), R4
+       SWPW    (R4), R3        // acquire mutex
+       CMP             $0, R3
+       BNE             failp0
+       
+       MOVW    (R0), R5
+       CMP             R1, R5
+       BNE             failp1
+       
+       MOVW    R2, (R0)        
+       MOVW    R3, (R4)        // release mutex
+       MOVW    $1, R0
+       RET
+failp1:        
+       MOVW    R3, (R4)        // release mutex
+failp0:
+       MOVW    $0, R0
+       RET
+
 DATA runtime·cas_mutex(SB)/4, $0
 GLOBL runtime·cas_mutex(SB), $4
index 43788b28ae16474cd6547cf94c614a362bef8ec3..ba9777120defcb2c1289dfce8c7abaf87e99e68b 100644 (file)
@@ -27,3 +27,26 @@ fail:
        MOVW    $0, R0
        RET
 
+// bool casp(void **p, void *old, void *new)
+// Atomically:
+//     if(*p == old){
+//             *p = new;
+//             return 1;
+//     }else
+//             return 0;
+TEXT runtime·casp(SB), 7, $0
+       MOVW    0(FP), R1       // *p
+       MOVW    4(FP), R2       // old
+       MOVW    8(FP), R3       // new
+lp:
+       LDREX   (R1), R0
+       CMP             R0, R2
+       BNE             failp
+       STREX   R3, (R1), R0
+       CMP             $0, R0
+       BNE             lp
+       MOVW    $1, R0
+       RET
+failp:
+       MOVW    $0, R0
+       RET