1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #if !defined(cbigint_h) 19 #define cbigint_h 20 21 #include <nativehelper/JNIHelp.h> 22 23 #include <sys/types.h> 24 #include <sys/param.h> 25 #include <stdint.h> 26 27 /* IEEE floats consist of: sign bit, exponent field, significand field 28 single: 31 = sign bit, 30..23 = exponent (8 bits), 22..0 = significand (23 bits) 29 double: 63 = sign bit, 62..52 = exponent (11 bits), 51..0 = significand (52 bits) 30 inf == (all exponent bits set) and (all mantissa bits clear) 31 nan == (all exponent bits set) and (at least one mantissa bit set) 32 finite == (at least one exponent bit clear) 33 zero == (all exponent bits clear) and (all mantissa bits clear) 34 denormal == (all exponent bits clear) and (at least one mantissa bit set) 35 positive == sign bit clear 36 negative == sign bit set 37 */ 38 #if __BYTE_ORDER == __LITTLE_ENDIAN 39 #define DOUBLE_LO_OFFSET 0 40 #define DOUBLE_HI_OFFSET 1 41 #define LONG_LO_OFFSET 0 42 #define LONG_HI_OFFSET 1 43 #else 44 #define DOUBLE_LO_OFFSET 1 45 #define DOUBLE_HI_OFFSET 0 46 #define LONG_LO_OFFSET 1 47 #define LONG_HI_OFFSET 0 48 #endif 49 50 #define DOUBLE_EXPONENT_MASK_HI 0x7FF00000 51 #define DOUBLE_MANTISSA_MASK_HI 0x000FFFFF 52 53 union U64U32DBL { 54 uint64_t u64val; 55 uint32_t u32val[2]; 56 int32_t i32val[2]; 57 double dval; 58 }; 59 60 #define DOUBLE_TO_LONGBITS(dbl) (*(reinterpret_cast<uint64_t*>(&dbl))) 61 #define FLOAT_TO_INTBITS(flt) (*(reinterpret_cast<uint32_t*>(&flt))) 62 #define INTBITS_TO_FLOAT(bits) (*(reinterpret_cast<float*>(&bits))) 63 64 /* Replace P_FLOAT_HI and P_FLOAT_LOW */ 65 /* These macros are used to access the high and low 32-bit parts of a double (64-bit) value. */ 66 #define LOW_U32_FROM_DBL_PTR(dblptr) ((reinterpret_cast<U64U32DBL*>(dblptr))->u32val[DOUBLE_LO_OFFSET]) 67 #define HIGH_U32_FROM_DBL_PTR(dblptr) ((reinterpret_cast<U64U32DBL*>(dblptr))->u32val[DOUBLE_HI_OFFSET]) 68 #define LOW_I32_FROM_DBL_PTR(dblptr) ((reinterpret_cast<U64U32DBL*>(dblptr))->i32val[DOUBLE_LO_OFFSET]) 69 #define HIGH_I32_FROM_DBL_PTR(dblptr) ((reinterpret_cast<U64U32DBL*>(dblptr))->i32val[DOUBLE_HI_OFFSET]) 70 #define LOW_U32_FROM_DBL(dbl) LOW_U32_FROM_DBL_PTR(&(dbl)) 71 #define HIGH_U32_FROM_DBL(dbl) HIGH_U32_FROM_DBL_PTR(&(dbl)) 72 #define LOW_U32_FROM_LONG64_PTR(long64ptr) ((reinterpret_cast<U64U32DBL*>(long64ptr))->u32val[LONG_LO_OFFSET]) 73 #define HIGH_U32_FROM_LONG64_PTR(long64ptr) ((reinterpret_cast<U64U32DBL*>(long64ptr))->u32val[LONG_HI_OFFSET]) 74 #define LOW_I32_FROM_LONG64_PTR(long64ptr) ((reinterpret_cast<U64U32DBL*>(long64ptr))->i32val[LONG_LO_OFFSET]) 75 #define HIGH_I32_FROM_LONG64_PTR(long64ptr) ((reinterpret_cast<U64U32DBL*>(long64ptr))->i32val[LONG_HI_OFFSET]) 76 #define LOW_U32_FROM_LONG64(long64) LOW_U32_FROM_LONG64_PTR(&(long64)) 77 #define HIGH_U32_FROM_LONG64(long64) HIGH_U32_FROM_LONG64_PTR(&(long64)) 78 #define LOW_I32_FROM_LONG64(long64) LOW_I32_FROM_LONG64_PTR(&(long64)) 79 #define HIGH_I32_FROM_LONG64(long64) HIGH_I32_FROM_LONG64_PTR(&(long64)) 80 #define IS_DENORMAL_DBL_PTR(dblptr) (((HIGH_U32_FROM_DBL_PTR(dblptr) & DOUBLE_EXPONENT_MASK_HI) == 0) && ((HIGH_U32_FROM_DBL_PTR(dblptr) & DOUBLE_MANTISSA_MASK_HI) != 0 || (LOW_U32_FROM_DBL_PTR(dblptr) != 0))) 81 #define IS_DENORMAL_DBL(dbl) IS_DENORMAL_DBL_PTR(&(dbl)) 82 83 #define LOW_U32_FROM_VAR(u64) LOW_U32_FROM_LONG64(u64) 84 #define LOW_U32_FROM_PTR(u64ptr) LOW_U32_FROM_LONG64_PTR(u64ptr) 85 #define HIGH_U32_FROM_VAR(u64) HIGH_U32_FROM_LONG64(u64) 86 #define HIGH_U32_FROM_PTR(u64ptr) HIGH_U32_FROM_LONG64_PTR(u64ptr) 87 88 void multiplyHighPrecision(uint64_t* arg1, int32_t length1, uint64_t* arg2, int32_t length2, 89 uint64_t* result, int32_t length); 90 uint32_t simpleAppendDecimalDigitHighPrecision(uint64_t* arg1, int32_t length, uint64_t digit); 91 jdouble toDoubleHighPrecision(uint64_t* arg, int32_t length); 92 uint64_t doubleMantissa(jdouble z); 93 int32_t compareHighPrecision(uint64_t* arg1, int32_t length1, uint64_t* arg2, int32_t length2); 94 int32_t highestSetBitHighPrecision(uint64_t* arg, int32_t length); 95 void subtractHighPrecision(uint64_t* arg1, int32_t length1, uint64_t* arg2, int32_t length2); 96 int32_t doubleExponent(jdouble z); 97 int32_t addHighPrecision(uint64_t* arg1, int32_t length1, uint64_t* arg2, int32_t length2); 98 int32_t lowestSetBit(uint64_t* y); 99 int32_t timesTenToTheEHighPrecision(uint64_t* result, int32_t length, jint e); 100 int32_t highestSetBit(uint64_t* y); 101 int32_t lowestSetBitHighPrecision(uint64_t* arg, int32_t length); 102 void simpleShiftLeftHighPrecision(uint64_t* arg1, int32_t length, int32_t arg2); 103 uint32_t floatMantissa(jfloat z); 104 int32_t simpleAddHighPrecision(uint64_t* arg1, int32_t length, uint64_t arg2); 105 int32_t floatExponent(jfloat z); 106 107 #endif /* cbigint_h */ 108