* eina_fp: Fix rounding with Eina_F32p32 multiplaction, add
authorcedric <cedric>
Mon, 7 Dec 2009 09:27:53 +0000 (09:27 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 7 Dec 2009 09:27:53 +0000 (09:27 +0000)
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
src/include/eina_inline_f16p16.x
src/include/eina_inline_f32p32.x
src/include/eina_inline_f8p24.x
src/include/eina_inline_fp.x

index a488dfe..bd1404d 100644 (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);
index f62a3c8..f7420ba 100644 (file)
@@ -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);
index 9e90e87..a5e4775 100644 (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
index 7e45220..ded0e3b 100644 (file)
@@ -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);
index b8603bb..ac0a52a 100644 (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