diff --git a/legacy/eina/src/include/eina_fp.h b/legacy/eina/src/include/eina_fp.h index a488dfe294..bd1404d213 100644 --- a/legacy/eina/src/include/eina_fp.h +++ b/legacy/eina/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/legacy/eina/src/include/eina_inline_f16p16.x b/legacy/eina/src/include/eina_inline_f16p16.x index f62a3c8824..f7420ba1ad 100644 --- a/legacy/eina/src/include/eina_inline_f16p16.x +++ b/legacy/eina/src/include/eina_inline_f16p16.x @@ -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) { diff --git a/legacy/eina/src/include/eina_inline_f32p32.x b/legacy/eina/src/include/eina_inline_f32p32.x index 9e90e87325..a5e4775be0 100644 --- a/legacy/eina/src/include/eina_inline_f32p32.x +++ b/legacy/eina/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/legacy/eina/src/include/eina_inline_f8p24.x b/legacy/eina/src/include/eina_inline_f8p24.x index 7e452202df..ded0e3b9dc 100644 --- a/legacy/eina/src/include/eina_inline_f8p24.x +++ b/legacy/eina/src/include/eina_inline_f8p24.x @@ -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) { diff --git a/legacy/eina/src/include/eina_inline_fp.x b/legacy/eina/src/include/eina_inline_fp.x index b8603bba2e..ac0a52ab61 100644 --- a/legacy/eina/src/include/eina_inline_fp.x +++ b/legacy/eina/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