Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* bzero.S: Simple prefetching memset, bzero, and clear_user
0003  *          implementations.
0004  *
0005  * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
0006  */
0007 
0008 #include <linux/linkage.h>
0009 #include <asm/export.h>
0010 
0011     .text
0012 
0013 ENTRY(memset) /* %o0=buf, %o1=pat, %o2=len */
0014     and     %o1, 0xff, %o3
0015     mov     %o2, %o1
0016     sllx        %o3, 8, %g1
0017     or      %g1, %o3, %o2
0018     sllx        %o2, 16, %g1
0019     or      %g1, %o2, %o2
0020     sllx        %o2, 32, %g1
0021     ba,pt       %xcc, 1f
0022      or     %g1, %o2, %o2
0023 
0024 ENTRY(__bzero) /* %o0=buf, %o1=len */
0025     clr     %o2
0026 1:  mov     %o0, %o3
0027     brz,pn      %o1, __bzero_done
0028      cmp        %o1, 16
0029     bl,pn       %icc, __bzero_tiny
0030      prefetch   [%o0 + 0x000], #n_writes
0031     andcc       %o0, 0x3, %g0
0032     be,pt       %icc, 2f
0033 1:   stb        %o2, [%o0 + 0x00]
0034     add     %o0, 1, %o0
0035     andcc       %o0, 0x3, %g0
0036     bne,pn      %icc, 1b
0037      sub        %o1, 1, %o1
0038 2:  andcc       %o0, 0x7, %g0
0039     be,pt       %icc, 3f
0040      stw        %o2, [%o0 + 0x00]
0041     sub     %o1, 4, %o1
0042     add     %o0, 4, %o0
0043 3:  and     %o1, 0x38, %g1
0044     cmp     %o1, 0x40
0045     andn        %o1, 0x3f, %o4
0046     bl,pn       %icc, 5f
0047      and        %o1, 0x7, %o1
0048     prefetch    [%o0 + 0x040], #n_writes
0049     prefetch    [%o0 + 0x080], #n_writes
0050     prefetch    [%o0 + 0x0c0], #n_writes
0051     prefetch    [%o0 + 0x100], #n_writes
0052     prefetch    [%o0 + 0x140], #n_writes
0053 4:  prefetch    [%o0 + 0x180], #n_writes
0054     stx     %o2, [%o0 + 0x00]
0055     stx     %o2, [%o0 + 0x08]
0056     stx     %o2, [%o0 + 0x10]
0057     stx     %o2, [%o0 + 0x18]
0058     stx     %o2, [%o0 + 0x20]
0059     stx     %o2, [%o0 + 0x28]
0060     stx     %o2, [%o0 + 0x30]
0061     stx     %o2, [%o0 + 0x38]
0062     subcc       %o4, 0x40, %o4
0063     bne,pt      %icc, 4b
0064      add        %o0, 0x40, %o0
0065     brz,pn      %g1, 6f
0066      nop
0067 5:  stx     %o2, [%o0 + 0x00]
0068     subcc       %g1, 8, %g1
0069     bne,pt      %icc, 5b
0070      add        %o0, 0x8, %o0
0071 6:  brz,pt      %o1, __bzero_done
0072      nop
0073 __bzero_tiny:
0074 1:  stb     %o2, [%o0 + 0x00]
0075     subcc       %o1, 1, %o1
0076     bne,pt      %icc, 1b
0077      add        %o0, 1, %o0
0078 __bzero_done:
0079     retl
0080      mov        %o3, %o0
0081 ENDPROC(__bzero)
0082 ENDPROC(memset)
0083 EXPORT_SYMBOL(__bzero)
0084 EXPORT_SYMBOL(memset)
0085 
0086 #define EX_ST(x,y)      \
0087 98: x,y;            \
0088     .section __ex_table,"a";\
0089     .align 4;       \
0090     .word 98b, __retl_o1;   \
0091     .text;          \
0092     .align 4;
0093 
0094 ENTRY(__clear_user) /* %o0=buf, %o1=len */
0095     brz,pn      %o1, __clear_user_done
0096      cmp        %o1, 16
0097     bl,pn       %icc, __clear_user_tiny
0098      EX_ST(prefetcha [%o0 + 0x00] %asi, #n_writes)
0099     andcc       %o0, 0x3, %g0
0100     be,pt       %icc, 2f
0101 1:   EX_ST(stba %g0, [%o0 + 0x00] %asi)
0102     add     %o0, 1, %o0
0103     andcc       %o0, 0x3, %g0
0104     bne,pn      %icc, 1b
0105      sub        %o1, 1, %o1
0106 2:  andcc       %o0, 0x7, %g0
0107     be,pt       %icc, 3f
0108      EX_ST(stwa %g0, [%o0 + 0x00] %asi)
0109     sub     %o1, 4, %o1
0110     add     %o0, 4, %o0
0111 3:  and     %o1, 0x38, %g1
0112     cmp     %o1, 0x40
0113     andn        %o1, 0x3f, %o4
0114     bl,pn       %icc, 5f
0115      and        %o1, 0x7, %o1
0116     EX_ST(prefetcha [%o0 + 0x040] %asi, #n_writes)
0117     EX_ST(prefetcha [%o0 + 0x080] %asi, #n_writes)
0118     EX_ST(prefetcha [%o0 + 0x0c0] %asi, #n_writes)
0119     EX_ST(prefetcha [%o0 + 0x100] %asi, #n_writes)
0120     EX_ST(prefetcha [%o0 + 0x140] %asi, #n_writes)
0121 4:  EX_ST(prefetcha [%o0 + 0x180] %asi, #n_writes)
0122     EX_ST(stxa  %g0, [%o0 + 0x00] %asi)
0123     EX_ST(stxa  %g0, [%o0 + 0x08] %asi)
0124     EX_ST(stxa  %g0, [%o0 + 0x10] %asi)
0125     EX_ST(stxa  %g0, [%o0 + 0x18] %asi)
0126     EX_ST(stxa  %g0, [%o0 + 0x20] %asi)
0127     EX_ST(stxa  %g0, [%o0 + 0x28] %asi)
0128     EX_ST(stxa  %g0, [%o0 + 0x30] %asi)
0129     EX_ST(stxa  %g0, [%o0 + 0x38] %asi)
0130     subcc       %o4, 0x40, %o4
0131     bne,pt      %icc, 4b
0132      add        %o0, 0x40, %o0
0133     brz,pn      %g1, 6f
0134      nop
0135 5:  EX_ST(stxa  %g0, [%o0 + 0x00] %asi)
0136     subcc       %g1, 8, %g1
0137     bne,pt      %icc, 5b
0138      add        %o0, 0x8, %o0
0139 6:  brz,pt      %o1, __clear_user_done
0140      nop
0141 __clear_user_tiny:
0142 1:  EX_ST(stba  %g0, [%o0 + 0x00] %asi)
0143     subcc       %o1, 1, %o1
0144     bne,pt      %icc, 1b
0145      add        %o0, 1, %o0
0146 __clear_user_done:
0147     retl
0148      clr        %o0
0149 ENDPROC(__clear_user)
0150 EXPORT_SYMBOL(__clear_user)