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