Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * memscan.S: Optimized memscan for the Sparc.
0004  *
0005  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
0006  */
0007 
0008 #include <asm/export.h>
0009 
0010 /* In essence, this is just a fancy strlen. */
0011 
0012 #define LO_MAGIC 0x01010101
0013 #define HI_MAGIC 0x80808080
0014 
0015     .text
0016     .align  4
0017     .globl  __memscan_zero, __memscan_generic
0018     .globl  memscan
0019 EXPORT_SYMBOL(__memscan_zero)
0020 EXPORT_SYMBOL(__memscan_generic)
0021 __memscan_zero:
0022     /* %o0 = addr, %o1 = size */
0023     cmp %o1, 0
0024     bne,a   1f
0025      andcc  %o0, 3, %g0
0026 
0027     retl
0028      nop
0029 
0030 1:
0031     be  mzero_scan_word
0032      sethi  %hi(HI_MAGIC), %g2
0033 
0034     ldsb    [%o0], %g3
0035 mzero_still_not_word_aligned:
0036     cmp %g3, 0
0037     bne 1f
0038      add    %o0, 1, %o0
0039 
0040     retl
0041      sub    %o0, 1, %o0
0042 
0043 1:
0044     subcc   %o1, 1, %o1
0045     bne,a   1f
0046      andcc  %o0, 3, %g0
0047 
0048     retl
0049      nop
0050 
0051 1:
0052     bne,a   mzero_still_not_word_aligned
0053      ldsb   [%o0], %g3
0054 
0055     sethi   %hi(HI_MAGIC), %g2
0056 mzero_scan_word:
0057     or  %g2, %lo(HI_MAGIC), %o3
0058     sethi   %hi(LO_MAGIC), %g3
0059     or  %g3, %lo(LO_MAGIC), %o2
0060 mzero_next_word:
0061     ld  [%o0], %g2
0062 mzero_next_word_preloaded:
0063     sub %g2, %o2, %g2
0064 mzero_next_word_preloaded_next:
0065     andcc   %g2, %o3, %g0
0066     bne mzero_byte_zero
0067      add    %o0, 4, %o0
0068 
0069 mzero_check_out_of_fuel:
0070     subcc   %o1, 4, %o1
0071     bg,a    1f
0072      ld [%o0], %g2
0073 
0074     retl
0075      nop
0076 
0077 1:
0078     b   mzero_next_word_preloaded_next
0079      sub    %g2, %o2, %g2
0080 
0081     /* Check every byte. */
0082 mzero_byte_zero:
0083     ldsb    [%o0 - 4], %g2
0084     cmp %g2, 0
0085     bne mzero_byte_one
0086      sub    %o0, 4, %g3
0087 
0088     retl
0089      mov    %g3, %o0
0090 
0091 mzero_byte_one:
0092     ldsb    [%o0 - 3], %g2
0093     cmp %g2, 0
0094     bne,a   mzero_byte_two_and_three
0095      ldsb   [%o0 - 2], %g2
0096 
0097     retl
0098      sub    %o0, 3, %o0
0099 
0100 mzero_byte_two_and_three:
0101     cmp %g2, 0
0102     bne,a   1f
0103      ldsb   [%o0 - 1], %g2
0104 
0105     retl
0106      sub    %o0, 2, %o0
0107 
0108 1:
0109     cmp %g2, 0
0110     bne,a   mzero_next_word_preloaded
0111      ld [%o0], %g2
0112 
0113     retl
0114      sub    %o0, 1, %o0
0115 
0116 mzero_found_it:
0117     retl
0118      sub    %o0, 2, %o0
0119 
0120 memscan:
0121 __memscan_generic:
0122     /* %o0 = addr, %o1 = c, %o2 = size */
0123     cmp %o2, 0
0124     bne,a   0f
0125      ldub   [%o0], %g2
0126 
0127     b,a 2f
0128 1:
0129     ldub    [%o0], %g2
0130 0:
0131     cmp %g2, %o1
0132     be  2f
0133      addcc  %o2, -1, %o2
0134     bne 1b
0135      add    %o0, 1, %o0
0136 2:
0137     retl
0138      nop