Replace constant expressions that contain multiplications by

fractional floating point values with integer divides.  This will
eliminate any chance that the compiler will generate code to evaluate
the expression using floating point at runtime.

Suggested by:	bde
Submitted by:	Rasool Al-Saadi <ralsaadi@swin.edu.au>
MFC after:	8 days (with r300779 and r300949)
This commit is contained in:
Don Lewis 2016-06-01 20:04:24 +00:00
parent dc3be4f872
commit d673654796
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=301162
3 changed files with 30 additions and 28 deletions

View File

@ -244,20 +244,20 @@ calculate_drop_prob(void *x)
p *= (PIE_MAX_PROB << 12) / AQM_TIME_1S;
/* auto-tune drop probability */
if (prob < (int64_t)(PIE_MAX_PROB * 0.000001))
p >>= 11 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.00001))
p >>= 9 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.0001))
p >>= 7 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.001))
p >>= 5 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.01))
p >>= 3 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.1))
p >>= 1 + PIE_FIX_POINT_BITS+12;
if (prob < (PIE_MAX_PROB / 1000000)) /* 0.000001 */
p >>= 11 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 100000)) /* 0.00001 */
p >>= 9 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 10000)) /* 0.0001 */
p >>= 7 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 1000)) /* 0.001 */
p >>= 5 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 100)) /* 0.01 */
p >>= 3 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 10)) /* 0.1 */
p >>= 1 + PIE_FIX_POINT_BITS + 12;
else
p >>= PIE_FIX_POINT_BITS+12;
p >>= PIE_FIX_POINT_BITS + 12;
oldprob = prob;

View File

@ -132,11 +132,13 @@ drop_early(struct pie_status *pst, uint32_t qlen)
* if accu_prob < 0.85 -> enqueue
* if accu_prob>8.5 ->drop
* between 0.85 and 8.5 || !De-randomize --> drop on prob
*
* (0.85 = 17/20 ,8.5 = 17/2)
*/
if (pprms->flags & PIE_DERAND_ENABLED) {
if(pst->accu_prob < (uint64_t) (PIE_MAX_PROB * 0.85))
if(pst->accu_prob < (uint64_t) (PIE_MAX_PROB * 17 / 20))
return ENQUE;
if( pst->accu_prob >= (uint64_t) (PIE_MAX_PROB * 8.5))
if( pst->accu_prob >= (uint64_t) (PIE_MAX_PROB * 17 / 2))
return DROP;
}

View File

@ -407,20 +407,20 @@ fq_calculate_drop_prob(void *x)
p *= (PIE_MAX_PROB << 12) / AQM_TIME_1S;
/* auto-tune drop probability */
if (prob < (int64_t)(PIE_MAX_PROB * 0.000001))
p >>= 11 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.00001))
p >>= 9 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.0001))
p >>= 7 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.001))
p >>= 5 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.01))
p >>= 3 + PIE_FIX_POINT_BITS+12;
else if (prob < (int64_t)(PIE_MAX_PROB * 0.1))
p >>= 1 + PIE_FIX_POINT_BITS+12;
if (prob < (PIE_MAX_PROB / 1000000)) /* 0.000001 */
p >>= 11 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 100000)) /* 0.00001 */
p >>= 9 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 10000)) /* 0.0001 */
p >>= 7 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 1000)) /* 0.001 */
p >>= 5 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 100)) /* 0.01 */
p >>= 3 + PIE_FIX_POINT_BITS + 12;
else if (prob < (PIE_MAX_PROB / 10)) /* 0.1 */
p >>= 1 + PIE_FIX_POINT_BITS + 12;
else
p >>= PIE_FIX_POINT_BITS+12;
p >>= PIE_FIX_POINT_BITS + 12;
oldprob = prob;