3
#include "org_apache_harmony_luni_util_NumberConverter.h"
6
//XMLVM_BEGIN_NATIVE_IMPLEMENTATION
12
#define INV_LOG_OF_TEN_BASE_2 (0.30102999566398114)
14
//XMLVM_END_NATIVE_IMPLEMENTATION
16
void org_apache_harmony_luni_util_NumberConverter_bigIntDigitGeneratorInstImpl___long_int_boolean_boolean_int(JAVA_OBJECT me, JAVA_LONG n1, JAVA_INT n2, JAVA_BOOLEAN n3, JAVA_BOOLEAN n4, JAVA_INT n5)
18
//XMLVM_BEGIN_NATIVE[org_apache_harmony_luni_util_NumberConverter_bigIntDigitGeneratorInstImpl___long_int_boolean_boolean_int]
21
JAVA_BOOLEAN isDenormalized = n3;
22
JAVA_BOOLEAN mantissaIsZero = n4;
25
JAVA_INT RLength, SLength, TempLength, mplus_Length, mminus_Length;
26
JAVA_INT high, low, i;
27
JAVA_LONG k, firstK, U;
28
JAVA_LONG getCount, setCount;
29
JAVA_ARRAY_INT* uArray;
31
U_64 R[RM_SIZE], S[STemp_SIZE], mplus[RM_SIZE], mminus[RM_SIZE],Temp[STemp_SIZE];
33
memset (R, 0, RM_SIZE * sizeof (U_64));
34
memset (S, 0, STemp_SIZE * sizeof (U_64));
35
memset (mplus, 0, RM_SIZE * sizeof (U_64));
36
memset (mminus, 0, RM_SIZE * sizeof (U_64));
37
memset (Temp, 0, STemp_SIZE * sizeof (U_64));
43
simpleShiftLeftHighPrecision (mminus, RM_SIZE, e);
44
if (f != (2 << (p - 1)))
46
simpleShiftLeftHighPrecision (R, RM_SIZE, e + 1);
48
simpleShiftLeftHighPrecision (mplus, RM_SIZE, e);
51
simpleShiftLeftHighPrecision (R, RM_SIZE, e+2);
53
simpleShiftLeftHighPrecision (mplus, RM_SIZE, e + 1);
58
if (isDenormalized || (f != (2 << (p - 1))))
62
simpleShiftLeftHighPrecision (S, STemp_SIZE, 1 - e);
69
simpleShiftLeftHighPrecision (S, STemp_SIZE, 2 - e);
74
k = (int) ceil ((e + p - 1) * INV_LOG_OF_TEN_BASE_2 - 1e-10);
78
timesTenToTheEHighPrecision (S, STemp_SIZE, k);
82
timesTenToTheEHighPrecision (R, RM_SIZE, -k);
83
timesTenToTheEHighPrecision (mplus, RM_SIZE, -k);
84
timesTenToTheEHighPrecision (mminus, RM_SIZE, -k);
87
RLength = mplus_Length = mminus_Length = RM_SIZE;
88
SLength = TempLength = STemp_SIZE;
90
memset (Temp + RM_SIZE, 0, (STemp_SIZE - RM_SIZE) * sizeof (U_64));
91
memcpy (Temp, R, RM_SIZE * sizeof (U_64));
93
while (RLength > 1 && R[RLength - 1] == 0)
95
while (mplus_Length > 1 && mplus[mplus_Length - 1] == 0)
97
while (mminus_Length > 1 && mminus[mminus_Length - 1] == 0)
99
while (SLength > 1 && S[SLength - 1] == 0)
101
TempLength = (RLength > mplus_Length ? RLength : mplus_Length) + 1;
102
addHighPrecision (Temp, TempLength, mplus, mplus_Length);
104
if (compareHighPrecision (Temp, TempLength, S, SLength) >= 0)
111
simpleAppendDecimalDigitHighPrecision (R, ++RLength, 0);
112
simpleAppendDecimalDigitHighPrecision (mplus, ++mplus_Length, 0);
113
simpleAppendDecimalDigitHighPrecision (mminus, ++mminus_Length, 0);
114
while (RLength > 1 && R[RLength - 1] == 0)
116
while (mplus_Length > 1 && mplus[mplus_Length - 1] == 0)
118
while (mminus_Length > 1 && mminus[mminus_Length - 1] == 0)
122
org_apache_harmony_luni_util_NumberConverter* inst = (org_apache_harmony_luni_util_NumberConverter*)me;
123
org_xmlvm_runtime_XMLVMArray* uArrayObject = inst->fields.org_apache_harmony_luni_util_NumberConverter.uArray_;
124
uArray = uArrayObject->fields.org_xmlvm_runtime_XMLVMArray.array_;
126
getCount = setCount = 0;
130
for (i = 3; i >= 0; --i)
132
TempLength = SLength + 1;
134
memcpy (Temp, S, SLength * sizeof (U_64));
135
simpleShiftLeftHighPrecision (Temp, TempLength, i);
136
if (compareHighPrecision (R, RLength, Temp, TempLength) >= 0)
138
subtractHighPrecision (R, RLength, Temp, TempLength);
143
low = compareHighPrecision (R, RLength, mminus, mminus_Length) <= 0;
145
memset (Temp + RLength, 0, (STemp_SIZE - RLength) * sizeof (U_64));
146
memcpy (Temp, R, RLength * sizeof (U_64));
147
TempLength = (RLength > mplus_Length ? RLength : mplus_Length) + 1;
148
addHighPrecision (Temp, TempLength, mplus, mplus_Length);
150
high = compareHighPrecision (Temp, TempLength, S, SLength) >= 0;
155
simpleAppendDecimalDigitHighPrecision (R, ++RLength, 0);
156
simpleAppendDecimalDigitHighPrecision (mplus, ++mplus_Length, 0);
157
simpleAppendDecimalDigitHighPrecision (mminus, ++mminus_Length, 0);
158
while (RLength > 1 && R[RLength - 1] == 0)
160
while (mplus_Length > 1 && mplus[mplus_Length - 1] == 0)
162
while (mminus_Length > 1 && mminus[mminus_Length - 1] == 0)
164
uArray[setCount++] = U;
169
simpleShiftLeftHighPrecision (R, ++RLength, 1);
171
uArray[setCount++] = U;
172
else if (high && !low)
173
uArray[setCount++] = U + 1;
174
else if (compareHighPrecision (R, RLength, S, SLength) < 0)
175
uArray[setCount++] = U;
177
uArray[setCount++] = U + 1;
179
inst->fields.org_apache_harmony_luni_util_NumberConverter.setCount_ = setCount;
180
inst->fields.org_apache_harmony_luni_util_NumberConverter.getCount_ = getCount;
181
inst->fields.org_apache_harmony_luni_util_NumberConverter.firstK_ = firstK;