^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 Sparc64.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1997,1998 Jakub Jelinek (jj@ultra.linux.cz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 1998 David S. Miller (davem@redhat.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define HI_MAGIC 0x8080808080808080
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define LO_MAGIC 0x0101010101010101
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define ASI_PL 0x88
^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 32
^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) .type __memscan_zero,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .type __memscan_generic,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) .globl memscan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) EXPORT_SYMBOL(__memscan_zero)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) EXPORT_SYMBOL(__memscan_generic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) __memscan_zero:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) /* %o0 = bufp, %o1 = size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) brlez,pn %o1, szzero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) andcc %o0, 7, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) be,pt %icc, we_are_aligned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) sethi %hi(HI_MAGIC), %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ldub [%o0], %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 1: subcc %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) brz,pn %o5, 10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) be,pn %xcc, szzero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) andcc %o0, 7, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) bne,a,pn %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ldub [%o0], %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) we_are_aligned:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ldxa [%o0] ASI_PL, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) or %o4, %lo(HI_MAGIC), %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) sllx %o3, 32, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) or %o4, %o3, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) srlx %o3, 7, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) msloop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) sub %o1, 8, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) add %o0, 8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) sub %o5, %o2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) xor %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) andcc %o4, %o3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) bne,pn %xcc, check_bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) srlx %o4, 32, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) brgz,a,pt %o1, msloop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ldxa [%o0] ASI_PL, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) check_bytes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) bne,a,pn %icc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) andcc %o5, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) add %o0, -5, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ba,pt %xcc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) srlx %o5, 32, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) 2: srlx %o5, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) add %o0, -8, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) andcc %g7, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) srlx %g7, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) andcc %g7, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) srlx %g7, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) andcc %g7, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) srlx %g7, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) andcc %g3, %o3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) be,a,pn %icc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) mov %o0, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) 3: andcc %g7, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) srlx %g7, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) andcc %g7, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) srlx %g7, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) andcc %g7, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) srlx %g7, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) andcc %g7, 0xff, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) srlx %g7, 8, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) be,pn %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 2: brgz,a,pt %o1, msloop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ldxa [%o0] ASI_PL, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) inc %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 1: add %o0, %o1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) cmp %g2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) movle %xcc, %g2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 10: retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) sub %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) szzero: retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) memscan:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) __memscan_generic:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) /* %o0 = addr, %o1 = c, %o2 = size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) brz,pn %o2, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) add %o0, %o2, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ldub [%o0], %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) sub %g0, %o2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) cmp %o5, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) be,pn %icc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) addcc %o4, 1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) bne,a,pt %xcc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ldub [%o3 + %o4], %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /* The delay slot is the same as the next insn, this is just to make it look more awful */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) add %o3, %o4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) sub %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) nop