1// -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2// 3// This Source Code Form is subject to the terms of the Mozilla Public 4// License, v. 2.0. If a copy of the MPL was not distributed with this 5// file, You can obtain one at http://mozilla.org/MPL/2.0/. 6 7.text 8 9// PRInt32 _PR_ia64_AtomicIncrement(PRInt32 *val) 10// 11// Atomically increment the integer pointed to by 'val' and return 12// the result of the increment. 13// 14 .align 16 15 .global _PR_ia64_AtomicIncrement# 16 .proc _PR_ia64_AtomicIncrement# 17_PR_ia64_AtomicIncrement: 18 fetchadd4.acq r8 = [r32], 1 ;; 19 adds r8 = 1, r8 20 br.ret.sptk.many b0 21 .endp _PR_ia64_AtomicIncrement# 22 23// PRInt32 _PR_ia64_AtomicDecrement(PRInt32 *val) 24// 25// Atomically decrement the integer pointed to by 'val' and return 26// the result of the decrement. 27// 28 .align 16 29 .global _PR_ia64_AtomicDecrement# 30 .proc _PR_ia64_AtomicDecrement# 31_PR_ia64_AtomicDecrement: 32 fetchadd4.rel r8 = [r32], -1 ;; 33 adds r8 = -1, r8 34 br.ret.sptk.many b0 35 .endp _PR_ia64_AtomicDecrement# 36 37// PRInt32 _PR_ia64_AtomicAdd(PRInt32 *ptr, PRInt32 val) 38// 39// Atomically add 'val' to the integer pointed to by 'ptr' 40// and return the result of the addition. 41// 42 .align 16 43 .global _PR_ia64_AtomicAdd# 44 .proc _PR_ia64_AtomicAdd# 45_PR_ia64_AtomicAdd: 46 ld4 r15 = [r32] ;; 47.L3: 48 mov r14 = r15 49 mov ar.ccv = r15 50 add r8 = r15, r33 ;; 51 cmpxchg4.acq r15 = [r32], r8, ar.ccv ;; 52 cmp4.ne p6, p7 = r15, r14 53 (p6) br.cond.dptk .L3 54 br.ret.sptk.many b0 55 .endp _PR_ia64_AtomicAdd# 56 57// PRInt32 _PR_ia64_AtomicSet(PRInt32 *val, PRInt32 newval) 58// 59// Atomically set the integer pointed to by 'val' to the new 60// value 'newval' and return the old value. 61// 62 .align 16 63 .global _PR_ia64_AtomicSet# 64 .proc _PR_ia64_AtomicSet# 65_PR_ia64_AtomicSet: 66 xchg4 r8 = [r32], r33 67 br.ret.sptk.many b0 68 .endp _PR_ia64_AtomicSet# 69 70// Magic indicating no need for an executable stack 71.section .note.GNU-stack, "", @progbits 72