Merge tag 'sched-urgent-2020-12-27' of git://git.kernel.org/pub/scm/linux/kernel...
[linux/fpc-iii.git] / arch / sparc / lib / memscan_32.S
blobc4c2d5b3a2e95a93418811d3bcb148a8df5b2ac2
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * memscan.S: Optimized memscan for the Sparc.
4  *
5  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
6  */
8 #include <asm/export.h>
10 /* In essence, this is just a fancy strlen. */
12 #define LO_MAGIC 0x01010101
13 #define HI_MAGIC 0x80808080
15         .text
16         .align  4
17         .globl  __memscan_zero, __memscan_generic
18         .globl  memscan
19 EXPORT_SYMBOL(__memscan_zero)
20 EXPORT_SYMBOL(__memscan_generic)
21 __memscan_zero:
22         /* %o0 = addr, %o1 = size */
23         cmp     %o1, 0
24         bne,a   1f
25          andcc  %o0, 3, %g0
27         retl
28          nop
31         be      mzero_scan_word
32          sethi  %hi(HI_MAGIC), %g2
34         ldsb    [%o0], %g3
35 mzero_still_not_word_aligned:
36         cmp     %g3, 0
37         bne     1f
38          add    %o0, 1, %o0
40         retl
41          sub    %o0, 1, %o0
44         subcc   %o1, 1, %o1
45         bne,a   1f
46          andcc  %o0, 3, %g0
48         retl
49          nop
52         bne,a   mzero_still_not_word_aligned
53          ldsb   [%o0], %g3
55         sethi   %hi(HI_MAGIC), %g2
56 mzero_scan_word:
57         or      %g2, %lo(HI_MAGIC), %o3
58         sethi   %hi(LO_MAGIC), %g3
59         or      %g3, %lo(LO_MAGIC), %o2
60 mzero_next_word:
61         ld      [%o0], %g2
62 mzero_next_word_preloaded:
63         sub     %g2, %o2, %g2
64 mzero_next_word_preloaded_next:
65         andcc   %g2, %o3, %g0
66         bne     mzero_byte_zero
67          add    %o0, 4, %o0
69 mzero_check_out_of_fuel:
70         subcc   %o1, 4, %o1
71         bg,a    1f
72          ld     [%o0], %g2
74         retl
75          nop
78         b       mzero_next_word_preloaded_next
79          sub    %g2, %o2, %g2
81         /* Check every byte. */
82 mzero_byte_zero:
83         ldsb    [%o0 - 4], %g2
84         cmp     %g2, 0
85         bne     mzero_byte_one
86          sub    %o0, 4, %g3
88         retl
89          mov    %g3, %o0
91 mzero_byte_one:
92         ldsb    [%o0 - 3], %g2
93         cmp     %g2, 0
94         bne,a   mzero_byte_two_and_three
95          ldsb   [%o0 - 2], %g2
97         retl
98          sub    %o0, 3, %o0
100 mzero_byte_two_and_three:
101         cmp     %g2, 0
102         bne,a   1f
103          ldsb   [%o0 - 1], %g2
105         retl
106          sub    %o0, 2, %o0
109         cmp     %g2, 0
110         bne,a   mzero_next_word_preloaded
111          ld     [%o0], %g2
113         retl
114          sub    %o0, 1, %o0
116 mzero_found_it:
117         retl
118          sub    %o0, 2, %o0
120 memscan:
121 __memscan_generic:
122         /* %o0 = addr, %o1 = c, %o2 = size */
123         cmp     %o2, 0
124         bne,a   0f
125          ldub   [%o0], %g2
127         b,a     2f
129         ldub    [%o0], %g2
131         cmp     %g2, %o1
132         be      2f
133          addcc  %o2, -1, %o2
134         bne     1b
135          add    %o0, 1, %o0
137         retl
138          nop