diff options
Diffstat (limited to 'arch/mips/lib/memset.S')
-rw-r--r-- | arch/mips/lib/memset.S | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/arch/mips/lib/memset.S b/arch/mips/lib/memset.S index c8fe6b1968fb..b8e63fd00375 100644 --- a/arch/mips/lib/memset.S +++ b/arch/mips/lib/memset.S | |||
@@ -111,6 +111,7 @@ | |||
111 | .set at | 111 | .set at |
112 | #endif | 112 | #endif |
113 | 113 | ||
114 | #ifndef CONFIG_CPU_MIPSR6 | ||
114 | R10KCBARRIER(0(ra)) | 115 | R10KCBARRIER(0(ra)) |
115 | #ifdef __MIPSEB__ | 116 | #ifdef __MIPSEB__ |
116 | EX(LONG_S_L, a1, (a0), .Lfirst_fixup\@) /* make word/dword aligned */ | 117 | EX(LONG_S_L, a1, (a0), .Lfirst_fixup\@) /* make word/dword aligned */ |
@@ -120,6 +121,30 @@ | |||
120 | PTR_SUBU a0, t0 /* long align ptr */ | 121 | PTR_SUBU a0, t0 /* long align ptr */ |
121 | PTR_ADDU a2, t0 /* correct size */ | 122 | PTR_ADDU a2, t0 /* correct size */ |
122 | 123 | ||
124 | #else /* CONFIG_CPU_MIPSR6 */ | ||
125 | #define STORE_BYTE(N) \ | ||
126 | EX(sb, a1, N(a0), .Lbyte_fixup\@); \ | ||
127 | beqz t0, 0f; \ | ||
128 | PTR_ADDU t0, 1; | ||
129 | |||
130 | PTR_ADDU a2, t0 /* correct size */ | ||
131 | PTR_ADDU t0, 1 | ||
132 | STORE_BYTE(0) | ||
133 | STORE_BYTE(1) | ||
134 | #if LONGSIZE == 4 | ||
135 | EX(sb, a1, 2(a0), .Lbyte_fixup\@) | ||
136 | #else | ||
137 | STORE_BYTE(2) | ||
138 | STORE_BYTE(3) | ||
139 | STORE_BYTE(4) | ||
140 | STORE_BYTE(5) | ||
141 | EX(sb, a1, 6(a0), .Lbyte_fixup\@) | ||
142 | #endif | ||
143 | 0: | ||
144 | ori a0, STORMASK | ||
145 | xori a0, STORMASK | ||
146 | PTR_ADDIU a0, STORSIZE | ||
147 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
123 | 1: ori t1, a2, 0x3f /* # of full blocks */ | 148 | 1: ori t1, a2, 0x3f /* # of full blocks */ |
124 | xori t1, 0x3f | 149 | xori t1, 0x3f |
125 | beqz t1, .Lmemset_partial\@ /* no block to fill */ | 150 | beqz t1, .Lmemset_partial\@ /* no block to fill */ |
@@ -159,6 +184,7 @@ | |||
159 | andi a2, STORMASK /* At most one long to go */ | 184 | andi a2, STORMASK /* At most one long to go */ |
160 | 185 | ||
161 | beqz a2, 1f | 186 | beqz a2, 1f |
187 | #ifndef CONFIG_CPU_MIPSR6 | ||
162 | PTR_ADDU a0, a2 /* What's left */ | 188 | PTR_ADDU a0, a2 /* What's left */ |
163 | R10KCBARRIER(0(ra)) | 189 | R10KCBARRIER(0(ra)) |
164 | #ifdef __MIPSEB__ | 190 | #ifdef __MIPSEB__ |
@@ -166,6 +192,22 @@ | |||
166 | #else | 192 | #else |
167 | EX(LONG_S_L, a1, -1(a0), .Llast_fixup\@) | 193 | EX(LONG_S_L, a1, -1(a0), .Llast_fixup\@) |
168 | #endif | 194 | #endif |
195 | #else | ||
196 | PTR_SUBU t0, $0, a2 | ||
197 | PTR_ADDIU t0, 1 | ||
198 | STORE_BYTE(0) | ||
199 | STORE_BYTE(1) | ||
200 | #if LONGSIZE == 4 | ||
201 | EX(sb, a1, 2(a0), .Lbyte_fixup\@) | ||
202 | #else | ||
203 | STORE_BYTE(2) | ||
204 | STORE_BYTE(3) | ||
205 | STORE_BYTE(4) | ||
206 | STORE_BYTE(5) | ||
207 | EX(sb, a1, 6(a0), .Lbyte_fixup\@) | ||
208 | #endif | ||
209 | 0: | ||
210 | #endif | ||
169 | 1: jr ra | 211 | 1: jr ra |
170 | move a2, zero | 212 | move a2, zero |
171 | 213 | ||
@@ -186,6 +228,11 @@ | |||
186 | .hidden __memset | 228 | .hidden __memset |
187 | .endif | 229 | .endif |
188 | 230 | ||
231 | .Lbyte_fixup\@: | ||
232 | PTR_SUBU a2, $0, t0 | ||
233 | jr ra | ||
234 | PTR_ADDIU a2, 1 | ||
235 | |||
189 | .Lfirst_fixup\@: | 236 | .Lfirst_fixup\@: |
190 | jr ra | 237 | jr ra |
191 | nop | 238 | nop |