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