Skip to content

Commit b348cb5

Browse files
committed
stress-zlib: replace 32 bit math with 16 bit for ascii digits generator
Split the two rounds of 4 ascii digits into calls to a helper that performs the ascii-ification using 16 bit integers with a fast division based on a 32 bit multiply and shift. Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
1 parent 5611d7a commit b348cb5

1 file changed

Lines changed: 50 additions & 50 deletions

File tree

stress-zlib.c

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -326,27 +326,67 @@ static void TARGET_CLONES stress_rand_data_01(
326326
}
327327
}
328328

329-
static inline uint32_t mul10(const uint32_t n)
329+
/*
330+
* mul10()
331+
* fast unsigned 16 bit multiply by 10
332+
*/
333+
static inline ALWAYS_INLINE uint16_t mul10(register const uint16_t n)
330334
{
331335
return (n << 3) + (n << 1);
332336
}
333337

334-
static inline uint32_t div10(const uint32_t n)
338+
/*
339+
* div10()
340+
* fast unsigned 16 bit division by 10
341+
*/
342+
static inline ALWAYS_INLINE uint16_t div10(register const uint16_t n)
335343
{
336-
#if 0
337-
uint64_t n64 = (uint64_t)n * 28147497671066;
338-
339-
return (uint32_t)(n64 >> 48);
344+
#if 1
345+
/* return (uint16_t)(((uint32_t)n * (0x1999b800 >> 13)) >> 19); */
346+
return (uint16_t)(((uint32_t)n * (0xcccd)) >> 19);
340347
#else
341348
return n / 10;
342349
#endif
343350
}
344351

352+
/*
353+
* stress_rand_data_digits_4()
354+
* generate 4 ASCII digits from a uint16_t value
355+
*/
356+
static inline uint8_t ALWAYS_INLINE *stress_rand_data_digits_4(
357+
register uint16_t v,
358+
register uint8_t *ptr)
359+
{
360+
register uint16_t r;
361+
register uint16_t v10th;
362+
363+
v10th = div10(v);
364+
r = v - mul10(v10th);
365+
*(ptr++) = (uint8_t)(r + '0');
366+
367+
v = v10th;
368+
v10th = div10(v);
369+
r = v - mul10(v10th);
370+
*(ptr++) = (uint8_t)(r + '0');
371+
372+
v = v10th;
373+
v10th = div10(v);
374+
r = v - mul10(v10th);
375+
*(ptr++) = (uint8_t)(r + '0');
376+
377+
v = v10th;
378+
v10th = div10(v);
379+
r = v - mul10(v10th);
380+
*(ptr++) = (uint8_t)(r + '0');
381+
382+
return ptr;
383+
}
384+
345385
/*
346386
* stress_rand_data_digits()
347387
* fill buffer with random ASCII '0' .. '9'
348388
*/
349-
static void stress_rand_data_digits(
389+
static void OPTIMIZE3 stress_rand_data_digits(
350390
stress_args_t *args,
351391
uint64_t *RESTRICT data,
352392
uint64_t *RESTRICT data_end)
@@ -357,50 +397,10 @@ static void stress_rand_data_digits(
357397
(void)args;
358398

359399
while (ptr < end) {
360-
register uint32_t v10th;
361-
register uint32_t r;
362-
register uint32_t v;
363-
register uint32_t rnd = stress_mwc32();
400+
register const uint32_t rnd = stress_mwc32();
364401

365-
v = rnd & 0xffff;
366-
v10th = div10(v);
367-
r = v - mul10(v10th);
368-
*(ptr++) = (uint8_t)(r + '0');
369-
370-
v = v10th;
371-
v10th = div10(v);
372-
r = v - mul10(v10th);
373-
*(ptr++) = (uint8_t)(r + '0');
374-
375-
v = v10th;
376-
v10th = div10(v);
377-
r = v - mul10(v10th);
378-
*(ptr++) = (uint8_t)(r + '0');
379-
380-
v = v10th;
381-
v10th = div10(v);
382-
r = v - mul10(v10th);
383-
*(ptr++) = (uint8_t)(r + '0');
384-
385-
v = rnd >> 16;
386-
v10th = div10(v);
387-
r = v - mul10(v10th);
388-
*(ptr++) = (uint8_t)(r + '0');
389-
390-
v = v10th;
391-
v10th = div10(v);
392-
r = v - mul10(v10th);
393-
*(ptr++) = (uint8_t)(r + '0');
394-
395-
v = v10th;
396-
v10th = div10(v);
397-
r = v - mul10(v10th);
398-
*(ptr++) = (uint8_t)(r + '0');
399-
400-
v = v10th;
401-
v10th = div10(v);
402-
r = v - mul10(v10th);
403-
*(ptr++) = (uint8_t)(r + '0');
402+
ptr = stress_rand_data_digits_4((uint16_t)(rnd & 0xffff), ptr);
403+
ptr = stress_rand_data_digits_4((uint16_t)(rnd >> 16), ptr);
404404
}
405405
}
406406

0 commit comments

Comments
 (0)