/* kernel atomic64 operations1*2* For an explanation of how atomic ops work in this arch, see:3* Documentation/frv/atomic-ops.txt4*5* Copyright (C) 2009 Red Hat, Inc. All Rights Reserved.6* Written by David Howells ([email protected])7*8* This program is free software; you can redistribute it and/or9* modify it under the terms of the GNU General Public License10* as published by the Free Software Foundation; either version11* 2 of the License, or (at your option) any later version.12*/1314#include <asm/spr-regs.h>1516.text17.balign 4181920###############################################################################21#22# long long atomic64_inc_return(atomic64_t *v)23#24###############################################################################25.globl atomic64_inc_return26.type atomic64_inc_return,@function27atomic64_inc_return:28or.p gr8,gr8,gr10290:30orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */31ckeq icc3,cc732ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */33orcr cc7,cc7,cc3 /* set CC3 to true */34addicc gr9,#1,gr9,icc035addxi gr8,#0,gr8,icc036cstd.p gr8,@(gr10,gr0) ,cc3,#137corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */38beq icc3,#0,0b39bralr4041.size atomic64_inc_return, .-atomic64_inc_return4243###############################################################################44#45# long long atomic64_dec_return(atomic64_t *v)46#47###############################################################################48.globl atomic64_dec_return49.type atomic64_dec_return,@function50atomic64_dec_return:51or.p gr8,gr8,gr10520:53orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */54ckeq icc3,cc755ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */56orcr cc7,cc7,cc3 /* set CC3 to true */57subicc gr9,#1,gr9,icc058subxi gr8,#0,gr8,icc059cstd.p gr8,@(gr10,gr0) ,cc3,#160corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */61beq icc3,#0,0b62bralr6364.size atomic64_dec_return, .-atomic64_dec_return6566###############################################################################67#68# long long atomic64_add_return(long long i, atomic64_t *v)69#70###############################################################################71.globl atomic64_add_return72.type atomic64_add_return,@function73atomic64_add_return:74or.p gr8,gr8,gr475or gr9,gr9,gr5760:77orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */78ckeq icc3,cc779ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */80orcr cc7,cc7,cc3 /* set CC3 to true */81addcc gr9,gr5,gr9,icc082addx gr8,gr4,gr8,icc083cstd.p gr8,@(gr10,gr0) ,cc3,#184corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */85beq icc3,#0,0b86bralr8788.size atomic64_add_return, .-atomic64_add_return8990###############################################################################91#92# long long atomic64_sub_return(long long i, atomic64_t *v)93#94###############################################################################95.globl atomic64_sub_return96.type atomic64_sub_return,@function97atomic64_sub_return:98or.p gr8,gr8,gr499or gr9,gr9,gr51000:101orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */102ckeq icc3,cc7103ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */104orcr cc7,cc7,cc3 /* set CC3 to true */105subcc gr9,gr5,gr9,icc0106subx gr8,gr4,gr8,icc0107cstd.p gr8,@(gr10,gr0) ,cc3,#1108corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */109beq icc3,#0,0b110bralr111112.size atomic64_sub_return, .-atomic64_sub_return113114###############################################################################115#116# uint64_t __xchg_64(uint64_t i, uint64_t *v)117#118###############################################################################119.globl __xchg_64120.type __xchg_64,@function121__xchg_64:122or.p gr8,gr8,gr4123or gr9,gr9,gr51240:125orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */126ckeq icc3,cc7127ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */128orcr cc7,cc7,cc3 /* set CC3 to true */129cstd.p gr4,@(gr10,gr0) ,cc3,#1130corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */131beq icc3,#0,0b132bralr133134.size __xchg_64, .-__xchg_64135136###############################################################################137#138# uint64_t __cmpxchg_64(uint64_t test, uint64_t new, uint64_t *v)139#140###############################################################################141.globl __cmpxchg_64142.type __cmpxchg_64,@function143__cmpxchg_64:144or.p gr8,gr8,gr4145or gr9,gr9,gr51460:147orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */148ckeq icc3,cc7149ldd.p @(gr12,gr0),gr8 /* LDD.P/ORCR must be atomic */150orcr cc7,cc7,cc3151subcc gr8,gr4,gr0,icc0152subcc.p gr9,gr5,gr0,icc1153bnelr icc0,#0154bnelr icc1,#0155cstd.p gr10,@(gr12,gr0) ,cc3,#1156corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */157beq icc3,#0,0b158bralr159160.size __cmpxchg_64, .-__cmpxchg_64161162163164