Skip to content

Commit

Permalink
drm: fix 64 bit drm fixed point helpers
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Alex Deucher committed Jul 30, 2013
1 parent 42a2182 commit a838834
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions include/drm/drm_fixed.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit a838834

Please sign in to comment.