/* -*- 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 #include 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 */