summaryrefslogtreecommitdiff
path: root/include/math_util.h
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2015-09-09 08:53:55 -0700
committerchrome-bot <chrome-bot@chromium.org>2015-09-18 19:21:08 -0700
commitd896a005d4a11abbd7803526dad6d927218a28f7 (patch)
tree72eee24109df0b214ce63800d178d67b269674d0 /include/math_util.h
parent4ef6aabe0723e7d9d119220dc308459b3627918b (diff)
downloadchrome-ec-d896a005d4a11abbd7803526dad6d927218a28f7.tar.gz
common: math: Use float when CONFIG_FPU is set.
When hardware FPU is set, use it. BRANCH=smaug BUG=chrome-os-partner:39900 TEST=compile. Change-Id: I5b42bd23a7ee7549e538eff075756b58f79756f2 Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/299516 Reviewed-by: Randall Spangler <rspangler@chromium.org> Reviewed-by: Alec Berg <alecaberg@chromium.org>
Diffstat (limited to 'include/math_util.h')
-rw-r--r--include/math_util.h28
1 files changed, 27 insertions, 1 deletions
diff --git a/include/math_util.h b/include/math_util.h
index 948d501033..0dd11c230b 100644
--- a/include/math_util.h
+++ b/include/math_util.h
@@ -8,6 +8,19 @@
#ifndef __CROS_EC_MATH_UTIL_H
#define __CROS_EC_MATH_UTIL_H
+#ifdef CONFIG_FPU
+typedef float fp_t;
+typedef float fp_inter_t;
+
+/* Conversion to/from fixed-point */
+#define INT_TO_FP(x) ((float)(x))
+#define FP_TO_INT(x) ((int32_t)(x))
+/* Float to fixed-point, only for compile-time constants and unit tests */
+#define FLOAT_TO_FP(x) ((float)(x))
+/* Fixed-point to float, for unit tests */
+#define FP_TO_FLOAT(x) ((float)(x))
+
+#else
/* Fixed-point type */
typedef int32_t fp_t;
@@ -24,12 +37,24 @@ typedef int64_t fp_inter_t;
#define FLOAT_TO_FP(x) ((fp_t)((x) * (float)(1<<FP_BITS)))
/* Fixed-point to float, for unit tests */
#define FP_TO_FLOAT(x) ((float)(x) / (float)(1<<FP_BITS))
+#endif
/*
* Fixed-point addition and subtraction can be done directly, because they
* work identically.
*/
+#ifdef CONFIG_FPU
+static inline fp_t fp_mul(fp_t a, fp_t b)
+{
+ return a * b;
+}
+
+static inline fp_t fp_div(fp_t a, fp_t b)
+{
+ return a / b;
+}
+#else
/**
* Multiplication - return (a * b)
*/
@@ -45,6 +70,7 @@ static inline fp_t fp_div(fp_t a, fp_t b)
{
return (fp_t)(((fp_inter_t)a << FP_BITS) / b);
}
+#endif
/**
* Square (a * a)
@@ -59,7 +85,7 @@ static inline fp_t fp_sq(fp_t a)
*/
static inline fp_t fp_abs(fp_t a)
{
- return (a >= 0 ? a : -a);
+ return (a >= INT_TO_FP(0) ? a : -a);
}
/*