^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * memscan.S: Optimized memscan for the Sparc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /* In essence, this is just a fancy strlen. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define LO_MAGIC 0x01010101
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define HI_MAGIC 0x80808080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) .globl __memscan_zero, __memscan_generic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .globl memscan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) EXPORT_SYMBOL(__memscan_zero)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) EXPORT_SYMBOL(__memscan_generic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) __memscan_zero:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) /* %o0 = addr, %o1 = size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) cmp %o1, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) bne,a 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) andcc %o0, 3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) be mzero_scan_word
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) sethi %hi(HI_MAGIC), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ldsb [%o0], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) mzero_still_not_word_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) cmp %g3, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) bne 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) sub %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) subcc %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) bne,a 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) andcc %o0, 3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) bne,a mzero_still_not_word_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ldsb [%o0], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) sethi %hi(HI_MAGIC), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) mzero_scan_word:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) or %g2, %lo(HI_MAGIC), %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) sethi %hi(LO_MAGIC), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) or %g3, %lo(LO_MAGIC), %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) mzero_next_word:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ld [%o0], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) mzero_next_word_preloaded:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) sub %g2, %o2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) mzero_next_word_preloaded_next:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) andcc %g2, %o3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) bne mzero_byte_zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) add %o0, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) mzero_check_out_of_fuel:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) subcc %o1, 4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) bg,a 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ld [%o0], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) b mzero_next_word_preloaded_next
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) sub %g2, %o2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* Check every byte. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) mzero_byte_zero:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ldsb [%o0 - 4], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) cmp %g2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) bne mzero_byte_one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) sub %o0, 4, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) mov %g3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) mzero_byte_one:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) ldsb [%o0 - 3], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) cmp %g2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) bne,a mzero_byte_two_and_three
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ldsb [%o0 - 2], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) sub %o0, 3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) mzero_byte_two_and_three:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) cmp %g2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) bne,a 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ldsb [%o0 - 1], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) sub %o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) cmp %g2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) bne,a mzero_next_word_preloaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ld [%o0], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) sub %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) mzero_found_it:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) sub %o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) memscan:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) __memscan_generic:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /* %o0 = addr, %o1 = c, %o2 = size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) cmp %o2, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) bne,a 0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) ldub [%o0], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) b,a 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) ldub [%o0], %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) cmp %g2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) be 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) addcc %o2, -1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) bne 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) nop