Merge branch 'master' of git://git.etalabs.net/musl
authornsz <nsz@port70.net>
Fri, 23 Mar 2012 10:16:56 +0000 (11:16 +0100)
committernsz <nsz@port70.net>
Fri, 23 Mar 2012 10:16:56 +0000 (11:16 +0100)
src/ldso/dynlink.c
src/math/i386/hypot.s [new file with mode: 0644]
src/math/i386/hypotf.s [new file with mode: 0644]

index 6ff8850..e0013ec 100644 (file)
@@ -1,4 +1,3 @@
-#ifdef __PIC__
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <dlfcn.h>
 
+static int errflag;
+
+#ifdef __PIC__
+
 #include "reloc.h"
 
 #if ULONG_MAX == 0xffffffff
@@ -631,12 +634,13 @@ void *dlopen(const char *file, int mode)
                tail = orig_tail;
                tail->next = 0;
                p = 0;
+       } else p = load_library(file);
+
+       if (!p) {
+               errflag = 1;
                goto end;
        }
 
-       p = load_library(file);
-       if (!p) goto end;
-
        /* First load handling */
        if (!p->deps) {
                load_deps(p);
@@ -674,8 +678,11 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)
                if (!p) p=head;
                p=p->next;
        }
-       if (p == head || p == RTLD_DEFAULT)
-               return find_sym(head, s, 0);
+       if (p == head || p == RTLD_DEFAULT) {
+               void *res = find_sym(head, s, 0);
+               if (!res) errflag = 1;
+               return res;
+       }
        h = hash(s);
        sym = lookup(s, h, p->syms, p->hashtab, p->strings);
        if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
@@ -686,6 +693,7 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)
                if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
                        return p->deps[i]->base + sym->st_value;
        }
+       errflag = 1;
        return 0;
 }
 
@@ -710,6 +718,8 @@ void *__dlsym(void *p, const char *s, void *ra)
 
 char *dlerror()
 {
+       if (!errflag) return 0;
+       errflag = 0;
        return "unknown error";
 }
 
diff --git a/src/math/i386/hypot.s b/src/math/i386/hypot.s
new file mode 100644 (file)
index 0000000..299c2e1
--- /dev/null
@@ -0,0 +1,45 @@
+.global hypot
+.type hypot,@function
+hypot:
+       mov 8(%esp),%eax
+       mov 16(%esp),%ecx
+       add %eax,%eax
+       add %ecx,%ecx
+       and %eax,%ecx
+       cmp $0xffe00000,%ecx
+       jae 2f
+       or 4(%esp),%eax
+       jnz 1f
+       fldl 12(%esp)
+       fabs
+       ret
+1:     mov 16(%esp),%eax
+       add %eax,%eax
+       or 12(%esp),%eax
+       jnz 1f
+       fldl 4(%esp)
+       fabs
+       ret
+1:     fldl 4(%esp)
+       fld %st(0)
+       fmulp
+       fldl 12(%esp)
+       fld %st(0)
+       fmulp
+       faddp
+       fsqrt
+       ret
+2:     sub $0xffe00000,%eax
+       or 4(%esp),%eax
+       jnz 1f
+       fldl 4(%esp)
+       fabs
+       ret
+1:     mov 16(%esp),%eax
+       add %eax,%eax
+       sub $0xffe00000,%eax
+       or 12(%esp),%eax
+       fldl 12(%esp)
+       jnz 1f
+       fabs
+1:     ret
diff --git a/src/math/i386/hypotf.s b/src/math/i386/hypotf.s
new file mode 100644 (file)
index 0000000..068935e
--- /dev/null
@@ -0,0 +1,42 @@
+.global hypotf
+.type hypotf,@function
+hypotf:
+       mov 4(%esp),%eax
+       mov 8(%esp),%ecx
+       add %eax,%eax
+       add %ecx,%ecx
+       and %eax,%ecx
+       cmp $0xff000000,%ecx
+       jae 2f
+       test %eax,%eax
+       jnz 1f
+       flds 8(%esp)
+       fabs
+       ret
+1:     mov 8(%esp),%eax
+       add %eax,%eax
+       jnz 1f
+       flds 4(%esp)
+       fabs
+       ret
+1:     flds 4(%esp)
+       fld %st(0)
+       fmulp
+       flds 8(%esp)
+       fld %st(0)
+       fmulp
+       faddp
+       fsqrt
+       ret
+2:     cmp $0xff000000,%eax
+       jnz 1f
+       flds 4(%esp)
+       fabs
+       ret
+1:     mov 8(%esp),%eax
+       add %eax,%eax
+       cmp $0xff000000,%eax
+       flds 8(%esp)
+       jnz 1f
+       fabs
+1:     ret