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