1210193Snwhitehorn/*- 2210193Snwhitehorn * Copyright (C) 2010 Nathan Whitehorn 3210193Snwhitehorn * All rights reserved. 4210193Snwhitehorn * 5210193Snwhitehorn * Redistribution and use in source and binary forms, with or without 6210193Snwhitehorn * modification, are permitted provided that the following conditions 7210193Snwhitehorn * are met: 8210193Snwhitehorn * 1. Redistributions of source code must retain the above copyright 9210193Snwhitehorn * notice, this list of conditions and the following disclaimer. 10210193Snwhitehorn * 2. Redistributions in binary form must reproduce the above copyright 11210193Snwhitehorn * notice, this list of conditions and the following disclaimer in the 12210193Snwhitehorn * documentation and/or other materials provided with the distribution. 13210193Snwhitehorn * 14210193Snwhitehorn * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15210193Snwhitehorn * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16210193Snwhitehorn * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17210193Snwhitehorn * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 18210193Snwhitehorn * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19210193Snwhitehorn * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 20210193Snwhitehorn * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 21210193Snwhitehorn * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 22210193Snwhitehorn * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 23210193Snwhitehorn * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24210193Snwhitehorn * 25210193Snwhitehorn * $FreeBSD: releng/10.2/sys/cddl/contrib/opensolaris/common/atomic/powerpc64/opensolaris_atomic.S 219089 2011-02-27 19:41:40Z pjd $ 26210193Snwhitehorn */ 27210193Snwhitehorn 28210193Snwhitehorn#include <machine/asm.h> 29210193Snwhitehorn 30210193SnwhitehornENTRY(atomic_add_64_nv) 31210193Snwhitehorn 1: ldarx %r5,0,%r3 32210193Snwhitehorn add %r5,%r4,%r5 33210193Snwhitehorn stdcx. %r5,0,%r3 34210193Snwhitehorn bne- 1b 35210193Snwhitehorn 36210193Snwhitehorn mr %r3,%r5 37210193Snwhitehorn blr 38210193Snwhitehorn 39219089SpjdENTRY(atomic_cas_32) 40219089Spjd 1: lwarx %r6,0,%r3 41219089Spjd cmplw %r6,%r4 42219089Spjd bne 2f 43219089Spjd stwcx. %r5,0,%r3 44219089Spjd bne- 1b 45219089Spjd b 3f 46219089Spjd 47219089Spjd 2: stwcx. %r6,0,%r3 /* clear reservation */ 48219089Spjd 49219089Spjd 3: mr %r3,%r6 50219089Spjd blr 51219089Spjd 52210193SnwhitehornENTRY(atomic_cas_64) 53210193Snwhitehorn 1: ldarx %r6,0,%r3 54210193Snwhitehorn cmpld %r6,%r4 55210193Snwhitehorn bne 2f 56210193Snwhitehorn stdcx. %r5,0,%r3 57210193Snwhitehorn bne- 1b 58210193Snwhitehorn b 3f 59210193Snwhitehorn 60210193Snwhitehorn 2: stdcx. %r6,0,%r3 /* clear reservation */ 61210193Snwhitehorn 62210193Snwhitehorn 3: mr %r3,%r6 63210193Snwhitehorn blr 64210193Snwhitehorn 65210193SnwhitehornENTRY(atomic_or_8_nv) 66210193Snwhitehorn li %r6,3 67210193Snwhitehorn andc. %r6,%r3,%r6 /* r6 = r3 & ~4 */ 68210193Snwhitehorn addi %r7,%r6,3 69210193Snwhitehorn sub %r7,%r7,%r3 /* offset in r7 */ 70210193Snwhitehorn sldi %r7,%r7,3 /* bits to shift in r7 */ 71210193Snwhitehorn 72210193Snwhitehorn rlwinm %r4,%r4,0,24,31 /* mask and rotate the argument */ 73210193Snwhitehorn slw %r4,%r4,%r7 74210193Snwhitehorn 75210193Snwhitehorn 1: lwarx %r5,0,%r6 76210193Snwhitehorn or %r5,%r4,%r5 77210193Snwhitehorn stwcx. %r5,0,%r6 78210193Snwhitehorn bne- 1b 79210193Snwhitehorn 80210193Snwhitehorn srw %r3,%r5,%r7 81210193Snwhitehorn rlwinm %r3,%r3,0,24,31 /* mask return value */ 82210193Snwhitehorn 83210193Snwhitehorn blr 84210193Snwhitehorn 85210193SnwhitehornENTRY(membar_producer) 86210193Snwhitehorn eieio 87210193Snwhitehorn blr 88210193Snwhitehorn 89