diff --git a/include/stdarg.h b/include/stdarg.h index 34061d06..08c5ded5 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 979ad8df..00ac4917 100644 --- a/lib/stdio/vfprintf.c +++ b/lib/stdio/vfprintf.c @@ -188,7 +188,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 a8d9624d..b1ed2e0a 100644 --- a/lib/stdio/vsnprintf.c +++ b/lib/stdio/vsnprintf.c @@ -204,7 +204,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);