~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to tests/nbody-java/native_org_apache_harmony_luni_util_NumberConverter.c

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-06-11 15:45:24 UTC
  • mfrom: (1.2.1) (2.1.1 experimental)
  • Revision ID: package-import@ubuntu.com-20130611154524-rppb3w6tixlegv4n
Tags: 1.4.7~20130611~a1eb425-1
* New snapshot release
* Upload to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
#include "xmlvm.h"
 
3
#include "org_apache_harmony_luni_util_NumberConverter.h"
 
4
 
 
5
 
 
6
//XMLVM_BEGIN_NATIVE_IMPLEMENTATION
 
7
#include "xmlvm-hy.h"
 
8
#include "hycomp.h"
 
9
 
 
10
#define RM_SIZE 21
 
11
#define STemp_SIZE 22
 
12
#define INV_LOG_OF_TEN_BASE_2 (0.30102999566398114)
 
13
 
 
14
//XMLVM_END_NATIVE_IMPLEMENTATION
 
15
 
 
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)
 
17
{
 
18
    //XMLVM_BEGIN_NATIVE[org_apache_harmony_luni_util_NumberConverter_bigIntDigitGeneratorInstImpl___long_int_boolean_boolean_int]
 
19
                JAVA_LONG f = n1;
 
20
                JAVA_INT e = n2;
 
21
                JAVA_BOOLEAN isDenormalized = n3;
 
22
                JAVA_BOOLEAN mantissaIsZero = n4;
 
23
                JAVA_INT p = n5;
 
24
 
 
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;
 
30
 
 
31
                U_64 R[RM_SIZE], S[STemp_SIZE], mplus[RM_SIZE], mminus[RM_SIZE],Temp[STemp_SIZE];
 
32
 
 
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));
 
38
 
 
39
                if (e >= 0)
 
40
            {
 
41
                        *R = f;
 
42
                        *mplus = *mminus = 1;
 
43
                        simpleShiftLeftHighPrecision (mminus, RM_SIZE, e);
 
44
                        if (f != (2 << (p - 1)))
 
45
                {
 
46
                                simpleShiftLeftHighPrecision (R, RM_SIZE, e + 1);
 
47
                                *S = 2;
 
48
                                simpleShiftLeftHighPrecision (mplus, RM_SIZE, e);
 
49
                        }
 
50
                        else {
 
51
                                simpleShiftLeftHighPrecision (R, RM_SIZE, e+2);
 
52
                                *S = 4;
 
53
                                simpleShiftLeftHighPrecision (mplus, RM_SIZE, e + 1);
 
54
 
 
55
                        }
 
56
                }
 
57
                else {
 
58
                        if (isDenormalized || (f != (2 << (p - 1))))
 
59
                {
 
60
                                *R = f << 1;
 
61
                                *S = 1;
 
62
                                simpleShiftLeftHighPrecision (S, STemp_SIZE, 1 - e);
 
63
                                *mplus = *mminus = 1;
 
64
                }
 
65
                        else
 
66
                {
 
67
                                *R = f << 2;
 
68
                                *S = 1;
 
69
                                simpleShiftLeftHighPrecision (S, STemp_SIZE, 2 - e);
 
70
                                *mplus = 2;
 
71
                                *mminus = 1;
 
72
                }
 
73
                }
 
74
                k = (int) ceil ((e + p - 1) * INV_LOG_OF_TEN_BASE_2 - 1e-10);
 
75
 
 
76
                if (k > 0)
 
77
            {
 
78
                        timesTenToTheEHighPrecision (S, STemp_SIZE, k);
 
79
            }
 
80
                else
 
81
            {
 
82
                        timesTenToTheEHighPrecision (R, RM_SIZE, -k);
 
83
                        timesTenToTheEHighPrecision (mplus, RM_SIZE, -k);
 
84
                        timesTenToTheEHighPrecision (mminus, RM_SIZE, -k);
 
85
            }
 
86
 
 
87
                RLength = mplus_Length = mminus_Length = RM_SIZE;
 
88
                SLength = TempLength = STemp_SIZE;
 
89
 
 
90
                memset (Temp + RM_SIZE, 0, (STemp_SIZE - RM_SIZE) * sizeof (U_64));
 
91
                memcpy (Temp, R, RM_SIZE * sizeof (U_64));
 
92
 
 
93
                while (RLength > 1 && R[RLength - 1] == 0)
 
94
                        --RLength;
 
95
                while (mplus_Length > 1 && mplus[mplus_Length - 1] == 0)
 
96
                        --mplus_Length;
 
97
                while (mminus_Length > 1 && mminus[mminus_Length - 1] == 0)
 
98
                        --mminus_Length;
 
99
                while (SLength > 1 && S[SLength - 1] == 0)
 
100
                        --SLength;
 
101
                TempLength = (RLength > mplus_Length ? RLength : mplus_Length) + 1;
 
102
                addHighPrecision (Temp, TempLength, mplus, mplus_Length);
 
103
 
 
104
                if (compareHighPrecision (Temp, TempLength, S, SLength) >= 0)
 
105
            {
 
106
                        firstK = k;
 
107
            }
 
108
                else
 
109
            {
 
110
                        firstK = k - 1;
 
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)
 
115
                                --RLength;
 
116
                        while (mplus_Length > 1 && mplus[mplus_Length - 1] == 0)
 
117
                                --mplus_Length;
 
118
                        while (mminus_Length > 1 && mminus[mminus_Length - 1] == 0)
 
119
                                --mminus_Length;
 
120
            }
 
121
 
 
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_;
 
125
 
 
126
                getCount = setCount = 0;
 
127
                do
 
128
            {
 
129
                        U = 0;
 
130
                        for (i = 3; i >= 0; --i)
 
131
                {
 
132
                                TempLength = SLength + 1;
 
133
                                Temp[SLength] = 0;
 
134
                                memcpy (Temp, S, SLength * sizeof (U_64));
 
135
                                simpleShiftLeftHighPrecision (Temp, TempLength, i);
 
136
                                if (compareHighPrecision (R, RLength, Temp, TempLength) >= 0)
 
137
                    {
 
138
                                        subtractHighPrecision (R, RLength, Temp, TempLength);
 
139
                                        U += 1 << i;
 
140
                    }
 
141
                }
 
142
 
 
143
                        low = compareHighPrecision (R, RLength, mminus, mminus_Length) <= 0;
 
144
 
 
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);
 
149
 
 
150
                        high = compareHighPrecision (Temp, TempLength, S, SLength) >= 0;
 
151
 
 
152
                        if (low || high)
 
153
                                break;
 
154
 
 
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)
 
159
                                --RLength;
 
160
                        while (mplus_Length > 1 && mplus[mplus_Length - 1] == 0)
 
161
                                --mplus_Length;
 
162
                        while (mminus_Length > 1 && mminus[mminus_Length - 1] == 0)
 
163
                                --mminus_Length;
 
164
                        uArray[setCount++] = U;
 
165
 
 
166
                }
 
167
                while (1);
 
168
 
 
169
                simpleShiftLeftHighPrecision (R, ++RLength, 1);
 
170
                if (low && !high)
 
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;
 
176
                else
 
177
                        uArray[setCount++] = U + 1;
 
178
 
 
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;
 
182
 
 
183
 
 
184
    //XMLVM_END_NATIVE
 
185
}
 
186