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