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
170#define DEFINE__AEABI_XL2F(name, with_sign) \170#define DEFINE__AEABI_XL2F(name, with_sign) \
171unsigned __aeabi_ ## name(unsigned long long v) \171unsigned __aeabi_ ## name(unsigned long long v) \
172{ \172{ \
173 int s /* shift */, sign = 0; \173 int s /* shift */, flb /* first lost bit */, sign = 0; \
174 unsigned p = 0 /* power */, ret; \174 unsigned p = 0 /* power */, ret; \
175 double_unsigned_struct val; \175 double_unsigned_struct val; \
176 \176 \
@@ -188,20 +188,28 @@ unsigned __aeabi_ ## name(unsigned long long v) \ · 11 unmodified lines
188 if (s < FLOAT_FRAC_BITS) { \188 if (s < FLOAT_FRAC_BITS) { \
189 ret <<= FLOAT_FRAC_BITS - s; \189 ret <<= FLOAT_FRAC_BITS - s; \
190 ret |= val.low >> (32 - (FLOAT_FRAC_BITS - s)); \190 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; \
192 ret >>= s - FLOAT_FRAC_BITS; \194 ret >>= s - FLOAT_FRAC_BITS; \
195 } \
193 s += 32; \196 s += 32; \
194 } else { \197 } else { \
195 for (s = 31, p = 1 << 31; p && !(val.low & p); s--, p >>= 1); \198 for (s = 31, p = 1 << 31; p && !(val.low & p); s--, p >>= 1); \
196 if (p) { \199 if (p) { \
197 ret = val.low & (p - 1); \200 ret = val.low & (p - 1); \
198 if (s <= FLOAT_FRAC_BITS) \201 if (s <= FLOAT_FRAC_BITS) { \
199 ret <<= FLOAT_FRAC_BITS - s; \202 ret <<= FLOAT_FRAC_BITS - s; \
200 else \203 flb = 0; \
204 } else { \
205 flb = (ret >> (s - FLOAT_FRAC_BITS - 1)) & 1; \
201 ret >>= s - FLOAT_FRAC_BITS; \206 ret >>= s - FLOAT_FRAC_BITS; \
207 } \
202 } else \208 } else \
203 return 0; \209 return 0; \
204 } \210 } \
211 if (flb) \
212 ret++; \
205 \213 \
206 /* fill exponent bits */ \214 /* fill exponent bits */ \
207 ret |= (s + ONE_EXP(FLOAT)) << FLOAT_FRAC_BITS; \215 ret |= (s + ONE_EXP(FLOAT)) << FLOAT_FRAC_BITS; \
@@ -222,7 +230,7 @@ DEFINE__AEABI_XL2F(l2f, 1) · 14 unmodified lines
222#define __AEABI_XL2D(name, with_sign) \230#define __AEABI_XL2D(name, with_sign) \
223void __aeabi_ ## name(unsigned long long v) \231void __aeabi_ ## name(unsigned long long v) \
224{ \232{ \
225 int s, high_shift, sign = 0; \233 int s /* shift */, high_shift, sign = 0; \
226 unsigned tmp, p = 0; \234 unsigned tmp, p = 0; \
227 double_unsigned_struct val, ret; \235 double_unsigned_struct val, ret; \
228 \236 \
@@ -248,6 +256,13 @@ void __aeabi_ ## name(unsigned long long v) \ · 19 unmodified lines
248 ret.high = tmp >> high_shift; \256 ret.high = tmp >> high_shift; \
249 ret.low = tmp << (32 - high_shift); \257 ret.low = tmp << (32 - high_shift); \
250 ret.low |= val.low >> high_shift; \258 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 } \
251 } \266 } \
252 s += 32; \267 s += 32; \
253 } else { \268 } 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