aboutsummaryrefslogtreecommitdiff
path: root/lib/libtcc1.c
diff options
context:
space:
mode:
authorjiang <30155751@qq.com>2014-04-30 15:26:45 +0800
committerjiang <30155751@qq.com>2014-04-30 15:26:45 +0800
commit5af0ea7fb8d6b2b2a2d3833caad5eda4b43ef595 (patch)
tree3d842579c3cd440a9dc246697da85554cd0270df /lib/libtcc1.c
parent9ff288648b23537c205e4dad16002e2b9ca03203 (diff)
downloadtinycc-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.c110
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: