History

Round mode of ll -> float conversion to nearest

Change rounding mode of long long to float conversion to nearest in libtcc1.

Thomas Preud'homme committed 12 years ago

Commit 88c9f1b1 parent d0295071 file · +20 −5Browse files

Unified · Split

lib/armeabi.c+20−5
@@ -170,7 +170,7 @@ DEFINE__AEABI_D2XLZ(d2lz, 1) · 169 unmodified lines
170170 #define DEFINE__AEABI_XL2F(name, with_sign) \
171171 unsigned __aeabi_ ## name(unsigned long long v) \
172172 { \
173− int s /* shift */, sign = 0; \
173+ int s /* shift */, flb /* first lost bit */, sign = 0; \
174174 unsigned p = 0 /* power */, ret; \
175175 double_unsigned_struct val; \
176176 \
@@ -188,20 +188,28 @@ unsigned __aeabi_ ## name(unsigned long long v) \ · 11 unmodified lines
188188 if (s < FLOAT_FRAC_BITS) { \
189189 ret <<= FLOAT_FRAC_BITS - s; \
190190 ret |= val.low >> (32 - (FLOAT_FRAC_BITS - s)); \
191− } else \
191+ flb = (val.low >> (32 - (FLOAT_FRAC_BITS - s - 1))) & 1; \
192+ } else { \
193+ flb = (ret >> (s - FLOAT_FRAC_BITS - 1)) & 1; \
192194 ret >>= s - FLOAT_FRAC_BITS; \
195+ } \
193196 s += 32; \
194197 } else { \
195198 for (s = 31, p = 1 << 31; p && !(val.low & p); s--, p >>= 1); \
196199 if (p) { \
197200 ret = val.low & (p - 1); \
198− if (s <= FLOAT_FRAC_BITS) \
201+ if (s <= FLOAT_FRAC_BITS) { \
199202 ret <<= FLOAT_FRAC_BITS - s; \
200− else \
203+ flb = 0; \
204+ } else { \
205+ flb = (ret >> (s - FLOAT_FRAC_BITS - 1)) & 1; \
201206 ret >>= s - FLOAT_FRAC_BITS; \
207+ } \
202208 } else \
203209 return 0; \
204210 } \
211+ if (flb) \
212+ ret++; \
205213 \
206214 /* fill exponent bits */ \
207215 ret |= (s + ONE_EXP(FLOAT)) << FLOAT_FRAC_BITS; \
@@ -222,7 +230,7 @@ DEFINE__AEABI_XL2F(l2f, 1) · 14 unmodified lines
222230 #define __AEABI_XL2D(name, with_sign) \
223231 void __aeabi_ ## name(unsigned long long v) \
224232 { \
225− int s, high_shift, sign = 0; \
233+ int s /* shift */, high_shift, sign = 0; \
226234 unsigned tmp, p = 0; \
227235 double_unsigned_struct val, ret; \
228236 \
@@ -248,6 +256,13 @@ void __aeabi_ ## name(unsigned long long v) \ · 19 unmodified lines
248256 ret.high = tmp >> high_shift; \
249257 ret.low = tmp << (32 - high_shift); \
250258 ret.low |= val.low >> high_shift; \
259+ if ((val.low >> (high_shift - 1)) & 1) { \
260+ if (ret.low == UINT_MAX) { \
261+ ret.high++; \
262+ ret.low = 0; \
263+ } else \
264+ ret.low++; \
265+ } \
251266 } \
252267 s += 32; \
253268 } else { \

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t