0001
0002
0003
0004
0005
0006
0007
0008 #include <asm/export.h>
0009
0010
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
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
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
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