summaryrefslogtreecommitdiffstats
path: root/luni/src/main/native/java_lang_StrictMath.c
diff options
context:
space:
mode:
Diffstat (limited to 'luni/src/main/native/java_lang_StrictMath.c')
-rw-r--r--luni/src/main/native/java_lang_StrictMath.c229
1 files changed, 229 insertions, 0 deletions
diff --git a/luni/src/main/native/java_lang_StrictMath.c b/luni/src/main/native/java_lang_StrictMath.c
new file mode 100644
index 0000000..7d335f7
--- /dev/null
+++ b/luni/src/main/native/java_lang_StrictMath.c
@@ -0,0 +1,229 @@
+/*
+ * Copyright 2006 The Android Open Source Project
+ *
+ * Native functions for java.lang.StrictMath.
+ */
+#include "jni.h"
+#include "JNIHelp.h"
+
+#include <stdlib.h>
+/* This static way is the "best" way to integrate fdlibm without a conflict
+ * into the android envoirement
+ */
+
+/* #include "fltconst.h" */
+
+#if defined(__P)
+#undef __P
+#endif /* defined(__P) */
+
+#include "../../external/fdlibm/fdlibm.h"
+_LIB_VERSION_TYPE _LIB_VERSION = _IEEE_;
+
+/* native public static double sin(double a); */
+static jdouble jsin(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_sin(a);
+}
+
+/* native public static double cos(double a); */
+static jdouble jcos(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_cos(a);
+}
+
+/* native public static double tan(double a); */
+static jdouble jtan(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_tan(a);
+}
+
+/* native public static double asin(double a); */
+static jdouble jasin(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_asin(a);
+}
+
+/* native public static double acos(double a); */
+static jdouble jacos(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_acos(a);
+}
+
+/* native public static double atan(double a); */
+static jdouble jatan(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_atan(a);
+}
+
+/* native public static double exp(double a); */
+static jdouble jexp(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_exp(a);
+}
+
+/* native public static double log(double a); */
+static jdouble jlog(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_log(a);
+}
+
+/* native public static double sqrt(double a); */
+static jdouble jsqrt2(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_sqrt(a);
+}
+
+/* native public static double IEEEremainder(double a, double b); */
+static jdouble jieee_remainder(JNIEnv* env, jclass clazz, jdouble a, jdouble b)
+{
+ return ieee_remainder(a, b);
+}
+
+/* native public static double floor(double a); */
+static jdouble jfloor(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_floor(a);
+}
+
+/* native public static double ceil(double a); */
+static jdouble jceil(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_ceil(a);
+}
+
+/* native public static double rint(double a); */
+static jdouble jrint(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_rint(a);
+}
+
+/* native public static double atan2(double a, double b); */
+static jdouble jatan2(JNIEnv* env, jclass clazz, jdouble a, jdouble b)
+{
+ return ieee_atan2(a, b);
+}
+
+/* native public static double pow(double a, double b); */
+static jdouble jpow(JNIEnv* env, jclass clazz, jdouble a, jdouble b)
+{
+ return ieee_pow(a,b);
+}
+
+/* native public static double sinh(double a); */
+static jdouble jsinh(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_sinh(a);
+}
+
+/* native public static double tanh(double a); */
+static jdouble jtanh(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_tanh(a);
+}
+
+/* native public static double cosh(double a); */
+static jdouble jcosh(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_cosh(a);
+}
+
+/* native public static double log10(double a); */
+static jdouble jlog10(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_log10(a);
+}
+
+/* native public static double cbrt(double a); */
+static jdouble jcbrt(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_cbrt(a);
+}
+
+/* native public static double expm1(double a); */
+static jdouble jexpm1(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_expm1(a);
+}
+
+/* native public static double hypot(double a, double b); */
+static jdouble jhypot(JNIEnv* env, jclass clazz, jdouble a, jdouble b)
+{
+ return ieee_hypot(a, b);
+}
+
+/* native public static double log1p(double a); */
+static jdouble jlog1p(JNIEnv* env, jclass clazz, jdouble a)
+{
+ return ieee_log1p(a);
+}
+
+/* native public static double nextafter(double a, double b); */
+static jdouble jnextafter(JNIEnv* env, jclass clazz, jdouble a, jdouble b)
+{
+ return ieee_nextafter(a, b);
+}
+
+/* native public static float nextafterf(float a, float b); */
+static jfloat jnextafterf(JNIEnv* env, jclass clazz, jfloat arg1, jfloat arg2)
+{
+ jint hx = *(jint*)&arg1;
+ jint hy = *(jint*)&arg2;
+
+ if (!(hx&0x7fffffff)) { /* arg1 == 0 */
+ *(jint*)&arg1 = (hy & 0x80000000) | 0x1;
+ return arg1;
+ }
+
+ if((hx > 0) ^ (hx > hy)) { /* |arg1| < |arg2| */
+ hx += 1;
+ } else {
+ hx -= 1;
+ }
+ *(jint*)&arg1 = hx;
+ return arg1;
+}
+
+/*
+ * JNI registration.
+ */
+static JNINativeMethod gMethods[] = {
+ /* name, signature, funcPtr */
+ { "sin", "(D)D", jsin },
+ { "cos", "(D)D", jcos },
+ { "tan", "(D)D", jtan },
+
+ { "asin", "(D)D", jasin },
+ { "acos", "(D)D", jacos },
+ { "atan", "(D)D", jatan },
+
+ { "exp", "(D)D", jexp },
+ { "log", "(D)D", jlog },
+ { "sqrt", "(D)D", jsqrt2 },
+
+ { "IEEEremainder", "(DD)D", jieee_remainder },
+
+ { "floor", "(D)D", jfloor },
+ { "ceil", "(D)D", jceil },
+ { "rint", "(D)D", jrint },
+
+ { "atan2", "(DD)D", jatan2 },
+ { "pow", "(DD)D", jpow },
+
+ { "sinh", "(D)D", jsinh },
+ { "cosh", "(D)D", jcosh },
+ { "tanh", "(D)D", jtanh },
+ { "log10", "(D)D", jlog10 },
+ { "cbrt", "(D)D", jcbrt },
+ { "expm1", "(D)D", jexpm1 },
+ { "hypot", "(DD)D", jhypot },
+ { "log1p", "(D)D", jlog1p },
+ { "nextafter", "(DD)D", jnextafter },
+ { "nextafterf", "(FF)F", jnextafterf },
+};
+
+int register_java_lang_StrictMath(JNIEnv* env)
+{
+ return jniRegisterNativeMethods(env, "java/lang/StrictMath", gMethods,
+ NELEM(gMethods));
+}