diff --git a/src/pkg/runtime/arm/cas.s b/src/pkg/runtime/arm/cas.s index 648fa40c8d..63df1396d7 100644 --- a/src/pkg/runtime/arm/cas.s +++ b/src/pkg/runtime/arm/cas.s @@ -10,5 +10,20 @@ // }else // return 0; -TEXT cas+0(SB),0,$12 - TODO +TEXT cas(SB),7,$0 + MOVW 0(FP), R1 // *val + MOVW 4(FP), R2 // old + MOVW 8(FP), R3 // new +l: + LDREX (R1), R0 + CMP R0, R2 + BNE fail + STREX R3, (R1), R0 + CMP $0, R0 + BNE l + MOVW $1, R0 + RET +fail: + MOVW $0, R0 + RET + diff --git a/src/pkg/sync/asm_arm.s b/src/pkg/sync/asm_arm.s index a6ad9d949c..077e81410c 100644 --- a/src/pkg/sync/asm_arm.s +++ b/src/pkg/sync/asm_arm.s @@ -10,5 +10,21 @@ // }else // return false; -TEXT sync·cas+0(SB),0,$12 - TODO +TEXT sync·cas(SB),7,$0 + MOVW 0(FP), R1 // *val + MOVW 4(FP), R2 // old + MOVW 8(FP), R3 // new +l: + LDREX (R1), R0 + CMP R0, R2 + BNE fail + STREX R3, (R1), R0 + CMP $0, R0 + BNE l + MOVW $1, R0 + MOVW R0, 16(SP) + RET +fail: + MOVW $0, R0 + MOVW R0, 16(SP) + RET