diff --git a/include/stdarg.h b/include/stdarg.h index 7e31557a..3d5567f6 100644 --- a/include/stdarg.h +++ b/include/stdarg.h @@ -34,6 +34,8 @@ typedef char *va_list; #define va_start(ap, last) (void)((ap) = (char*)(&(last) + 1)) #define va_arg(ap, type) (type)(((long*)((ap) = ((ap) + sizeof (void*))))[-1]) +#define va_align(ap, alignment) ((((unsigned long) (unsigned char*) ap) + (alignment) - 1) &~ (alignment - 1)) +#define va_arg8(ap, type) (type)(((double*)((ap) = (va_align((ap), 8) + sizeof(double))))[-1]) #define va_end(ap) (void)((ap) = 0) #define va_copy(dest, src) dest = src diff --git a/lib/stdio/vfprintf.c b/lib/stdio/vfprintf.c index ef1db89c..7f2c55ee 100644 --- a/lib/stdio/vfprintf.c +++ b/lib/stdio/vfprintf.c @@ -211,7 +211,7 @@ vfprintf (FILE * f, char const *format, va_list ap) case 'g': case 'G': { - double d = va_arg (ap, double); + double d = va_arg8 (ap, double); char *s = dtoab (d, 10, 1); if (c == 'E' || c == 'G') strupr (s); diff --git a/lib/stdio/vsnprintf.c b/lib/stdio/vsnprintf.c index 2c0aa11b..c1b56840 100644 --- a/lib/stdio/vsnprintf.c +++ b/lib/stdio/vsnprintf.c @@ -227,7 +227,7 @@ vsnprintf (char *str, size_t size, char const *format, va_list ap) case 'g': case 'G': { - double d = va_arg (ap, double); + double d = va_arg8 (ap, double); char *s = dtoab (d, 10, 1); if (c == 'E' || c == 'G') strupr (s);