* eina_fp: Fix rounding with Eina_F32p32 multiplaction, add

operation to multiply a FP with an int.


SVN revision: 44238
This commit is contained in:
Cedric BAIL 2009-12-07 09:27:53 +00:00
parent 254915c86e
commit 5a5d81812c
5 changed files with 35 additions and 2 deletions

View File

@ -38,6 +38,7 @@ static inline double eina_f32p32_double_to(Eina_F32p32 v);
static inline Eina_F32p32 eina_f32p32_add(Eina_F32p32 a, Eina_F32p32 b);
static inline Eina_F32p32 eina_f32p32_sub(Eina_F32p32 a, Eina_F32p32 b);
static inline Eina_F32p32 eina_f32p32_mul(Eina_F32p32 a, Eina_F32p32 b);
static inline Eina_F32p32 eina_f32p32_scale(Eina_F32p32 a, int b);
static inline Eina_F32p32 eina_f32p32_div(Eina_F32p32 a, Eina_F32p32 b);
static inline Eina_F32p32 eina_f32p32_sqrt(Eina_F32p32 a);
static inline unsigned int eina_f32p32_fracc_get(Eina_F32p32 v);
@ -50,6 +51,7 @@ static inline float eina_f16p16_float_to(Eina_F16p16 v);
static inline Eina_F16p16 eina_f16p16_add(Eina_F16p16 a, Eina_F16p16 b);
static inline Eina_F16p16 eina_f16p16_sub(Eina_F16p16 a, Eina_F16p16 b);
static inline Eina_F16p16 eina_f16p16_mul(Eina_F16p16 a, Eina_F16p16 b);
static inline Eina_F16p16 eina_f16p16_scale(Eina_F16p16 a, int b);
static inline Eina_F16p16 eina_f16p16_div(Eina_F16p16 a, Eina_F16p16 b);
static inline Eina_F16p16 eina_f16p16_sqrt(Eina_F16p16 a);
static inline unsigned int eina_f16p16_fracc_get(Eina_F16p16 v);
@ -62,6 +64,7 @@ static inline float eina_f8p24_float_to(Eina_F8p24 v);
static inline Eina_F8p24 eina_f8p24_add(Eina_F8p24 a, Eina_F8p24 b);
static inline Eina_F8p24 eina_f8p24_sub(Eina_F8p24 a, Eina_F8p24 b);
static inline Eina_F8p24 eina_f8p24_mul(Eina_F8p24 a, Eina_F8p24 b);
static inline Eina_F8p24 eina_f8p24_scale(Eina_F8p24 a, int b);
static inline Eina_F8p24 eina_f8p24_div(Eina_F8p24 a, Eina_F8p24 b);
static inline Eina_F8p24 eina_f8p24_sqrt(Eina_F8p24 a);
static inline unsigned int eina_f8p24_fracc_get(Eina_F8p24 v);

View File

@ -38,6 +38,12 @@ eina_f16p16_mul(Eina_F16p16 a, Eina_F16p16 b)
return ((int64_t)a * (int64_t)b) >> 16;
}
static inline Eina_F16p16
eina_f16p16_scale(Eina_F16p16 a, int b)
{
return a * b;
}
static inline Eina_F16p16
eina_f16p16_div(Eina_F16p16 a, Eina_F16p16 b)
{

View File

@ -34,7 +34,25 @@ eina_f32p32_sub(Eina_F32p32 a, Eina_F32p32 b)
static inline Eina_F32p32
eina_f32p32_mul(Eina_F32p32 a, Eina_F32p32 b)
{
return (a * b) >> 32;
/* Prevent overflow and do '(a * b) >> 32' */
/* f32p32 * f32p32 = f64p64 */
/* f16p16 * f16p16 = f32p32 */
Eina_F32p32 up;
Eina_F32p32 down;
Eina_F32p32 result;
up = (a >> 16) * (b >> 16);
down = (a & 0xFFFF) * (b & 0xFFFF);
result = up + (down >> 32);
return result;
}
static inline Eina_F32p32
eina_f32p32_scale(Eina_F32p32 a, int b)
{
return a * b;
}
static inline Eina_F32p32

View File

@ -38,6 +38,12 @@ eina_f8p24_mul(Eina_F8p24 a, Eina_F8p24 b)
return ((int64_t) a * (int64_t) b) >> 24;
}
static inline Eina_F8p24
eina_f8p24_scale(Eina_F8p24 a, int b)
{
return a * b;
}
static inline Eina_F8p24
eina_f8p24_div(Eina_F8p24 a, Eina_F8p24 b)
{

View File

@ -23,7 +23,7 @@
static inline Eina_F32p32
eina_f32p32_int_from(int32_t v)
{
return (Eina_F32p32) v << 32;
return (Eina_F32p32)(v) << 32;
}
static inline int32_t