Root/arch/sparc/lib/ffs.S

Source at commit 0de2b2b3be81048189a32f7a3d3ba0ba9ec817b6 created 11 years 11 months ago.
By Maarten ter Huurne, MIPS: JZ4740: Fixed value for round robin constant.
1#include <linux/linkage.h>
2
3    .register %g2,#scratch
4
5    .text
6    .align 32
7
8ENTRY(ffs)
9    brnz,pt %o0, 1f
10     mov 1, %o1
11    retl
12     clr %o0
13    nop
14    nop
15ENTRY(__ffs)
16    sllx %o0, 32, %g1 /* 1 */
17    srlx %o0, 32, %g2
18
19    clr %o1 /* 2 */
20    movrz %g1, %g2, %o0
21
22    movrz %g1, 32, %o1 /* 3 */
231: clr %o2
24
25    sllx %o0, (64 - 16), %g1 /* 4 */
26    srlx %o0, 16, %g2
27
28    movrz %g1, %g2, %o0 /* 5 */
29    clr %o3
30
31    movrz %g1, 16, %o2 /* 6 */
32    clr %o4
33
34    and %o0, 0xff, %g1 /* 7 */
35    srlx %o0, 8, %g2
36
37    movrz %g1, %g2, %o0 /* 8 */
38    clr %o5
39
40    movrz %g1, 8, %o3 /* 9 */
41    add %o2, %o1, %o2
42
43    and %o0, 0xf, %g1 /* 10 */
44    srlx %o0, 4, %g2
45
46    movrz %g1, %g2, %o0 /* 11 */
47    add %o2, %o3, %o2
48
49    movrz %g1, 4, %o4 /* 12 */
50
51    and %o0, 0x3, %g1 /* 13 */
52    srlx %o0, 2, %g2
53
54    movrz %g1, %g2, %o0 /* 14 */
55    add %o2, %o4, %o2
56
57    movrz %g1, 2, %o5 /* 15 */
58
59    and %o0, 0x1, %g1 /* 16 */
60
61    add %o2, %o5, %o2 /* 17 */
62    xor %g1, 0x1, %g1
63
64    retl /* 18 */
65     add %o2, %g1, %o0
66ENDPROC(ffs)
67ENDPROC(__ffs)
68
69    .section .popc_6insn_patch, "ax"
70    .word ffs
71    brz,pn %o0, 98f
72     neg %o0, %g1
73    xnor %o0, %g1, %o1
74    popc %o1, %o0
7598: retl
76     nop
77    .word __ffs
78    neg %o0, %g1
79    xnor %o0, %g1, %o1
80    popc %o1, %o0
81    retl
82     sub %o0, 1, %o0
83    nop
84    .previous
85

Archive Download this file



interactive