1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun#include <linux/linkage.h> 3*4882a593Smuzhiyun#include <asm/export.h> 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun .register %g2,#scratch 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun .text 8*4882a593Smuzhiyun .align 32 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunENTRY(ffs) 11*4882a593Smuzhiyun brnz,pt %o0, 1f 12*4882a593Smuzhiyun mov 1, %o1 13*4882a593Smuzhiyun retl 14*4882a593Smuzhiyun clr %o0 15*4882a593Smuzhiyun nop 16*4882a593Smuzhiyun nop 17*4882a593SmuzhiyunENTRY(__ffs) 18*4882a593Smuzhiyun sllx %o0, 32, %g1 /* 1 */ 19*4882a593Smuzhiyun srlx %o0, 32, %g2 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun clr %o1 /* 2 */ 22*4882a593Smuzhiyun movrz %g1, %g2, %o0 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun movrz %g1, 32, %o1 /* 3 */ 25*4882a593Smuzhiyun1: clr %o2 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun sllx %o0, (64 - 16), %g1 /* 4 */ 28*4882a593Smuzhiyun srlx %o0, 16, %g2 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun movrz %g1, %g2, %o0 /* 5 */ 31*4882a593Smuzhiyun clr %o3 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun movrz %g1, 16, %o2 /* 6 */ 34*4882a593Smuzhiyun clr %o4 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun and %o0, 0xff, %g1 /* 7 */ 37*4882a593Smuzhiyun srlx %o0, 8, %g2 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun movrz %g1, %g2, %o0 /* 8 */ 40*4882a593Smuzhiyun clr %o5 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun movrz %g1, 8, %o3 /* 9 */ 43*4882a593Smuzhiyun add %o2, %o1, %o2 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun and %o0, 0xf, %g1 /* 10 */ 46*4882a593Smuzhiyun srlx %o0, 4, %g2 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun movrz %g1, %g2, %o0 /* 11 */ 49*4882a593Smuzhiyun add %o2, %o3, %o2 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun movrz %g1, 4, %o4 /* 12 */ 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun and %o0, 0x3, %g1 /* 13 */ 54*4882a593Smuzhiyun srlx %o0, 2, %g2 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun movrz %g1, %g2, %o0 /* 14 */ 57*4882a593Smuzhiyun add %o2, %o4, %o2 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun movrz %g1, 2, %o5 /* 15 */ 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun and %o0, 0x1, %g1 /* 16 */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun add %o2, %o5, %o2 /* 17 */ 64*4882a593Smuzhiyun xor %g1, 0x1, %g1 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun retl /* 18 */ 67*4882a593Smuzhiyun add %o2, %g1, %o0 68*4882a593SmuzhiyunENDPROC(ffs) 69*4882a593SmuzhiyunENDPROC(__ffs) 70*4882a593SmuzhiyunEXPORT_SYMBOL(__ffs) 71*4882a593SmuzhiyunEXPORT_SYMBOL(ffs) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun .section .popc_6insn_patch, "ax" 74*4882a593Smuzhiyun .word ffs 75*4882a593Smuzhiyun brz,pn %o0, 98f 76*4882a593Smuzhiyun neg %o0, %g1 77*4882a593Smuzhiyun xnor %o0, %g1, %o1 78*4882a593Smuzhiyun popc %o1, %o0 79*4882a593Smuzhiyun98: retl 80*4882a593Smuzhiyun nop 81*4882a593Smuzhiyun .word __ffs 82*4882a593Smuzhiyun neg %o0, %g1 83*4882a593Smuzhiyun xnor %o0, %g1, %o1 84*4882a593Smuzhiyun popc %o1, %o0 85*4882a593Smuzhiyun retl 86*4882a593Smuzhiyun sub %o0, 1, %o0 87*4882a593Smuzhiyun nop 88*4882a593Smuzhiyun .previous 89