1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2478b8fecSSam Ravnborg/* bitops.S: Sparc64 atomic bit operations. 3478b8fecSSam Ravnborg * 4478b8fecSSam Ravnborg * Copyright (C) 2000, 2007 David S. Miller (davem@davemloft.net) 5478b8fecSSam Ravnborg */ 6478b8fecSSam Ravnborg 7*4cdb71b6SMasahiro Yamada#include <linux/export.h> 88695c37dSDavid S. Miller#include <linux/linkage.h> 9478b8fecSSam Ravnborg#include <asm/asi.h> 10478b8fecSSam Ravnborg#include <asm/backoff.h> 11478b8fecSSam Ravnborg 12478b8fecSSam Ravnborg .text 13478b8fecSSam Ravnborg 148695c37dSDavid S. MillerENTRY(test_and_set_bit) /* %o0=nr, %o1=addr */ 15478b8fecSSam Ravnborg BACKOFF_SETUP(%o3) 16478b8fecSSam Ravnborg srlx %o0, 6, %g1 17478b8fecSSam Ravnborg mov 1, %o2 18478b8fecSSam Ravnborg sllx %g1, 3, %g3 19478b8fecSSam Ravnborg and %o0, 63, %g2 20478b8fecSSam Ravnborg sllx %o2, %g2, %o2 21478b8fecSSam Ravnborg add %o1, %g3, %o1 22478b8fecSSam Ravnborg1: ldx [%o1], %g7 23478b8fecSSam Ravnborg or %g7, %o2, %g1 24478b8fecSSam Ravnborg casx [%o1], %g7, %g1 25478b8fecSSam Ravnborg cmp %g7, %g1 260f58189dSDavid S. Miller bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 27478b8fecSSam Ravnborg and %g7, %o2, %g2 28478b8fecSSam Ravnborg clr %o0 29478b8fecSSam Ravnborg movrne %g2, 1, %o0 30478b8fecSSam Ravnborg retl 31478b8fecSSam Ravnborg nop 32478b8fecSSam Ravnborg2: BACKOFF_SPIN(%o3, %o4, 1b) 338695c37dSDavid S. MillerENDPROC(test_and_set_bit) 34d3867f04SAl ViroEXPORT_SYMBOL(test_and_set_bit) 35478b8fecSSam Ravnborg 368695c37dSDavid S. MillerENTRY(test_and_clear_bit) /* %o0=nr, %o1=addr */ 37478b8fecSSam Ravnborg BACKOFF_SETUP(%o3) 38478b8fecSSam Ravnborg srlx %o0, 6, %g1 39478b8fecSSam Ravnborg mov 1, %o2 40478b8fecSSam Ravnborg sllx %g1, 3, %g3 41478b8fecSSam Ravnborg and %o0, 63, %g2 42478b8fecSSam Ravnborg sllx %o2, %g2, %o2 43478b8fecSSam Ravnborg add %o1, %g3, %o1 44478b8fecSSam Ravnborg1: ldx [%o1], %g7 45478b8fecSSam Ravnborg andn %g7, %o2, %g1 46478b8fecSSam Ravnborg casx [%o1], %g7, %g1 47478b8fecSSam Ravnborg cmp %g7, %g1 480f58189dSDavid S. Miller bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 49478b8fecSSam Ravnborg and %g7, %o2, %g2 50478b8fecSSam Ravnborg clr %o0 51478b8fecSSam Ravnborg movrne %g2, 1, %o0 52478b8fecSSam Ravnborg retl 53478b8fecSSam Ravnborg nop 54478b8fecSSam Ravnborg2: BACKOFF_SPIN(%o3, %o4, 1b) 558695c37dSDavid S. MillerENDPROC(test_and_clear_bit) 56d3867f04SAl ViroEXPORT_SYMBOL(test_and_clear_bit) 57478b8fecSSam Ravnborg 588695c37dSDavid S. MillerENTRY(test_and_change_bit) /* %o0=nr, %o1=addr */ 59478b8fecSSam Ravnborg BACKOFF_SETUP(%o3) 60478b8fecSSam Ravnborg srlx %o0, 6, %g1 61478b8fecSSam Ravnborg mov 1, %o2 62478b8fecSSam Ravnborg sllx %g1, 3, %g3 63478b8fecSSam Ravnborg and %o0, 63, %g2 64478b8fecSSam Ravnborg sllx %o2, %g2, %o2 65478b8fecSSam Ravnborg add %o1, %g3, %o1 66478b8fecSSam Ravnborg1: ldx [%o1], %g7 67478b8fecSSam Ravnborg xor %g7, %o2, %g1 68478b8fecSSam Ravnborg casx [%o1], %g7, %g1 69478b8fecSSam Ravnborg cmp %g7, %g1 700f58189dSDavid S. Miller bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 71478b8fecSSam Ravnborg and %g7, %o2, %g2 72478b8fecSSam Ravnborg clr %o0 73478b8fecSSam Ravnborg movrne %g2, 1, %o0 74478b8fecSSam Ravnborg retl 75478b8fecSSam Ravnborg nop 76478b8fecSSam Ravnborg2: BACKOFF_SPIN(%o3, %o4, 1b) 778695c37dSDavid S. MillerENDPROC(test_and_change_bit) 78d3867f04SAl ViroEXPORT_SYMBOL(test_and_change_bit) 79478b8fecSSam Ravnborg 808695c37dSDavid S. MillerENTRY(set_bit) /* %o0=nr, %o1=addr */ 81478b8fecSSam Ravnborg BACKOFF_SETUP(%o3) 82478b8fecSSam Ravnborg srlx %o0, 6, %g1 83478b8fecSSam Ravnborg mov 1, %o2 84478b8fecSSam Ravnborg sllx %g1, 3, %g3 85478b8fecSSam Ravnborg and %o0, 63, %g2 86478b8fecSSam Ravnborg sllx %o2, %g2, %o2 87478b8fecSSam Ravnborg add %o1, %g3, %o1 88478b8fecSSam Ravnborg1: ldx [%o1], %g7 89478b8fecSSam Ravnborg or %g7, %o2, %g1 90478b8fecSSam Ravnborg casx [%o1], %g7, %g1 91478b8fecSSam Ravnborg cmp %g7, %g1 920f58189dSDavid S. Miller bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 93478b8fecSSam Ravnborg nop 94478b8fecSSam Ravnborg retl 95478b8fecSSam Ravnborg nop 96478b8fecSSam Ravnborg2: BACKOFF_SPIN(%o3, %o4, 1b) 978695c37dSDavid S. MillerENDPROC(set_bit) 98d3867f04SAl ViroEXPORT_SYMBOL(set_bit) 99478b8fecSSam Ravnborg 1008695c37dSDavid S. MillerENTRY(clear_bit) /* %o0=nr, %o1=addr */ 101478b8fecSSam Ravnborg BACKOFF_SETUP(%o3) 102478b8fecSSam Ravnborg srlx %o0, 6, %g1 103478b8fecSSam Ravnborg mov 1, %o2 104478b8fecSSam Ravnborg sllx %g1, 3, %g3 105478b8fecSSam Ravnborg and %o0, 63, %g2 106478b8fecSSam Ravnborg sllx %o2, %g2, %o2 107478b8fecSSam Ravnborg add %o1, %g3, %o1 108478b8fecSSam Ravnborg1: ldx [%o1], %g7 109478b8fecSSam Ravnborg andn %g7, %o2, %g1 110478b8fecSSam Ravnborg casx [%o1], %g7, %g1 111478b8fecSSam Ravnborg cmp %g7, %g1 1120f58189dSDavid S. Miller bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 113478b8fecSSam Ravnborg nop 114478b8fecSSam Ravnborg retl 115478b8fecSSam Ravnborg nop 116478b8fecSSam Ravnborg2: BACKOFF_SPIN(%o3, %o4, 1b) 1178695c37dSDavid S. MillerENDPROC(clear_bit) 118d3867f04SAl ViroEXPORT_SYMBOL(clear_bit) 119478b8fecSSam Ravnborg 1208695c37dSDavid S. MillerENTRY(change_bit) /* %o0=nr, %o1=addr */ 121478b8fecSSam Ravnborg BACKOFF_SETUP(%o3) 122478b8fecSSam Ravnborg srlx %o0, 6, %g1 123478b8fecSSam Ravnborg mov 1, %o2 124478b8fecSSam Ravnborg sllx %g1, 3, %g3 125478b8fecSSam Ravnborg and %o0, 63, %g2 126478b8fecSSam Ravnborg sllx %o2, %g2, %o2 127478b8fecSSam Ravnborg add %o1, %g3, %o1 128478b8fecSSam Ravnborg1: ldx [%o1], %g7 129478b8fecSSam Ravnborg xor %g7, %o2, %g1 130478b8fecSSam Ravnborg casx [%o1], %g7, %g1 131478b8fecSSam Ravnborg cmp %g7, %g1 1320f58189dSDavid S. Miller bne,pn %xcc, BACKOFF_LABEL(2f, 1b) 133478b8fecSSam Ravnborg nop 134478b8fecSSam Ravnborg retl 135478b8fecSSam Ravnborg nop 136478b8fecSSam Ravnborg2: BACKOFF_SPIN(%o3, %o4, 1b) 1378695c37dSDavid S. MillerENDPROC(change_bit) 138d3867f04SAl ViroEXPORT_SYMBOL(change_bit) 139