@@ -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