summaryrefslogtreecommitdiff
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) {