From d81bbb46e2b2b580cb4ad8b2ef6487a6ca4ad437 Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 7 Dec 2009 09:27:53 +0000 Subject: [PATCH] * eina_fp: Fix rounding with Eina_F32p32 multiplaction, add operation to multiply a FP with an int. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/eina@44238 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/include/eina_fp.h | 3 +++ src/include/eina_inline_f16p16.x | 6 ++++++ src/include/eina_inline_f32p32.x | 20 +++++++++++++++++++- src/include/eina_inline_f8p24.x | 6 ++++++ src/include/eina_inline_fp.x | 2 +- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/include/eina_fp.h b/src/include/eina_fp.h index a488dfe..bd1404d 100644 --- a/src/include/eina_fp.h +++ b/src/include/eina_fp.h @@ -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); diff --git a/src/include/eina_inline_f16p16.x b/src/include/eina_inline_f16p16.x index f62a3c8..f7420ba 100644 --- a/src/include/eina_inline_f16p16.x +++ b/src/include/eina_inline_f16p16.x @@ -39,6 +39,12 @@ eina_f16p16_mul(Eina_F16p16 a, Eina_F16p16 b) } 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) { return (Eina_F16p16) ((((int64_t) a) << 16) / (int64_t) b); diff --git a/src/include/eina_inline_f32p32.x b/src/include/eina_inline_f32p32.x index 9e90e87..a5e4775 100644 --- a/src/include/eina_inline_f32p32.x +++ b/src/include/eina_inline_f32p32.x @@ -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 diff --git a/src/include/eina_inline_f8p24.x b/src/include/eina_inline_f8p24.x index 7e45220..ded0e3b 100644 --- a/src/include/eina_inline_f8p24.x +++ b/src/include/eina_inline_f8p24.x @@ -39,6 +39,12 @@ eina_f8p24_mul(Eina_F8p24 a, Eina_F8p24 b) } 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) { return (Eina_F8p24) ((((int64_t) a) << 24) / (int64_t) b); diff --git a/src/include/eina_inline_fp.x b/src/include/eina_inline_fp.x index b8603bb..ac0a52a 100644 --- a/src/include/eina_inline_fp.x +++ b/src/include/eina_inline_fp.x @@ -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 -- 2.7.4