xref: /aosp_15_r20/external/deqp/framework/delibs/debase/deFloat16Test.c (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker  * drawElements Base Portability Library
3*35238bceSAndroid Build Coastguard Worker  * -------------------------------------
4*35238bceSAndroid Build Coastguard Worker  *
5*35238bceSAndroid Build Coastguard Worker  * Copyright 2017 Google Inc.
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker  *
11*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker  *
19*35238bceSAndroid Build Coastguard Worker  *//*!
20*35238bceSAndroid Build Coastguard Worker  * \file
21*35238bceSAndroid Build Coastguard Worker  * \brief Testing of deFloat16 functions.
22*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
23*35238bceSAndroid Build Coastguard Worker 
24*35238bceSAndroid Build Coastguard Worker #include "deFloat16.h"
25*35238bceSAndroid Build Coastguard Worker #include "deRandom.h"
26*35238bceSAndroid Build Coastguard Worker 
27*35238bceSAndroid Build Coastguard Worker DE_BEGIN_EXTERN_C
28*35238bceSAndroid Build Coastguard Worker 
getFloat32(uint32_t sign,uint32_t biased_exponent,uint32_t mantissa)29*35238bceSAndroid Build Coastguard Worker static float getFloat32(uint32_t sign, uint32_t biased_exponent, uint32_t mantissa)
30*35238bceSAndroid Build Coastguard Worker {
31*35238bceSAndroid Build Coastguard Worker     union
32*35238bceSAndroid Build Coastguard Worker     {
33*35238bceSAndroid Build Coastguard Worker         float f;
34*35238bceSAndroid Build Coastguard Worker         uint32_t u;
35*35238bceSAndroid Build Coastguard Worker     } x;
36*35238bceSAndroid Build Coastguard Worker 
37*35238bceSAndroid Build Coastguard Worker     x.u = (sign << 31) | (biased_exponent << 23) | mantissa;
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker     return x.f;
40*35238bceSAndroid Build Coastguard Worker }
41*35238bceSAndroid Build Coastguard Worker 
getFloat16(uint16_t sign,uint16_t biased_exponent,uint16_t mantissa)42*35238bceSAndroid Build Coastguard Worker static deFloat16 getFloat16(uint16_t sign, uint16_t biased_exponent, uint16_t mantissa)
43*35238bceSAndroid Build Coastguard Worker {
44*35238bceSAndroid Build Coastguard Worker     return (deFloat16)((sign << 15) | (biased_exponent << 10) | mantissa);
45*35238bceSAndroid Build Coastguard Worker }
46*35238bceSAndroid Build Coastguard Worker 
deFloat32To16RTZ(float val32)47*35238bceSAndroid Build Coastguard Worker static deFloat16 deFloat32To16RTZ(float val32)
48*35238bceSAndroid Build Coastguard Worker {
49*35238bceSAndroid Build Coastguard Worker     return deFloat32To16Round(val32, DE_ROUNDINGMODE_TO_ZERO);
50*35238bceSAndroid Build Coastguard Worker }
51*35238bceSAndroid Build Coastguard Worker 
deFloat32To16RTE(float val32)52*35238bceSAndroid Build Coastguard Worker static deFloat16 deFloat32To16RTE(float val32)
53*35238bceSAndroid Build Coastguard Worker {
54*35238bceSAndroid Build Coastguard Worker     return deFloat32To16Round(val32, DE_ROUNDINGMODE_TO_NEAREST_EVEN);
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker 
deFloat16_selfTest(void)57*35238bceSAndroid Build Coastguard Worker void deFloat16_selfTest(void)
58*35238bceSAndroid Build Coastguard Worker {
59*35238bceSAndroid Build Coastguard Worker     /* 16-bit: 1    5 (0x00--0x1f)    10 (0x000--0x3ff)
60*35238bceSAndroid Build Coastguard Worker      * 32-bit: 1    8 (0x00--0xff)    23 (0x000000--0x7fffff)
61*35238bceSAndroid Build Coastguard Worker      */
62*35238bceSAndroid Build Coastguard Worker     deRandom rnd;
63*35238bceSAndroid Build Coastguard Worker     int idx;
64*35238bceSAndroid Build Coastguard Worker 
65*35238bceSAndroid Build Coastguard Worker     deRandom_init(&rnd, 0xdeadbeefu - 1);
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker     /* --- For rounding mode RTZ --- */
68*35238bceSAndroid Build Coastguard Worker 
69*35238bceSAndroid Build Coastguard Worker     /* Zero */
70*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0, 0)) == getFloat16(0, 0, 0));
71*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0, 0)) == getFloat16(1, 0, 0));
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker     /* Inf */
74*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0)) == getFloat16(0, 0x1f, 0));
75*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0)) == getFloat16(1, 0x1f, 0));
76*35238bceSAndroid Build Coastguard Worker 
77*35238bceSAndroid Build Coastguard Worker     /* SNaN */
78*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 1)) == getFloat16(0, 0x1f, 1));
79*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 1)) == getFloat16(1, 0x1f, 1));
80*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0x3fffff)) == getFloat16(0, 0x1f, 0x1ff));
81*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0x3fffff)) == getFloat16(1, 0x1f, 0x1ff));
82*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0x0003ff)) == getFloat16(0, 0x1f, 1));
83*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0x0003ff)) == getFloat16(1, 0x1f, 1));
84*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0x123456)) == getFloat16(0, 0x1f, 0x123456 >> 13));
85*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0x123456)) == getFloat16(1, 0x1f, 0x123456 >> 13));
86*35238bceSAndroid Build Coastguard Worker 
87*35238bceSAndroid Build Coastguard Worker     /* QNaN */
88*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0x400000)) == getFloat16(0, 0x1f, 0x200));
89*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0x400000)) == getFloat16(1, 0x1f, 0x200));
90*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0x7fffff)) == getFloat16(0, 0x1f, 0x3ff));
91*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0x7fffff)) == getFloat16(1, 0x1f, 0x3ff));
92*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0x4003ff)) == getFloat16(0, 0x1f, 0x200));
93*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0x4003ff)) == getFloat16(1, 0x1f, 0x200));
94*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0xff, 0x723456)) == getFloat16(0, 0x1f, 0x723456 >> 13));
95*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0xff, 0x723456)) == getFloat16(1, 0x1f, 0x723456 >> 13));
96*35238bceSAndroid Build Coastguard Worker 
97*35238bceSAndroid Build Coastguard Worker     /* Denormalized */
98*35238bceSAndroid Build Coastguard Worker     for (idx = 0; idx < 256; ++idx)
99*35238bceSAndroid Build Coastguard Worker     {
100*35238bceSAndroid Build Coastguard Worker         uint32_t mantissa = deRandom_getUint32(&rnd);
101*35238bceSAndroid Build Coastguard Worker 
102*35238bceSAndroid Build Coastguard Worker         mantissa &= 0x7fffffu;       /* Take the last 23 bits */
103*35238bceSAndroid Build Coastguard Worker         mantissa |= (mantissa == 0); /* Make sure it is not zero */
104*35238bceSAndroid Build Coastguard Worker 
105*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 0, mantissa)) == getFloat16(0, 0, 0));
106*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 0, mantissa)) == getFloat16(1, 0, 0));
107*35238bceSAndroid Build Coastguard Worker     }
108*35238bceSAndroid Build Coastguard Worker 
109*35238bceSAndroid Build Coastguard Worker     /* Normalized -> zero */
110*35238bceSAndroid Build Coastguard Worker     /* Absolute value: minimal 32-bit normalized */
111*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 1, 0)) == getFloat16(0, 0, 0));
112*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 1, 0)) == getFloat16(1, 0, 0));
113*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-24 - e, extremely near minimal 16-bit denormalized */
114*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 25, 0x7fffff)) == getFloat16(0, 0, 0));
115*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 25, 0x7fffff)) == getFloat16(1, 0, 0));
116*35238bceSAndroid Build Coastguard Worker     for (idx = 0; idx < 256; ++idx)
117*35238bceSAndroid Build Coastguard Worker     {
118*35238bceSAndroid Build Coastguard Worker         uint32_t exponent = deRandom_getUint32(&rnd);
119*35238bceSAndroid Build Coastguard Worker         uint32_t mantissa = deRandom_getUint32(&rnd);
120*35238bceSAndroid Build Coastguard Worker 
121*35238bceSAndroid Build Coastguard Worker         exponent = exponent % (127 - 25) + 1; /* Make sure >= 1, <= 127 - 25 */
122*35238bceSAndroid Build Coastguard Worker         mantissa &= 0x7fffffu;                /* Take the last 23 bits */
123*35238bceSAndroid Build Coastguard Worker 
124*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, exponent, mantissa)) == getFloat16(0, 0, 0));
125*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, exponent, mantissa)) == getFloat16(1, 0, 0));
126*35238bceSAndroid Build Coastguard Worker     }
127*35238bceSAndroid Build Coastguard Worker 
128*35238bceSAndroid Build Coastguard Worker     /* Normalized -> denormalized */
129*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-24, minimal 16-bit denormalized */
130*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 24, 0)) == getFloat16(0, 0, 1));
131*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 24, 0)) == getFloat16(1, 0, 1));
132*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 24, 1)) == getFloat16(0, 0, 1));
133*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 24, 1)) == getFloat16(1, 0, 1));
134*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 20, 0x123456)) == getFloat16(0, 0, 0x12));
135*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 20, 0x123456)) == getFloat16(1, 0, 0x12));
136*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 18, 0x654321)) == getFloat16(0, 0, 0x72));
137*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 18, 0x654321)) == getFloat16(1, 0, 0x72));
138*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-14 - 2^-24 = (2 - 2^-9) * 2^-15, maximal 16-bit denormalized */
139*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 15, 0x7fc000)) ==
140*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 0x3ff)); /* 0x7fc000: 0111 1111 1100 0000 0000 0000 */
141*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 15, 0x7fc000)) == getFloat16(1, 0, 0x3ff));
142*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 15, 0x7fc000 - 1)) == getFloat16(0, 0, 0x3fe));
143*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 15, 0x7fc000 - 1)) == getFloat16(1, 0, 0x3fe));
144*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 15, 0x7fc000 + 1)) == getFloat16(0, 0, 0x3ff));
145*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 15, 0x7fc000 + 1)) == getFloat16(1, 0, 0x3ff));
146*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 15, 0x7fffff)) == getFloat16(0, 0, 0x3ff));
147*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 15, 0x7fffff)) == getFloat16(1, 0, 0x3ff));
148*35238bceSAndroid Build Coastguard Worker 
149*35238bceSAndroid Build Coastguard Worker     /* Normalized -> normalized */
150*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-14, minimal 16-bit normalized */
151*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 - 14, 0)) == getFloat16(0, 1, 0));
152*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 - 14, 0)) == getFloat16(1, 1, 0));
153*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 65504 - 2^-23, extremely near maximal 16-bit normalized */
154*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 + 15, (0x3ff << 13) - 1)) == getFloat16(0, 0x1e, 0x3fe));
155*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 + 15, (0x3ff << 13) - 1)) == getFloat16(1, 0x1e, 0x3fe));
156*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 + 15, (0x3ff << 13) - 0x456)) == getFloat16(0, 0x1e, 0x3fe));
157*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 + 15, (0x3ff << 13) - 0x456)) == getFloat16(1, 0x1e, 0x3fe));
158*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 65504, maximal 16-bit normalized */
159*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 + 15, 0x3ff << 13)) == getFloat16(0, 0x1e, 0x3ff));
160*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 + 15, 0x3ff << 13)) == getFloat16(1, 0x1e, 0x3ff));
161*35238bceSAndroid Build Coastguard Worker     for (idx = 0; idx < 256; ++idx)
162*35238bceSAndroid Build Coastguard Worker     {
163*35238bceSAndroid Build Coastguard Worker         uint32_t exponent = deRandom_getUint32(&rnd);
164*35238bceSAndroid Build Coastguard Worker         uint32_t mantissa = deRandom_getUint32(&rnd);
165*35238bceSAndroid Build Coastguard Worker 
166*35238bceSAndroid Build Coastguard Worker         exponent = exponent % ((127 + 14) - (127 - 14) + 1) + (127 - 14); /* Make sure >= 127 - 14, <= 127 + 14 */
167*35238bceSAndroid Build Coastguard Worker         mantissa &= 0x7fffffu;                                            /* Take the last 23 bits */
168*35238bceSAndroid Build Coastguard Worker 
169*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, exponent, mantissa)) ==
170*35238bceSAndroid Build Coastguard Worker                        getFloat16(0, (uint16_t)(exponent + 15 - 127), (uint16_t)(mantissa >> 13)));
171*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, exponent, mantissa)) ==
172*35238bceSAndroid Build Coastguard Worker                        getFloat16(1, (uint16_t)(exponent + 15 - 127), (uint16_t)(mantissa >> 13)));
173*35238bceSAndroid Build Coastguard Worker     }
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker     /* Normalized -> minimal/maximal normalized */
176*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 + 15, (0x3ff << 13) + 1)) == getFloat16(0, 0x1e, 0x3ff));
177*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 + 15, (0x3ff << 13) + 1)) == getFloat16(1, 0x1e, 0x3ff));
178*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, 127 + 15, (0x3ff << 13) + 0x123)) == getFloat16(0, 0x1e, 0x3ff));
179*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, 127 + 15, (0x3ff << 13) + 0x123)) == getFloat16(1, 0x1e, 0x3ff));
180*35238bceSAndroid Build Coastguard Worker     for (idx = 0; idx < 256; ++idx)
181*35238bceSAndroid Build Coastguard Worker     {
182*35238bceSAndroid Build Coastguard Worker         uint32_t exponent = deRandom_getUint32(&rnd);
183*35238bceSAndroid Build Coastguard Worker         uint32_t mantissa = deRandom_getUint32(&rnd);
184*35238bceSAndroid Build Coastguard Worker 
185*35238bceSAndroid Build Coastguard Worker         exponent = exponent % (0xfe - (127 + 16) + 1) + (127 + 16); /* Make sure >= 127 + 16, <= 0xfe */
186*35238bceSAndroid Build Coastguard Worker         mantissa &= 0x7fffffu;                                      /* Take the last 23 bits */
187*35238bceSAndroid Build Coastguard Worker 
188*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(0, exponent, mantissa)) == getFloat16(0, 0x1e, 0x3ff));
189*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTZ(getFloat32(1, exponent, mantissa)) == getFloat16(1, 0x1e, 0x3ff));
190*35238bceSAndroid Build Coastguard Worker     }
191*35238bceSAndroid Build Coastguard Worker 
192*35238bceSAndroid Build Coastguard Worker     /* --- For rounding mode RTE --- */
193*35238bceSAndroid Build Coastguard Worker 
194*35238bceSAndroid Build Coastguard Worker     /* Zero */
195*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0, 0)) == getFloat16(0, 0, 0));
196*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0, 0)) == getFloat16(1, 0, 0));
197*35238bceSAndroid Build Coastguard Worker 
198*35238bceSAndroid Build Coastguard Worker     /* Inf */
199*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0)) == getFloat16(0, 0x1f, 0));
200*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0)) == getFloat16(1, 0x1f, 0));
201*35238bceSAndroid Build Coastguard Worker 
202*35238bceSAndroid Build Coastguard Worker     /* SNaN */
203*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 1)) == getFloat16(0, 0x1f, 1));
204*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 1)) == getFloat16(1, 0x1f, 1));
205*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0x3fffff)) == getFloat16(0, 0x1f, 0x1ff));
206*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0x3fffff)) == getFloat16(1, 0x1f, 0x1ff));
207*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0x0003ff)) == getFloat16(0, 0x1f, 1));
208*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0x0003ff)) == getFloat16(1, 0x1f, 1));
209*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0x123456)) == getFloat16(0, 0x1f, 0x123456 >> 13));
210*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0x123456)) == getFloat16(1, 0x1f, 0x123456 >> 13));
211*35238bceSAndroid Build Coastguard Worker 
212*35238bceSAndroid Build Coastguard Worker     /* QNaN */
213*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0x400000)) == getFloat16(0, 0x1f, 0x200));
214*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0x400000)) == getFloat16(1, 0x1f, 0x200));
215*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0x7fffff)) == getFloat16(0, 0x1f, 0x3ff));
216*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0x7fffff)) == getFloat16(1, 0x1f, 0x3ff));
217*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0x4003ff)) == getFloat16(0, 0x1f, 0x200));
218*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0x4003ff)) == getFloat16(1, 0x1f, 0x200));
219*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0xff, 0x723456)) == getFloat16(0, 0x1f, 0x723456 >> 13));
220*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0xff, 0x723456)) == getFloat16(1, 0x1f, 0x723456 >> 13));
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker     /* Denormalized */
223*35238bceSAndroid Build Coastguard Worker     for (idx = 0; idx < 256; ++idx)
224*35238bceSAndroid Build Coastguard Worker     {
225*35238bceSAndroid Build Coastguard Worker         uint32_t mantissa = deRandom_getUint32(&rnd);
226*35238bceSAndroid Build Coastguard Worker 
227*35238bceSAndroid Build Coastguard Worker         mantissa &= 0x7fffffu;       /* Take the last 23 bits */
228*35238bceSAndroid Build Coastguard Worker         mantissa |= (mantissa == 0); /* Make sure it is not zero */
229*35238bceSAndroid Build Coastguard Worker 
230*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 0, mantissa)) == getFloat16(0, 0, 0));
231*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 0, mantissa)) == getFloat16(1, 0, 0));
232*35238bceSAndroid Build Coastguard Worker     }
233*35238bceSAndroid Build Coastguard Worker 
234*35238bceSAndroid Build Coastguard Worker     /* Normalized -> zero and denormalized */
235*35238bceSAndroid Build Coastguard Worker     /* Absolute value: minimal 32-bit normalized */
236*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 1, 0)) == getFloat16(0, 0, 0));
237*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 1, 0)) == getFloat16(1, 0, 0));
238*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 42, 0x7abcde)) == getFloat16(0, 0, 0));
239*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 42, 0x7abcde)) == getFloat16(1, 0, 0));
240*35238bceSAndroid Build Coastguard Worker     for (idx = 0; idx < 256; ++idx)
241*35238bceSAndroid Build Coastguard Worker     {
242*35238bceSAndroid Build Coastguard Worker         uint32_t exponent = deRandom_getUint32(&rnd);
243*35238bceSAndroid Build Coastguard Worker         uint32_t mantissa = deRandom_getUint32(&rnd);
244*35238bceSAndroid Build Coastguard Worker 
245*35238bceSAndroid Build Coastguard Worker         exponent = exponent % (127 - 26) + 1; /* Make sure >= 1, <= 127 - 26 */
246*35238bceSAndroid Build Coastguard Worker         mantissa &= 0x7fffffu;                /* Take the last 23 bits */
247*35238bceSAndroid Build Coastguard Worker 
248*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, exponent, mantissa)) == getFloat16(0, 0, 0));
249*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, exponent, mantissa)) == getFloat16(1, 0, 0));
250*35238bceSAndroid Build Coastguard Worker     }
251*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-25, minimal 16-bit denormalized: 2^-24 */
252*35238bceSAndroid Build Coastguard Worker     /* The following six cases need to right shift mantissa (with leading 1) 10 bits  --------------------> to here */
253*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 25, 0)) ==
254*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 0)); /* XX XXXX XXXX 1 000 0000 0000 0000 0000 0000 */
255*35238bceSAndroid Build Coastguard Worker     /*                                                    Take the first 10 bits with RTE ------ 00 0000 0000 */
256*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 25, 0)) == getFloat16(1, 0, 0));
257*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 25, 1)) ==
258*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 1)); /* XX XXXX XXXX 1 000 0000 0000 0000 0000 0001 */
259*35238bceSAndroid Build Coastguard Worker     /*                                                    Take the first 10 bits with RTE ------ 00 0000 0001 */
260*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 25, 1)) == getFloat16(1, 0, 1));
261*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-24 - e, extremely near minimal 16-bit denormalized */
262*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 25, 0x7fffff)) == getFloat16(0, 0, 1));
263*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 25, 0x7fffff)) == getFloat16(1, 0, 1));
264*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-24, minimal 16-bit denormalized */
265*35238bceSAndroid Build Coastguard Worker     /* The following (127 - 24) cases need to right shift mantissa (with leading 1) 9 bits  -----------------> to here */
266*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 24, 0)) ==
267*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 1)); /* X XXXX XXXX 1 000 0000 0000 0000 0000 0000 */
268*35238bceSAndroid Build Coastguard Worker     /*                                                    Take the first 10 bits with RTE ---------- 0 0000 0000 1 */
269*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 24, 0)) == getFloat16(1, 0, 1));
270*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 24, 1)) ==
271*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 1)); /* X XXXX XXXX 1 000 0000 0000 0000 0000 0001 */
272*35238bceSAndroid Build Coastguard Worker     /*                                                    Take the first 10 bits with RTE ---------- 0 0000 0000 1 */
273*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 24, 1)) == getFloat16(1, 0, 1));
274*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 24, 0x400000)) ==
275*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 2)); /* X XXXX XXXX 1 100 0000 0000 0000 0000 0000 */
276*35238bceSAndroid Build Coastguard Worker     /*                                                    Take the first 10 bits with RTE ---------- 0 0000 0000 2 */
277*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 24, 0x400000)) == getFloat16(1, 0, 2));
278*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 24, 0x400001)) ==
279*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 2)); /* X XXXX XXXX 1 100 0000 0000 0000 0000 0001 */
280*35238bceSAndroid Build Coastguard Worker     /*                                                    Take the first 10 bits with RTE ---------- 0 0000 0000 2 */
281*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 24, 0x400001)) == getFloat16(1, 0, 2));
282*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 24, 0x4fffff)) == getFloat16(0, 0, 2));
283*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 24, 0x4fffff)) == getFloat16(1, 0, 2));
284*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 20, 0x123456)) == getFloat16(0, 0, 0x12));
285*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 20, 0x123456)) == getFloat16(1, 0, 0x12));
286*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 18, 0x654321)) == getFloat16(0, 0, 0x73));
287*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 18, 0x654321)) == getFloat16(1, 0, 0x73));
288*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-14 - 2^-24 = (2 - 2^-9) * 2^-15, maximal 16-bit denormalized */
289*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 15, 0x7fc000)) ==
290*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0, 0x3ff)); /* 0x7fc000: 0111 1111 1100 0000 0000 0000 */
291*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 15, 0x7fc000)) == getFloat16(1, 0, 0x3ff));
292*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 15, 0x7fc000 - 1)) == getFloat16(0, 0, 0x3ff));
293*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 15, 0x7fc000 - 1)) == getFloat16(1, 0, 0x3ff));
294*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 15, 0x7fc000 + 1)) == getFloat16(0, 0, 0x3ff));
295*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 15, 0x7fc000 + 1)) == getFloat16(1, 0, 0x3ff));
296*35238bceSAndroid Build Coastguard Worker 
297*35238bceSAndroid Build Coastguard Worker     /* Normalized -> normalized */
298*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 15, 0x7fe000)) ==
299*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 1, 0)); /* 0x7fe000: 0111 1111 1110 0000 0000 0000 */
300*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 15, 0x7fe000)) == getFloat16(1, 1, 0));
301*35238bceSAndroid Build Coastguard Worker     /* Absolute value: (2 - 2^-23) * 2^-15, extremely near 2^-14, minimal 16-bit normalized */
302*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 15, 0x7fffff)) == getFloat16(0, 1, 0));
303*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 15, 0x7fffff)) == getFloat16(1, 1, 0));
304*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 2^-14, minimal 16-bit normalized */
305*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 - 14, 0)) == getFloat16(0, 1, 0));
306*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 - 14, 0)) == getFloat16(1, 1, 0));
307*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, (0x3fe << 13) + (1 << 12))) == getFloat16(0, 0x1e, 0x3fe));
308*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, (0x3fe << 13) + (1 << 12))) == getFloat16(1, 0x1e, 0x3fe));
309*35238bceSAndroid Build Coastguard Worker 
310*35238bceSAndroid Build Coastguard Worker     /* Normalized -> minimal/maximal normalized */
311*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, (0x3fe << 13) + (1 << 12) + 1)) ==
312*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0x1e, 0x3ff));
313*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, (0x3fe << 13) + (1 << 12) + 1)) ==
314*35238bceSAndroid Build Coastguard Worker                    getFloat16(1, 0x1e, 0x3ff));
315*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 65504 - 2^-23, extremely near maximal 16-bit normalized */
316*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, (0x3ff << 13) - 1)) == getFloat16(0, 0x1e, 0x3ff));
317*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, (0x3ff << 13) - 1)) == getFloat16(1, 0x1e, 0x3ff));
318*35238bceSAndroid Build Coastguard Worker     /* Absolute value: 65504, maximal 16-bit normalized */
319*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, 0x3ff << 13)) == getFloat16(0, 0x1e, 0x3ff));
320*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, 0x3ff << 13)) == getFloat16(1, 0x1e, 0x3ff));
321*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, (0x3ff << 13) + 1)) == getFloat16(0, 0x1e, 0x3ff));
322*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, (0x3ff << 13) + 1)) == getFloat16(1, 0x1e, 0x3ff));
323*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, (0x3ff << 13) + 0x456)) == getFloat16(0, 0x1e, 0x3ff));
324*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, (0x3ff << 13) + 0x456)) == getFloat16(1, 0x1e, 0x3ff));
325*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, (0x3ff << 13) + (1 << 12) - 1)) ==
326*35238bceSAndroid Build Coastguard Worker                    getFloat16(0, 0x1e, 0x3ff));
327*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, (0x3ff << 13) + (1 << 12) - 1)) ==
328*35238bceSAndroid Build Coastguard Worker                    getFloat16(1, 0x1e, 0x3ff));
329*35238bceSAndroid Build Coastguard Worker 
330*35238bceSAndroid Build Coastguard Worker     /* Normalized -> Inf */
331*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, (0x3ff << 13) + (1 << 12))) == getFloat16(0, 0x1f, 0));
332*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, (0x3ff << 13) + (1 << 12))) == getFloat16(1, 0x1f, 0));
333*35238bceSAndroid Build Coastguard Worker     /* Absolute value: maximal 32-bit normalized */
334*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, 127 + 15, 0x7fffff)) == getFloat16(0, 0x1f, 0));
335*35238bceSAndroid Build Coastguard Worker     DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, 127 + 15, 0x7fffff)) == getFloat16(1, 0x1f, 0));
336*35238bceSAndroid Build Coastguard Worker     for (idx = 0; idx < 256; ++idx)
337*35238bceSAndroid Build Coastguard Worker     {
338*35238bceSAndroid Build Coastguard Worker         uint32_t exponent = deRandom_getUint32(&rnd);
339*35238bceSAndroid Build Coastguard Worker         uint32_t mantissa = deRandom_getUint32(&rnd);
340*35238bceSAndroid Build Coastguard Worker 
341*35238bceSAndroid Build Coastguard Worker         exponent = exponent % (0xfe - (127 + 16) + 1) + (127 + 16); /* Make sure >= 127 + 16, <= 0xfe */
342*35238bceSAndroid Build Coastguard Worker         mantissa &= 0x7fffffu;                                      /* Take the last 23 bits */
343*35238bceSAndroid Build Coastguard Worker 
344*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(0, exponent, mantissa)) == getFloat16(0, 0x1f, 0));
345*35238bceSAndroid Build Coastguard Worker         DE_TEST_ASSERT(deFloat32To16RTE(getFloat32(1, exponent, mantissa)) == getFloat16(1, 0x1f, 0));
346*35238bceSAndroid Build Coastguard Worker     }
347*35238bceSAndroid Build Coastguard Worker }
348*35238bceSAndroid Build Coastguard Worker 
349*35238bceSAndroid Build Coastguard Worker DE_END_EXTERN_C
350