1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun/* bitops.S: Sparc64 atomic bit operations. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net) 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun#include <linux/linkage.h> 8*4882a593Smuzhiyun#include <asm/asi.h> 9*4882a593Smuzhiyun#include <asm/backoff.h> 10*4882a593Smuzhiyun#include <asm/export.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun .text 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */ 15*4882a593Smuzhiyun BACKOFF_SETUP(%o3) 16*4882a593Smuzhiyun srlx %o0, 6, %g1 17*4882a593Smuzhiyun mov 1, %o2 18*4882a593Smuzhiyun sllx %g1, 3, %g3 19*4882a593Smuzhiyun and %o0, 63, %g2 20*4882a593Smuzhiyun sllx %o2, %g2, %o2 21*4882a593Smuzhiyun add %o1, %g3, %o1 22*4882a593Smuzhiyun1: ldx [%o1], %g7 23*4882a593Smuzhiyun or %g7, %o2, %g1 24*4882a593Smuzhiyun casx [%o1], %g7, %g1 25*4882a593Smuzhiyun cmp %g7, %g1 26*4882a593Smuzhiyun bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 27*4882a593Smuzhiyun and %g7, %o2, %g2 28*4882a593Smuzhiyun clr %o0 29*4882a593Smuzhiyun movrne %g2, 1, %o0 30*4882a593Smuzhiyun retl 31*4882a593Smuzhiyun nop 32*4882a593Smuzhiyun2: BACKOFF_SPIN(%o3, %o4, 1b) 33*4882a593SmuzhiyunENDPROC(test_and_set_bit) 34*4882a593SmuzhiyunEXPORT_SYMBOL(test_and_set_bit) 35*4882a593Smuzhiyun 36*4882a593SmuzhiyunENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */ 37*4882a593Smuzhiyun BACKOFF_SETUP(%o3) 38*4882a593Smuzhiyun srlx %o0, 6, %g1 39*4882a593Smuzhiyun mov 1, %o2 40*4882a593Smuzhiyun sllx %g1, 3, %g3 41*4882a593Smuzhiyun and %o0, 63, %g2 42*4882a593Smuzhiyun sllx %o2, %g2, %o2 43*4882a593Smuzhiyun add %o1, %g3, %o1 44*4882a593Smuzhiyun1: ldx [%o1], %g7 45*4882a593Smuzhiyun andn %g7, %o2, %g1 46*4882a593Smuzhiyun casx [%o1], %g7, %g1 47*4882a593Smuzhiyun cmp %g7, %g1 48*4882a593Smuzhiyun bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 49*4882a593Smuzhiyun and %g7, %o2, %g2 50*4882a593Smuzhiyun clr %o0 51*4882a593Smuzhiyun movrne %g2, 1, %o0 52*4882a593Smuzhiyun retl 53*4882a593Smuzhiyun nop 54*4882a593Smuzhiyun2: BACKOFF_SPIN(%o3, %o4, 1b) 55*4882a593SmuzhiyunENDPROC(test_and_clear_bit) 56*4882a593SmuzhiyunEXPORT_SYMBOL(test_and_clear_bit) 57*4882a593Smuzhiyun 58*4882a593SmuzhiyunENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */ 59*4882a593Smuzhiyun BACKOFF_SETUP(%o3) 60*4882a593Smuzhiyun srlx %o0, 6, %g1 61*4882a593Smuzhiyun mov 1, %o2 62*4882a593Smuzhiyun sllx %g1, 3, %g3 63*4882a593Smuzhiyun and %o0, 63, %g2 64*4882a593Smuzhiyun sllx %o2, %g2, %o2 65*4882a593Smuzhiyun add %o1, %g3, %o1 66*4882a593Smuzhiyun1: ldx [%o1], %g7 67*4882a593Smuzhiyun xor %g7, %o2, %g1 68*4882a593Smuzhiyun casx [%o1], %g7, %g1 69*4882a593Smuzhiyun cmp %g7, %g1 70*4882a593Smuzhiyun bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 71*4882a593Smuzhiyun and %g7, %o2, %g2 72*4882a593Smuzhiyun clr %o0 73*4882a593Smuzhiyun movrne %g2, 1, %o0 74*4882a593Smuzhiyun retl 75*4882a593Smuzhiyun nop 76*4882a593Smuzhiyun2: BACKOFF_SPIN(%o3, %o4, 1b) 77*4882a593SmuzhiyunENDPROC(test_and_change_bit) 78*4882a593SmuzhiyunEXPORT_SYMBOL(test_and_change_bit) 79*4882a593Smuzhiyun 80*4882a593SmuzhiyunENTRY(set_bit) /* %o0=nr, %o1=addr */ 81*4882a593Smuzhiyun BACKOFF_SETUP(%o3) 82*4882a593Smuzhiyun srlx %o0, 6, %g1 83*4882a593Smuzhiyun mov 1, %o2 84*4882a593Smuzhiyun sllx %g1, 3, %g3 85*4882a593Smuzhiyun and %o0, 63, %g2 86*4882a593Smuzhiyun sllx %o2, %g2, %o2 87*4882a593Smuzhiyun add %o1, %g3, %o1 88*4882a593Smuzhiyun1: ldx [%o1], %g7 89*4882a593Smuzhiyun or %g7, %o2, %g1 90*4882a593Smuzhiyun casx [%o1], %g7, %g1 91*4882a593Smuzhiyun cmp %g7, %g1 92*4882a593Smuzhiyun bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 93*4882a593Smuzhiyun nop 94*4882a593Smuzhiyun retl 95*4882a593Smuzhiyun nop 96*4882a593Smuzhiyun2: BACKOFF_SPIN(%o3, %o4, 1b) 97*4882a593SmuzhiyunENDPROC(set_bit) 98*4882a593SmuzhiyunEXPORT_SYMBOL(set_bit) 99*4882a593Smuzhiyun 100*4882a593SmuzhiyunENTRY(clear_bit) /* %o0=nr, %o1=addr */ 101*4882a593Smuzhiyun BACKOFF_SETUP(%o3) 102*4882a593Smuzhiyun srlx %o0, 6, %g1 103*4882a593Smuzhiyun mov 1, %o2 104*4882a593Smuzhiyun sllx %g1, 3, %g3 105*4882a593Smuzhiyun and %o0, 63, %g2 106*4882a593Smuzhiyun sllx %o2, %g2, %o2 107*4882a593Smuzhiyun add %o1, %g3, %o1 108*4882a593Smuzhiyun1: ldx [%o1], %g7 109*4882a593Smuzhiyun andn %g7, %o2, %g1 110*4882a593Smuzhiyun casx [%o1], %g7, %g1 111*4882a593Smuzhiyun cmp %g7, %g1 112*4882a593Smuzhiyun bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 113*4882a593Smuzhiyun nop 114*4882a593Smuzhiyun retl 115*4882a593Smuzhiyun nop 116*4882a593Smuzhiyun2: BACKOFF_SPIN(%o3, %o4, 1b) 117*4882a593SmuzhiyunENDPROC(clear_bit) 118*4882a593SmuzhiyunEXPORT_SYMBOL(clear_bit) 119*4882a593Smuzhiyun 120*4882a593SmuzhiyunENTRY(change_bit) /* %o0=nr, %o1=addr */ 121*4882a593Smuzhiyun BACKOFF_SETUP(%o3) 122*4882a593Smuzhiyun srlx %o0, 6, %g1 123*4882a593Smuzhiyun mov 1, %o2 124*4882a593Smuzhiyun sllx %g1, 3, %g3 125*4882a593Smuzhiyun and %o0, 63, %g2 126*4882a593Smuzhiyun sllx %o2, %g2, %o2 127*4882a593Smuzhiyun add %o1, %g3, %o1 128*4882a593Smuzhiyun1: ldx [%o1], %g7 129*4882a593Smuzhiyun xor %g7, %o2, %g1 130*4882a593Smuzhiyun casx [%o1], %g7, %g1 131*4882a593Smuzhiyun cmp %g7, %g1 132*4882a593Smuzhiyun bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 133*4882a593Smuzhiyun nop 134*4882a593Smuzhiyun retl 135*4882a593Smuzhiyun nop 136*4882a593Smuzhiyun2: BACKOFF_SPIN(%o3, %o4, 1b) 137*4882a593SmuzhiyunENDPROC(change_bit) 138*4882a593SmuzhiyunEXPORT_SYMBOL(change_bit) 139