diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2013-07-30 16:43:55 -0400 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2013-07-30 17:24:13 -0400 | 
| commit | a838834b2f7cbc09b6319a1fc332c03e4d665b20 (patch) | |
| tree | 548865f29964a44d9f62b51f88586832e58aba08 /include | |
| parent | 42a21826dc54583cdb79cc8477732e911ac9c376 (diff) | |
| download | linux-a838834b2f7cbc09b6319a1fc332c03e4d665b20.tar.bz2 | |
drm: fix 64 bit drm fixed point helpers
Sign bit wasn't handled properly and a small typo.
Thanks to Christian for helping me sort this out.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/drm/drm_fixed.h | 14 | 
1 files changed, 7 insertions, 7 deletions
| diff --git a/include/drm/drm_fixed.h b/include/drm/drm_fixed.h index f5e1168c7647..d639049a613d 100644 --- a/include/drm/drm_fixed.h +++ b/include/drm/drm_fixed.h @@ -84,12 +84,12 @@ static inline int drm_fixp2int(int64_t a)  	return ((s64)a) >> DRM_FIXED_POINT;  } -static inline s64 drm_fixp_msbset(int64_t a) +static inline unsigned drm_fixp_msbset(int64_t a)  {  	unsigned shift, sign = (a >> 63) & 1;  	for (shift = 62; shift > 0; --shift) -		if ((a >> shift) != sign) +		if (((a >> shift) & 1) != sign)  			return shift;  	return 0; @@ -100,9 +100,9 @@ static inline s64 drm_fixp_mul(s64 a, s64 b)  	unsigned shift = drm_fixp_msbset(a) + drm_fixp_msbset(b);  	s64 result; -	if (shift > 63) { -		shift = shift - 63; -		a >>= shift >> 1; +	if (shift > 61) { +		shift = shift - 61; +		a >>= (shift >> 1) + (shift & 1);  		b >>= shift >> 1;  	} else  		shift = 0; @@ -120,7 +120,7 @@ static inline s64 drm_fixp_mul(s64 a, s64 b)  static inline s64 drm_fixp_div(s64 a, s64 b)  { -	unsigned shift = 63 - drm_fixp_msbset(a); +	unsigned shift = 62 - drm_fixp_msbset(a);  	s64 result;  	a <<= shift; @@ -154,7 +154,7 @@ static inline s64 drm_fixp_exp(s64 x)  	}  	if (x < 0) -		sum = drm_fixp_div(1, sum); +		sum = drm_fixp_div(DRM_FIXED_ONE, sum);  	return sum;  } |