]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] runtime: fix cas64 on power64x
authorDave Cheney <dave@cheney.net>
Tue, 28 Oct 2014 00:15:48 +0000 (11:15 +1100)
committerDave Cheney <dave@cheney.net>
Tue, 28 Oct 2014 00:15:48 +0000 (11:15 +1100)
cas64 was jumping to the wrong offset.

LGTM=minux, rsc
R=rsc, austin, minux
CC=golang-codereviews
https://golang.org/cl/158710043

src/runtime/asm_power64x.s

index 76bf42094d9fb18eee5a15415a0032506a09b4bc..b489f6accb355819a94b51f62891794997f92e84 100644 (file)
@@ -409,17 +409,19 @@ TEXT runtime·cas(SB), NOSPLIT, $0-17
        MOVD    p+0(FP), R3
        MOVW    old+8(FP), R4
        MOVW    new+12(FP), R5
+cas_again:
        SYNC
        LWAR    (R3), R6
        CMPW    R6, R4
-       BNE     8(PC)
+       BNE     cas_fail
        STWCCC  R5, (R3)
-       BNE     -5(PC)
+       BNE     cas_again
        MOVD    $1, R3
        SYNC
        ISYNC
        MOVB    R3, ret+16(FP)
        RETURN
+cas_fail:
        MOVD    $0, R3
        BR      -5(PC)
 
@@ -435,19 +437,21 @@ TEXT runtime·cas64(SB), NOSPLIT, $0-25
        MOVD    p+0(FP), R3
        MOVD    old+8(FP), R4
        MOVD    new+16(FP), R5
+cas64_again:
        SYNC
        LDAR    (R3), R6
        CMP     R6, R4
-       BNE     7(PC)
+       BNE     cas64_fail
        STDCCC  R5, (R3)
-       BNE     -5(PC)
+       BNE     cas64_again
        MOVD    $1, R3
        SYNC
        ISYNC
        MOVB    R3, ret+24(FP)
        RETURN
+cas64_fail:
        MOVD    $0, R3
-       BR      -4(PC)
+       BR      -5(PC)
 
 TEXT runtime·casuintptr(SB), NOSPLIT, $0-25
        BR      runtime·cas64(SB)