drm/amd/display: simplify dml log2 function

Current implementation is slightly inaccurate and will often
result in truncation/floor operation decrementing an exact
integer output by 1.

Only rounded down output is ever expected, just extract the fp
exponent for this to increase performance and avoid any
truncation issues.

Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Reviewed-by: Eric Bernstein <Eric.Bernstein@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Dmytro Laktyushkin 2020-05-11 10:33:58 -04:00 committed by Alex Deucher
parent 0023b7eec0
commit b236e048ec
1 changed files with 13 additions and 7 deletions

View File

@ -86,9 +86,20 @@ static inline double dml_round(double a)
return floor;
}
static inline double dml_log2(double x)
/* float
static inline int dml_log2(float x)
{
return (double) dcn_bw_log(x, 2);
unsigned int ix = *((unsigned int *)&x);
return (int)((ix >> 23) & 0xff) - 127;
}*/
/* double */
static inline int dml_log2(double x)
{
unsigned long long ix = *((unsigned long long *)&x);
return (int)((ix >> 52) & 0x7ff) - 1023;
}
static inline double dml_pow(double a, int exp)
@ -116,11 +127,6 @@ static inline double dml_floor_ex(double x, double granularity)
return (double) dcn_bw_floor2(x, granularity);
}
static inline double dml_log(double x, double base)
{
return (double) dcn_bw_log(x, base);
}
static inline unsigned int dml_round_to_multiple(unsigned int num,
unsigned int multiple,
unsigned char up)