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