0001
0002 #include <linux/linkage.h>
0003 #include <asm/export.h>
0004
0005 .register %g2,#scratch
0006
0007 .text
0008 .align 32
0009
0010 ENTRY(ffs)
0011 brnz,pt %o0, 1f
0012 mov 1, %o1
0013 retl
0014 clr %o0
0015 nop
0016 nop
0017 ENTRY(__ffs)
0018 sllx %o0, 32, %g1
0019 srlx %o0, 32, %g2
0020
0021 clr %o1
0022 movrz %g1, %g2, %o0
0023
0024 movrz %g1, 32, %o1
0025 1: clr %o2
0026
0027 sllx %o0, (64 - 16), %g1
0028 srlx %o0, 16, %g2
0029
0030 movrz %g1, %g2, %o0
0031 clr %o3
0032
0033 movrz %g1, 16, %o2
0034 clr %o4
0035
0036 and %o0, 0xff, %g1
0037 srlx %o0, 8, %g2
0038
0039 movrz %g1, %g2, %o0
0040 clr %o5
0041
0042 movrz %g1, 8, %o3
0043 add %o2, %o1, %o2
0044
0045 and %o0, 0xf, %g1
0046 srlx %o0, 4, %g2
0047
0048 movrz %g1, %g2, %o0
0049 add %o2, %o3, %o2
0050
0051 movrz %g1, 4, %o4
0052
0053 and %o0, 0x3, %g1
0054 srlx %o0, 2, %g2
0055
0056 movrz %g1, %g2, %o0
0057 add %o2, %o4, %o2
0058
0059 movrz %g1, 2, %o5
0060
0061 and %o0, 0x1, %g1
0062
0063 add %o2, %o5, %o2
0064 xor %g1, 0x1, %g1
0065
0066 retl
0067 add %o2, %g1, %o0
0068 ENDPROC(ffs)
0069 ENDPROC(__ffs)
0070 EXPORT_SYMBOL(__ffs)
0071 EXPORT_SYMBOL(ffs)
0072
0073 .section .popc_6insn_patch, "ax"
0074 .word ffs
0075 brz,pn %o0, 98f
0076 neg %o0, %g1
0077 xnor %o0, %g1, %o1
0078 popc %o1, %o0
0079 98: retl
0080 nop
0081 .word __ffs
0082 neg %o0, %g1
0083 xnor %o0, %g1, %o1
0084 popc %o1, %o0
0085 retl
0086 sub %o0, 1, %o0
0087 nop
0088 .previous