summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--COPYRIGHT2
-rw-r--r--src/math/i386/sqrt.s16
-rw-r--r--src/math/i386/sqrtf.s2
-rw-r--r--src/stdio/__scanf.c17
4 files changed, 25 insertions, 12 deletions
diff --git a/COPYRIGHT b/COPYRIGHT
index 814cabd9..730e04a4 100644
--- a/COPYRIGHT
+++ b/COPYRIGHT
@@ -37,7 +37,7 @@ The x86_64 port was written by Nicholas J. Kain. See individual files
for their copyright status.
All files which have no copyright comments are original works
-Copyright © 2005-2011 Rich Felker, the main author of this library.
+Copyright © 2005-2012 Rich Felker, the main author of this library.
The decision to exclude such comments is intentional, as it should be
possible to carry around the complete source code on tiny storage
media. All public header files (include/*) should be treated as Public
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) {