summaryrefslogtreecommitdiff
path: root/lib/fixedpoint
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fixedpoint')
-rw-r--r--lib/fixedpoint/fixedpoint.c29
-rw-r--r--lib/fixedpoint/fixedpoint.h2
-rw-r--r--lib/fixedpoint/fixedpoint.make3
3 files changed, 31 insertions, 3 deletions
diff --git a/lib/fixedpoint/fixedpoint.c b/lib/fixedpoint/fixedpoint.c
index 645419d..d1307bb 100644
--- a/lib/fixedpoint/fixedpoint.c
+++ b/lib/fixedpoint/fixedpoint.c
@@ -211,6 +211,35 @@ long fp_sqrt(long x, unsigned int fracbits)
return g;
}
+/* raise an integer to an integer power */
+long ipow(long x, long y)
+{
+ /* y[k] = bit k of y, 0 or 1; k=0...n; n=|_ lg(y) _|
+ *
+ * x^y = x^(y[0]*2^0 + y[1]*2^1 + ... + y[n]*2^n)
+ * = x^(y[0]*2^0) * x^(y[1]*2^1) * ... * x^(y[n]*2^n)
+ */
+ long a = 1;
+
+ if (y < 0 && x != -1)
+ {
+ a = 0; /* would be < 1 or +inf if x == 0 */
+ }
+ else
+ {
+ while (y)
+ {
+ if (y & 1)
+ a *= x;
+
+ y /= 2;
+ x *= x;
+ }
+ }
+
+ return a;
+}
+
/**
* Fixed point sinus using a lookup table
* don't forget to divide the result by 16384 to get the actual sinus value
diff --git a/lib/fixedpoint/fixedpoint.h b/lib/fixedpoint/fixedpoint.h
index bc50ff6..dcd7c82 100644
--- a/lib/fixedpoint/fixedpoint.h
+++ b/lib/fixedpoint/fixedpoint.h
@@ -85,6 +85,8 @@ long fp14_sin(int val);
long fp16_log(int x);
long fp16_exp(int x);
+long ipow(long x, long y);
+
/* fast unsigned multiplication (16x16bit->32bit or 32x32bit->32bit,
* whichever is faster for the architecture) */
#ifdef CPU_ARM
diff --git a/lib/fixedpoint/fixedpoint.make b/lib/fixedpoint/fixedpoint.make
index 0233e94..5be0e38 100644
--- a/lib/fixedpoint/fixedpoint.make
+++ b/lib/fixedpoint/fixedpoint.make
@@ -13,11 +13,8 @@ FIXEDPOINTLIB_OBJ := $(call c2obj, $(FIXEDPOINTLIB_SRC))
INCLUDES += -I$(FIXEDPOINTLIB_DIR)
OTHER_SRC += $(FIXEDPOINTLIB_SRC)
-# If not SOFTWARECODECS, then only plugins depend upon us
-ifdef SOFTWARECODECS
CORE_LIBS += $(FIXEDPOINTLIB)
CORE_GCSECTIONS := yes
-endif
FIXEDPOINTLIB_FLAGS := $(CFLAGS) $(SHARED_CFLAGS)