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