about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/math/i386/sqrt.s16
-rw-r--r--src/math/i386/sqrtf.s2
-rw-r--r--src/stdio/__scanf.c17
3 files changed, 24 insertions, 11 deletions
diff --git a/src/math/i386/sqrt.s b/src/math/i386/sqrt.s
index c6e55303..8289d094 100644
--- a/src/math/i386/sqrt.s
+++ b/src/math/i386/sqrt.s
@@ -2,4 +2,20 @@
 .type sqrt,@function
 sqrt:	fldl 4(%esp)
 	fsqrt
+	fstsw %ax
+	sub $12,%esp
+	fld %st(0)
+	fstpt (%esp)
+	mov (%esp),%ecx
+	and $0x7ff,%ecx
+	cmp $0x400,%ecx
+	jnz 1f
+	and $0x200,%eax
+	sub $0x100,%eax
+	sub %eax,(%esp)
+	fstp %st(0)
+	fldt (%esp)
+1:	add $12,%esp
+	fstpl 4(%esp)
+	fldl 4(%esp)
 	ret
diff --git a/src/math/i386/sqrtf.s b/src/math/i386/sqrtf.s
index b79bd949..9e944f45 100644
--- a/src/math/i386/sqrtf.s
+++ b/src/math/i386/sqrtf.s
@@ -2,4 +2,6 @@
 .type sqrtf,@function
 sqrtf:	flds 4(%esp)
 	fsqrt
+	fstps 4(%esp)
+	flds 4(%esp)
 	ret
diff --git a/src/stdio/__scanf.c b/src/stdio/__scanf.c
index 062327d7..7c82cca4 100644
--- a/src/stdio/__scanf.c
+++ b/src/stdio/__scanf.c
@@ -319,34 +319,29 @@ int __scanf(rctx_t *r, const wchar_t *fmt, va_list ap)
 					unread(r);
 					break;
 				}
+				m = 1;
 				if (((c=read(r))|0x20) != 'x') {
-					if (t == 'i') {
-						t = 'o';
-						/* lone 0 is valid octal */
-						if ((unsigned)(c-'0') >= 8) {
-							m = 1;
-							goto int_finish;
-						}
-					}
+					if (t == 'i') t = 'o';
 					unread(r);
 					break;
 				}
 				t = 'x';
+				m = 0;
 			}
 		}
 		
 		switch (t) {
 		case 'd':
 		case 'u':
-			for (m=0; isdigit(c=read(r)); m=1)
+			for (; isdigit(c=read(r)); m=1)
 				i = 10*i + c-'0';
 			goto int_finish;
 		case 'o':
-			for (m=0; (unsigned)(c=read(r))-'0' < 8; m=1)
+			for (; (unsigned)(c=read(r))-'0' < 8; m=1)
 				i = (i<<3) + c-'0';
 			goto int_finish;
 		case 'x':
-			for (m=0; ; m=1) {
+			for (; ; m=1) {
 				if (isdigit(c=read(r))) {
 					i = (i<<4) + c-'0';
 				} else if ((unsigned)(c|0x20)-'a' < 6) {