Fix va_arg bug, Fix type conversion bug, an increase of loc_stack () function is used to manage loc

This commit is contained in:
jiang
2014-04-30 15:26:45 +08:00
parent 9ff288648b
commit 5af0ea7fb8
5 changed files with 236 additions and 154 deletions

View File

@ -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;
register union double_long dl1;
register int exp;
register unsigned long long l;
int s;
dl1.d = a1;
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;
register union ldouble_long dl1;
register int exp;
register unsigned long long l;
int s;
dl1.ld = a1;
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;
s = SIGNLD(dl1)? -1: 1;
l = dl1.l.lower;
exp = EXPLD (dl1) - EXCESSLD - 64;
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: