diff options
| author | jiang <30155751@qq.com> | 2014-04-30 15:26:45 +0800 |
|---|---|---|
| committer | jiang <30155751@qq.com> | 2014-04-30 15:26:45 +0800 |
| commit | 5af0ea7fb8d6b2b2a2d3833caad5eda4b43ef595 (patch) | |
| tree | 3d842579c3cd440a9dc246697da85554cd0270df /lib/libtcc1.c | |
| parent | 9ff288648b23537c205e4dad16002e2b9ca03203 (diff) | |
| download | tinycc-5af0ea7fb8d6b2b2a2d3833caad5eda4b43ef595.tar.gz tinycc-5af0ea7fb8d6b2b2a2d3833caad5eda4b43ef595.tar.bz2 | |
Fix va_arg bug, Fix type conversion bug, an increase of loc_stack () function is used to manage loc
Diffstat (limited to 'lib/libtcc1.c')
| -rw-r--r-- | lib/libtcc1.c | 110 |
1 files changed, 57 insertions, 53 deletions
diff --git a/lib/libtcc1.c b/lib/libtcc1.c index 284965e..d7d895a 100644 --- a/lib/libtcc1.c +++ b/lib/libtcc1.c @@ -530,74 +530,77 @@ long double __floatundixf(unsigned long long a) unsigned long long __fixunssfdi (float a1) { - register union float_long fl1; - register int exp; - register unsigned long l; + register union float_long fl1; + register int exp; + register unsigned long l; + int s; + fl1.f = a1; - fl1.f = a1; + if (fl1.l == 0) + return 0; - if (fl1.l == 0) - return (0); + exp = EXP (fl1.l) - EXCESS - 24; - exp = EXP (fl1.l) - EXCESS - 24; - - l = MANT(fl1.l); - if (exp >= 41) - return (unsigned long long)-1; - else if (exp >= 0) - return (unsigned long long)l << exp; - else if (exp >= -23) - return l >> -exp; - else - return 0; + l = MANT(fl1.l); + s = SIGN(fl1.l)? -1: 1; + if (exp >= 64) + return (unsigned long long)-1; + else if (exp >= 0) + return ((unsigned long long)l << exp)*s; + else if (exp >= -23) + return (l >> -exp)*s; + else + return 0; } unsigned long long __fixunsdfdi (double a1) { - register union double_long dl1; - register int exp; - register unsigned long long l; - - dl1.d = a1; + register union double_long dl1; + register int exp; + register unsigned long long l; + int s; + dl1.d = a1; - if (dl1.ll == 0) - return (0); + if (dl1.ll == 0) + return (0); - exp = EXPD (dl1) - EXCESSD - 53; + exp = EXPD (dl1) - EXCESSD - 53; - l = MANTD_LL(dl1); - - if (exp >= 12) - return (unsigned long long)-1; - else if (exp >= 0) - return l << exp; - else if (exp >= -52) - return l >> -exp; - else - return 0; + l = MANTD_LL(dl1); + s = SIGND(dl1)? -1: 1; + if (exp >= 64) + return (unsigned long long)-1; + else if (exp >= 0) + return (l << exp)*s; + else if (exp >= -52) + return (l >> -exp)*s; + else + return 0; } unsigned long long __fixunsxfdi (long double a1) { - register union ldouble_long dl1; - register int exp; - register unsigned long long l; - - dl1.ld = a1; + register union ldouble_long dl1; + register int exp; + register unsigned long long l; + int s; + dl1.ld = a1; - if (dl1.l.lower == 0 && dl1.l.upper == 0) - return (0); + if (dl1.l.lower == 0 && dl1.l.upper == 0) + return (0); - exp = EXPLD (dl1) - EXCESSLD - 64; + exp = EXPLD (dl1) - EXCESSLD - 64; + s = SIGNLD(dl1)? -1: 1; + l = dl1.l.lower; - l = dl1.l.lower; - - if (exp > 0) - return (unsigned long long)-1; - else if (exp >= -63) - return l >> -exp; - else - return 0; + if (exp >= 64) + return (unsigned long long)-1; + else if (exp >= 0) + return ((unsigned long long)l << exp)*s; + else if (exp >= -64) + return (l >> -exp)*s; + else + return 0; } long long __fixsfdi (float a1) @@ -637,7 +640,7 @@ extern void abort(void); #endif enum __va_arg_type { - __va_gen_reg, __va_float_reg, __va_stack + __va_gen_reg, __va_float_reg, __va_ld_reg, __va_stack }; //This should be in sync with the declaration on our include/stdarg.h @@ -688,10 +691,11 @@ void *__va_arg(__va_list_struct *ap, size = 8; goto use_overflow_area; + case __va_ld_reg: + ap->overflow_arg_area = (char*)((intptr_t)(ap->overflow_arg_area + align - 1) & -(intptr_t)align); case __va_stack: use_overflow_area: ap->overflow_arg_area += size; - ap->overflow_arg_area = (char*)((intptr_t)(ap->overflow_arg_area + align - 1) & -(intptr_t)align); return ap->overflow_arg_area - size; default: |
