0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/linkage.h>
0009 #include <asm/export.h>
0010
0011 .text
0012
0013 ENTRY(memset)
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)
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)
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)