^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) /* bzero.S: Simple prefetching memset, bzero, and clear_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * implementations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
^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 <linux/linkage.h>
^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) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) and %o1, 0xff, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) mov %o2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) sllx %o3, 8, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) or %g1, %o3, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) sllx %o2, 16, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) or %g1, %o2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) sllx %o2, 32, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) ba,pt %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) or %g1, %o2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ENTRY(__bzero) /* %o0=buf, %o1=len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) clr %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 1: mov %o0, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) brz,pn %o1, __bzero_done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) cmp %o1, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) bl,pn %icc, __bzero_tiny
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) prefetch [%o0 + 0x000], #n_writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) andcc %o0, 0x3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) be,pt %icc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) 1: stb %o2, [%o0 + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) andcc %o0, 0x3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) bne,pn %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) sub %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 2: andcc %o0, 0x7, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) be,pt %icc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) stw %o2, [%o0 + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) sub %o1, 4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) add %o0, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 3: and %o1, 0x38, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) cmp %o1, 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) andn %o1, 0x3f, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) bl,pn %icc, 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) and %o1, 0x7, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) prefetch [%o0 + 0x040], #n_writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) prefetch [%o0 + 0x080], #n_writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) prefetch [%o0 + 0x0c0], #n_writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) prefetch [%o0 + 0x100], #n_writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) prefetch [%o0 + 0x140], #n_writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 4: prefetch [%o0 + 0x180], #n_writes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) stx %o2, [%o0 + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) stx %o2, [%o0 + 0x08]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) stx %o2, [%o0 + 0x10]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) stx %o2, [%o0 + 0x18]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) stx %o2, [%o0 + 0x20]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) stx %o2, [%o0 + 0x28]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) stx %o2, [%o0 + 0x30]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) stx %o2, [%o0 + 0x38]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) subcc %o4, 0x40, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) bne,pt %icc, 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) add %o0, 0x40, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) brz,pn %g1, 6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 5: stx %o2, [%o0 + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) subcc %g1, 8, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) bne,pt %icc, 5b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) add %o0, 0x8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 6: brz,pt %o1, __bzero_done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) __bzero_tiny:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) 1: stb %o2, [%o0 + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) subcc %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) bne,pt %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) __bzero_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) mov %o3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) ENDPROC(__bzero)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) ENDPROC(memset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) EXPORT_SYMBOL(__bzero)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) EXPORT_SYMBOL(memset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define EX_ST(x,y) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) 98: x,y; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .section __ex_table,"a";\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .align 4; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .word 98b, __retl_o1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .text; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .align 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) ENTRY(__clear_user) /* %o0=buf, %o1=len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) brz,pn %o1, __clear_user_done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) cmp %o1, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) bl,pn %icc, __clear_user_tiny
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) andcc %o0, 0x3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) be,pt %icc, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 1: EX_ST(stba %g0, [%o0 + 0x00] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) andcc %o0, 0x3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) bne,pn %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) sub %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 2: andcc %o0, 0x7, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) be,pt %icc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) EX_ST(stwa %g0, [%o0 + 0x00] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) sub %o1, 4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) add %o0, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 3: and %o1, 0x38, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) cmp %o1, 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) andn %o1, 0x3f, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) bl,pn %icc, 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) and %o1, 0x7, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) EX_ST(prefetcha [%o0 + 0x040] %asi, #n_writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) EX_ST(prefetcha [%o0 + 0x080] %asi, #n_writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) EX_ST(prefetcha [%o0 + 0x0c0] %asi, #n_writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) EX_ST(prefetcha [%o0 + 0x100] %asi, #n_writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) EX_ST(prefetcha [%o0 + 0x140] %asi, #n_writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 4: EX_ST(prefetcha [%o0 + 0x180] %asi, #n_writes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) EX_ST(stxa %g0, [%o0 + 0x00] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) EX_ST(stxa %g0, [%o0 + 0x08] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) EX_ST(stxa %g0, [%o0 + 0x10] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) EX_ST(stxa %g0, [%o0 + 0x18] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) EX_ST(stxa %g0, [%o0 + 0x20] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) EX_ST(stxa %g0, [%o0 + 0x28] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) EX_ST(stxa %g0, [%o0 + 0x30] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) EX_ST(stxa %g0, [%o0 + 0x38] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) subcc %o4, 0x40, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) bne,pt %icc, 4b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) add %o0, 0x40, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) brz,pn %g1, 6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 5: EX_ST(stxa %g0, [%o0 + 0x00] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) subcc %g1, 8, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) bne,pt %icc, 5b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) add %o0, 0x8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 6: brz,pt %o1, __clear_user_done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) __clear_user_tiny:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 1: EX_ST(stba %g0, [%o0 + 0x00] %asi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) subcc %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) bne,pt %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) __clear_user_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) clr %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) ENDPROC(__clear_user)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) EXPORT_SYMBOL(__clear_user)