blob: ab1cb0b30b237242b2854b1574d95e1d3c3263f3 [file] [log] [blame]
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*
* Atomically add a new element to the top of the stack
*
* usage : PR_StackPush(listp, elementp);
* -----------------------
*/
#include "md/_irix.h"
#ifdef _PR_HAVE_ATOMIC_CAS
#include <sys/asm.h>
#include <sys/regdef.h>
LEAF(PR_StackPush)
retry_push:
.set noreorder
lw v0,0(a0)
li t1,1
beq v0,t1,retry_push
move t0,a1
ll v0,0(a0)
beq v0,t1,retry_push
nop
sc t1,0(a0)
beq t1,0,retry_push
nop
sw v0,0(a1)
sync
sw t0,0(a0)
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
jr ra
nop
END(PR_StackPush)
/*
*
* Atomically remove the element at the top of the stack
*
* usage : elemep = PR_StackPop(listp);
*
*/
LEAF(PR_StackPop)
retry_pop:
.set noreorder
lw v0,0(a0)
li t1,1
beq v0,0,done
nop
beq v0,t1,retry_pop
nop
ll v0,0(a0)
beq v0,0,done
nop
beq v0,t1,retry_pop
nop
sc t1,0(a0)
beq t1,0,retry_pop
nop
lw t0,0(v0)
sw t0,0(a0)
done:
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
jr ra
nop
END(PR_StackPop)
#endif /* _PR_HAVE_ATOMIC_CAS */