The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2006 The Android Open Source Project |
| 3 | * |
| 4 | * Native functions for java.lang.StrictMath. |
| 5 | */ |
| 6 | #include "jni.h" |
| 7 | #include "JNIHelp.h" |
| 8 | |
| 9 | #include <stdlib.h> |
| 10 | /* This static way is the "best" way to integrate fdlibm without a conflict |
Elliott Hughes | ace7e6f | 2010-03-26 23:23:38 -0700 | [diff] [blame] | 11 | * into the android environment. |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 12 | */ |
| 13 | |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 14 | #if defined(__P) |
| 15 | #undef __P |
| 16 | #endif /* defined(__P) */ |
| 17 | |
| 18 | #include "../../external/fdlibm/fdlibm.h" |
| 19 | _LIB_VERSION_TYPE _LIB_VERSION = _IEEE_; |
| 20 | |
| 21 | /* native public static double sin(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 22 | static jdouble jsin(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 23 | { |
| 24 | return ieee_sin(a); |
| 25 | } |
| 26 | |
| 27 | /* native public static double cos(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 28 | static jdouble jcos(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 29 | { |
| 30 | return ieee_cos(a); |
| 31 | } |
| 32 | |
| 33 | /* native public static double tan(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 34 | static jdouble jtan(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 35 | { |
| 36 | return ieee_tan(a); |
| 37 | } |
| 38 | |
| 39 | /* native public static double asin(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 40 | static jdouble jasin(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 41 | { |
| 42 | return ieee_asin(a); |
| 43 | } |
| 44 | |
| 45 | /* native public static double acos(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 46 | static jdouble jacos(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 47 | { |
| 48 | return ieee_acos(a); |
| 49 | } |
| 50 | |
| 51 | /* native public static double atan(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 52 | static jdouble jatan(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 53 | { |
| 54 | return ieee_atan(a); |
| 55 | } |
| 56 | |
| 57 | /* native public static double exp(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 58 | static jdouble jexp(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 59 | { |
| 60 | return ieee_exp(a); |
| 61 | } |
| 62 | |
| 63 | /* native public static double log(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 64 | static jdouble jlog(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 65 | { |
| 66 | return ieee_log(a); |
| 67 | } |
| 68 | |
| 69 | /* native public static double sqrt(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 70 | static jdouble jsqrt2(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 71 | { |
| 72 | return ieee_sqrt(a); |
| 73 | } |
| 74 | |
| 75 | /* native public static double IEEEremainder(double a, double b); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 76 | static jdouble jieee_remainder(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 77 | { |
| 78 | return ieee_remainder(a, b); |
| 79 | } |
| 80 | |
| 81 | /* native public static double floor(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 82 | static jdouble jfloor(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 83 | { |
| 84 | return ieee_floor(a); |
| 85 | } |
| 86 | |
| 87 | /* native public static double ceil(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 88 | static jdouble jceil(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 89 | { |
| 90 | return ieee_ceil(a); |
| 91 | } |
| 92 | |
| 93 | /* native public static double rint(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 94 | static jdouble jrint(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 95 | { |
| 96 | return ieee_rint(a); |
| 97 | } |
| 98 | |
| 99 | /* native public static double atan2(double a, double b); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 100 | static jdouble jatan2(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 101 | { |
| 102 | return ieee_atan2(a, b); |
| 103 | } |
| 104 | |
| 105 | /* native public static double pow(double a, double b); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 106 | static jdouble jpow(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 107 | { |
| 108 | return ieee_pow(a,b); |
| 109 | } |
| 110 | |
| 111 | /* native public static double sinh(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 112 | static jdouble jsinh(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 113 | { |
| 114 | return ieee_sinh(a); |
| 115 | } |
| 116 | |
| 117 | /* native public static double tanh(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 118 | static jdouble jtanh(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 119 | { |
| 120 | return ieee_tanh(a); |
| 121 | } |
| 122 | |
| 123 | /* native public static double cosh(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 124 | static jdouble jcosh(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 125 | { |
| 126 | return ieee_cosh(a); |
| 127 | } |
| 128 | |
| 129 | /* native public static double log10(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 130 | static jdouble jlog10(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 131 | { |
| 132 | return ieee_log10(a); |
| 133 | } |
| 134 | |
| 135 | /* native public static double cbrt(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 136 | static jdouble jcbrt(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 137 | { |
| 138 | return ieee_cbrt(a); |
| 139 | } |
| 140 | |
| 141 | /* native public static double expm1(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 142 | static jdouble jexpm1(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 143 | { |
| 144 | return ieee_expm1(a); |
| 145 | } |
| 146 | |
| 147 | /* native public static double hypot(double a, double b); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 148 | static jdouble jhypot(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 149 | { |
| 150 | return ieee_hypot(a, b); |
| 151 | } |
| 152 | |
| 153 | /* native public static double log1p(double a); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 154 | static jdouble jlog1p(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 155 | { |
| 156 | return ieee_log1p(a); |
| 157 | } |
| 158 | |
| 159 | /* native public static double nextafter(double a, double b); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 160 | static jdouble jnextafter(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jdouble a, jdouble b) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 161 | { |
| 162 | return ieee_nextafter(a, b); |
| 163 | } |
| 164 | |
| 165 | /* native public static float nextafterf(float a, float b); */ |
Brian Carlstrom | 44e0e56 | 2010-05-06 23:44:16 -0700 | [diff] [blame^] | 166 | static jfloat jnextafterf(JNIEnv* env __attribute__ ((unused)), jclass clazz __attribute__ ((unused)), jfloat arg1, jfloat arg2) |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 167 | { |
| 168 | jint hx = *(jint*)&arg1; |
| 169 | jint hy = *(jint*)&arg2; |
| 170 | |
| 171 | if (!(hx&0x7fffffff)) { /* arg1 == 0 */ |
| 172 | *(jint*)&arg1 = (hy & 0x80000000) | 0x1; |
| 173 | return arg1; |
| 174 | } |
| 175 | |
| 176 | if((hx > 0) ^ (hx > hy)) { /* |arg1| < |arg2| */ |
| 177 | hx += 1; |
| 178 | } else { |
| 179 | hx -= 1; |
| 180 | } |
| 181 | *(jint*)&arg1 = hx; |
| 182 | return arg1; |
| 183 | } |
| 184 | |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 185 | static JNINativeMethod gMethods[] = { |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 186 | { "IEEEremainder", "(DD)D", jieee_remainder }, |
Elliott Hughes | ace7e6f | 2010-03-26 23:23:38 -0700 | [diff] [blame] | 187 | { "acos", "(D)D", jacos }, |
| 188 | { "asin", "(D)D", jasin }, |
| 189 | { "atan", "(D)D", jatan }, |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 190 | { "atan2", "(DD)D", jatan2 }, |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 191 | { "cbrt", "(D)D", jcbrt }, |
Elliott Hughes | ace7e6f | 2010-03-26 23:23:38 -0700 | [diff] [blame] | 192 | { "ceil", "(D)D", jceil }, |
Elliott Hughes | ace7e6f | 2010-03-26 23:23:38 -0700 | [diff] [blame] | 193 | { "cos", "(D)D", jcos }, |
| 194 | { "cosh", "(D)D", jcosh }, |
| 195 | { "exp", "(D)D", jexp }, |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 196 | { "expm1", "(D)D", jexpm1 }, |
Elliott Hughes | ace7e6f | 2010-03-26 23:23:38 -0700 | [diff] [blame] | 197 | { "floor", "(D)D", jfloor }, |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 198 | { "hypot", "(DD)D", jhypot }, |
Elliott Hughes | ace7e6f | 2010-03-26 23:23:38 -0700 | [diff] [blame] | 199 | { "log", "(D)D", jlog }, |
| 200 | { "log10", "(D)D", jlog10 }, |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 201 | { "log1p", "(D)D", jlog1p }, |
| 202 | { "nextafter", "(DD)D", jnextafter }, |
| 203 | { "nextafterf", "(FF)F", jnextafterf }, |
Elliott Hughes | ace7e6f | 2010-03-26 23:23:38 -0700 | [diff] [blame] | 204 | { "pow", "(DD)D", jpow }, |
| 205 | { "rint", "(D)D", jrint }, |
| 206 | { "sin", "(D)D", jsin }, |
| 207 | { "sinh", "(D)D", jsinh }, |
| 208 | { "sqrt", "(D)D", jsqrt2 }, |
| 209 | { "tan", "(D)D", jtan }, |
| 210 | { "tanh", "(D)D", jtanh }, |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 211 | }; |
| 212 | |
Elliott Hughes | c08f9fb | 2010-04-16 17:44:12 -0700 | [diff] [blame] | 213 | int register_java_lang_StrictMath(JNIEnv* env) { |
| 214 | return jniRegisterNativeMethods(env, "java/lang/StrictMath", gMethods, NELEM(gMethods)); |
The Android Open Source Project | adc854b | 2009-03-03 19:28:47 -0800 | [diff] [blame] | 215 | } |