mm owner: fix race between swapoff and exit
[linux-2.6/next.git] / arch / sparc / lib / memscan.S
blob4ff1657dfc246a65a432cf228ba3088d853db2c4
1 /*
2  * memscan.S: Optimized memscan for the Sparc.
3  *
4  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
5  */
7 /* In essence, this is just a fancy strlen. */
9 #define LO_MAGIC 0x01010101
10 #define HI_MAGIC 0x80808080
12         .text
13         .align  4
14         .globl  __memscan_zero, __memscan_generic
15         .globl  memscan
16 __memscan_zero:
17         /* %o0 = addr, %o1 = size */
18         cmp     %o1, 0
19         bne,a   1f
20          andcc  %o0, 3, %g0
22         retl
23          nop
26         be      mzero_scan_word
27          sethi  %hi(HI_MAGIC), %g2
29         ldsb    [%o0], %g3
30 mzero_still_not_word_aligned:
31         cmp     %g3, 0
32         bne     1f
33          add    %o0, 1, %o0
35         retl
36          sub    %o0, 1, %o0
39         subcc   %o1, 1, %o1
40         bne,a   1f
41          andcc  %o0, 3, %g0
43         retl
44          nop
47         bne,a   mzero_still_not_word_aligned
48          ldsb   [%o0], %g3
50         sethi   %hi(HI_MAGIC), %g2
51 mzero_scan_word:
52         or      %g2, %lo(HI_MAGIC), %o3
53         sethi   %hi(LO_MAGIC), %g3
54         or      %g3, %lo(LO_MAGIC), %o2
55 mzero_next_word:
56         ld      [%o0], %g2
57 mzero_next_word_preloaded:
58         sub     %g2, %o2, %g2
59 mzero_next_word_preloaded_next:
60         andcc   %g2, %o3, %g0
61         bne     mzero_byte_zero
62          add    %o0, 4, %o0
64 mzero_check_out_of_fuel:
65         subcc   %o1, 4, %o1
66         bg,a    1f
67          ld     [%o0], %g2
69         retl
70          nop
73         b       mzero_next_word_preloaded_next
74          sub    %g2, %o2, %g2
76         /* Check every byte. */
77 mzero_byte_zero:
78         ldsb    [%o0 - 4], %g2
79         cmp     %g2, 0
80         bne     mzero_byte_one
81          sub    %o0, 4, %g3
83         retl
84          mov    %g3, %o0
86 mzero_byte_one:
87         ldsb    [%o0 - 3], %g2
88         cmp     %g2, 0
89         bne,a   mzero_byte_two_and_three
90          ldsb   [%o0 - 2], %g2
92         retl
93          sub    %o0, 3, %o0
95 mzero_byte_two_and_three:
96         cmp     %g2, 0
97         bne,a   1f
98          ldsb   [%o0 - 1], %g2
100         retl
101          sub    %o0, 2, %o0
104         cmp     %g2, 0
105         bne,a   mzero_next_word_preloaded
106          ld     [%o0], %g2
108         retl
109          sub    %o0, 1, %o0
111 mzero_found_it:
112         retl
113          sub    %o0, 2, %o0
115 memscan:
116 __memscan_generic:
117         /* %o0 = addr, %o1 = c, %o2 = size */
118         cmp     %o2, 0
119         bne,a   0f
120          ldub   [%o0], %g2
122         b,a     2f
124         ldub    [%o0], %g2
126         cmp     %g2, %o1
127         be      2f
128          addcc  %o2, -1, %o2
129         bne     1b
130          add    %o0, 1, %o0
132         retl
133          nop