@@ -201,17 +201,17 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st
201201 } else {
202202 // fill head and tail with minimal branching
203203 if ( ! n ) return ;
204+ let dend = dest + n - 4 ;
204205 store < u8 > ( dest , c ) ;
205- store < u8 > ( dest + n - 1 , c ) ;
206+ store < u8 > ( dend , c , 3 ) ;
206207 if ( n <= 2 ) return ;
207-
208- store < u8 > ( dest + 1 , c ) ;
209- store < u8 > ( dest + 2 , c ) ;
210- store < u8 > ( dest + n - 2 , c ) ;
211- store < u8 > ( dest + n - 3 , c ) ;
208+ store < u8 > ( dest , c , 1 ) ;
209+ store < u8 > ( dest , c , 2 ) ;
210+ store < u8 > ( dend , c , 2 ) ;
211+ store < u8 > ( dend , c , 1 ) ;
212212 if ( n <= 6 ) return ;
213- store < u8 > ( dest + 3 , c ) ;
214- store < u8 > ( dest + n - 4 , c ) ;
213+ store < u8 > ( dest , c , 3 ) ;
214+ store < u8 > ( dend , c ) ;
215215 if ( n <= 8 ) return ;
216216
217217 // advance pointer to align it at 4-byte boundary
@@ -223,22 +223,23 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st
223223 let c32 : u32 = < u32 > - 1 / 255 * c ;
224224
225225 // fill head/tail up to 28 bytes each in preparation
226+ dend = dest + n - 28 ;
226227 store < u32 > ( dest , c32 ) ;
227- store < u32 > ( dest + n - 4 , c32 ) ;
228+ store < u32 > ( dend , c32 , 24 ) ;
228229 if ( n <= 8 ) return ;
229- store < u32 > ( dest + 4 , c32 ) ;
230- store < u32 > ( dest + 8 , c32 ) ;
231- store < u32 > ( dest + n - 12 , c32 ) ;
232- store < u32 > ( dest + n - 8 , c32 ) ;
230+ store < u32 > ( dest , c32 , 4 ) ;
231+ store < u32 > ( dest , c32 , 8 ) ;
232+ store < u32 > ( dend , c32 , 16 ) ;
233+ store < u32 > ( dend , c32 , 20 ) ;
233234 if ( n <= 24 ) return ;
234- store < u32 > ( dest + 12 , c32 ) ;
235- store < u32 > ( dest + 16 , c32 ) ;
236- store < u32 > ( dest + 20 , c32 ) ;
237- store < u32 > ( dest + 24 , c32 ) ;
238- store < u32 > ( dest + n - 28 , c32 ) ;
239- store < u32 > ( dest + n - 24 , c32 ) ;
240- store < u32 > ( dest + n - 20 , c32 ) ;
241- store < u32 > ( dest + n - 16 , c32 ) ;
235+ store < u32 > ( dest , c32 , 12 ) ;
236+ store < u32 > ( dest , c32 , 16 ) ;
237+ store < u32 > ( dest , c32 , 20 ) ;
238+ store < u32 > ( dest , c32 , 24 ) ;
239+ store < u32 > ( dend , c32 ) ;
240+ store < u32 > ( dend , c32 , 4 ) ;
241+ store < u32 > ( dend , c32 , 8 ) ;
242+ store < u32 > ( dend , c32 , 12 ) ;
242243
243244 // align to a multiple of 8
244245 k = 24 + ( dest & 4 ) ;
@@ -249,9 +250,9 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st
249250 let c64 : u64 = < u64 > c32 | ( < u64 > c32 << 32 ) ;
250251 while ( n >= 32 ) {
251252 store < u64 > ( dest , c64 ) ;
252- store < u64 > ( dest + 8 , c64 ) ;
253- store < u64 > ( dest + 16 , c64 ) ;
254- store < u64 > ( dest + 24 , c64 ) ;
253+ store < u64 > ( dest , c64 , 8 ) ;
254+ store < u64 > ( dest , c64 , 16 ) ;
255+ store < u64 > ( dest , c64 , 24 ) ;
255256 n -= 32 ;
256257 dest += 32 ;
257258 }
0 commit comments