Browse Source

Merge branch 'master' of git://git.etalabs.net/musl

rs-1.0
nsz 14 years ago
parent
commit
c5ec5b2ce9
  1. 22
      src/ldso/dynlink.c
  2. 45
      src/math/i386/hypot.s
  3. 42
      src/math/i386/hypotf.s

22
src/ldso/dynlink.c

@ -1,4 +1,3 @@
#ifdef __PIC__
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -18,6 +17,10 @@
#include <ctype.h> #include <ctype.h>
#include <dlfcn.h> #include <dlfcn.h>
static int errflag;
#ifdef __PIC__
#include "reloc.h" #include "reloc.h"
#if ULONG_MAX == 0xffffffff #if ULONG_MAX == 0xffffffff
@ -631,12 +634,13 @@ void *dlopen(const char *file, int mode)
tail = orig_tail; tail = orig_tail;
tail->next = 0; tail->next = 0;
p = 0; p = 0;
} else p = load_library(file);
if (!p) {
errflag = 1;
goto end; goto end;
} }
p = load_library(file);
if (!p) goto end;
/* First load handling */ /* First load handling */
if (!p->deps) { if (!p->deps) {
load_deps(p); load_deps(p);
@ -674,8 +678,11 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)
if (!p) p=head; if (!p) p=head;
p=p->next; p=p->next;
} }
if (p == head || p == RTLD_DEFAULT) if (p == head || p == RTLD_DEFAULT) {
return find_sym(head, s, 0); void *res = find_sym(head, s, 0);
if (!res) errflag = 1;
return res;
}
h = hash(s); h = hash(s);
sym = lookup(s, h, p->syms, p->hashtab, p->strings); sym = lookup(s, h, p->syms, p->hashtab, p->strings);
if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES)) 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)) if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
return p->deps[i]->base + sym->st_value; return p->deps[i]->base + sym->st_value;
} }
errflag = 1;
return 0; return 0;
} }
@ -710,6 +718,8 @@ void *__dlsym(void *p, const char *s, void *ra)
char *dlerror() char *dlerror()
{ {
if (!errflag) return 0;
errflag = 0;
return "unknown error"; return "unknown error";
} }

45
src/math/i386/hypot.s

@ -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

42
src/math/i386/hypotf.s

@ -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
Loading…
Cancel
Save