diff --git a/src/libc/stdio/doprnt.c b/src/libc/stdio/doprnt.c index 40a8998..2a5bae4 100644 --- a/src/libc/stdio/doprnt.c +++ b/src/libc/stdio/doprnt.c @@ -53,10 +53,10 @@ static unsigned char mkhex (unsigned char ch); static int cvt (double number, int prec, int sharpflag, unsigned char *negp, unsigned char fmtch, unsigned char *startp, unsigned char *endp); - union { - unsigned long u32; - va_list ap32; - } x; +// union { +// unsigned long u32; +// va_list ap32; +// } x; int _doprnt (char const *fmt, va_list ap, FILE *stream) @@ -368,13 +368,18 @@ number: if (sign && ((long) ul != 0L)) { case 'F': case 'g': case 'G': { + + // --- IM - vaarg alignment issue fix: double d; + + unsigned long *da; + + da = (unsigned long *) ≈ + unsigned long *l = (unsigned long *) &d; - x.ap32 = ap; - - if ( x.u32 & 4) { + if ( (*da) & 4) { // maj l[0]= va_arg(ap, unsigned long); l[1]= va_arg(ap, unsigned long); } @@ -384,6 +389,8 @@ number: if (sign && ((long) ul != 0L)) { l[1]= va_arg(ap, unsigned long); } + // --- + /* * don't do unrealistic precision; just pad it with * zeroes later, so buffer size stays rational. diff --git a/target.mk b/target.mk index 816b10f..1aaebdb 100755 --- a/target.mk +++ b/target.mk @@ -50,7 +50,7 @@ TAGSFILE = tags MANROFF = nroff -man -h -Tascii ELF2AOUT = $(TOPSRC)/tools/elf2aout/elf2aout -CFLAGS = -O +CFLAGS = -O -fno-short-double LDFLAGS += -N -nostartfiles -fno-dwarf2-cfi-asm -T$(TOPSRC)/src/elf32-mips.ld \ $(TOPSRC)/src/crt0.o -L$(TOPSRC)/src