Commit 6a48aab7 authored by Kai Backman's avatar Kai Backman

add support for pre arm v6 cas. set GOARM=5 to enable.

R=rsc
https://golang.org/cl/154101
parent c4034225
...@@ -28,9 +28,11 @@ OFILES_386=\ ...@@ -28,9 +28,11 @@ OFILES_386=\
vlop.$O\ vlop.$O\
vlrt.$O\ vlrt.$O\
GOARM ?= 6
# arm-specific object files # arm-specific object files
OFILES_arm=\ OFILES_arm=\
cas.$O\ cas$(GOARM).$O\
memset.$O\ memset.$O\
vlop.$O\ vlop.$O\
vlrt.$O\ vlrt.$O\
......
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "arm/asm.h"
// This version works on pre v6 architectures
// bool cas(int32 *val, int32 old, int32 new)
// Atomically:
// if(*val == old){
// *val = new;
// return 1;
// }else
// return 0;
TEXT cas(SB),7,$0
MOVW 0(FP), R0 // *val
MOVW 4(FP), R1 // old
MOVW 8(FP), R2 // new
MOVW $1, R3
MOVW $cas_mutex(SB), R4
l:
SWPW (R4), R3 // acquire mutex
CMP $0, R3
BNE fail0
MOVW (R0), R5
CMP R1, R5
BNE fail1
MOVW R2, (R0)
MOVW R3, (R4) // release mutex
MOVW $1, R0
RET
fail1:
MOVW R3, (R4) // release mutex
fail0:
MOVW $0, R0
RET
DATA cas_mutex(SB)/4, $0
GLOBL cas_mutex(SB), $4
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment