@@ -201,17 +201,17 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st
201
201
} else {
202
202
// fill head and tail with minimal branching
203
203
if ( ! n ) return ;
204
+ let dend = dest + n - 4 ;
204
205
store < u8 > ( dest , c ) ;
205
- store < u8 > ( dest + n - 1 , c ) ;
206
+ store < u8 > ( dend , c , 3 ) ;
206
207
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 ) ;
212
212
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 ) ;
215
215
if ( n <= 8 ) return ;
216
216
217
217
// 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
223
223
let c32 : u32 = < u32 > - 1 / 255 * c ;
224
224
225
225
// fill head/tail up to 28 bytes each in preparation
226
+ dend = dest + n - 28 ;
226
227
store < u32 > ( dest , c32 ) ;
227
- store < u32 > ( dest + n - 4 , c32 ) ;
228
+ store < u32 > ( dend , c32 , 24 ) ;
228
229
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 ) ;
233
234
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 ) ;
242
243
243
244
// align to a multiple of 8
244
245
k = 24 + ( dest & 4 ) ;
@@ -249,9 +250,9 @@ export function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/st
249
250
let c64 : u64 = < u64 > c32 | ( < u64 > c32 << 32 ) ;
250
251
while ( n >= 32 ) {
251
252
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 ) ;
255
256
n -= 32 ;
256
257
dest += 32 ;
257
258
}
0 commit comments