diff options
author | hpa <hpa> | 2004-12-19 00:28:01 +0000 |
---|---|---|
committer | hpa <hpa> | 2004-12-19 00:28:01 +0000 |
commit | bf63428a0c9d1ed68f85e730c6523dbb22687c29 (patch) | |
tree | 3807a8582a17b3374bf0965a4612779fcaea6e75 /dos | |
parent | b544013ca57aea35b878e380de19c22ac1abb40e (diff) | |
download | syslinux-devel-bf63428a0c9d1ed68f85e730c6523dbb22687c29.tar.gz syslinux-devel-bf63428a0c9d1ed68f85e730c6523dbb22687c29.tar.xz syslinux-devel-bf63428a0c9d1ed68f85e730c6523dbb22687c29.zip |
Make DOS installer use our homegrown 64-bit dividesyslinux-2.20-pre7
Diffstat (limited to 'dos')
-rw-r--r-- | dos/Makefile | 4 | ||||
-rw-r--r-- | dos/__divdi3.c | 29 | ||||
-rw-r--r-- | dos/__udivmoddi4.c | 31 |
3 files changed, 62 insertions, 2 deletions
diff --git a/dos/Makefile b/dos/Makefile index c423ded7..a00d72e6 100644 --- a/dos/Makefile +++ b/dos/Makefile @@ -14,7 +14,7 @@ SRCS = syslinux.c \ $(wildcard ../libfat/*.c) OBJS = crt0.o $(patsubst %.c,%.o,$(notdir $(SRCS))) LIBOBJS = conio.o memcpy.o memset.o skipatou.o atou.o malloc.o free.o \ - argv.o printf.o + argv.o printf.o __divdi3.o __udivmoddi4.o .SUFFIXES: .c .o .i .s .S .elf .com @@ -34,7 +34,7 @@ spotless: clean installer: syslinux.com syslinux.elf: $(OBJS) libcom.a - $(LD) $(LDFLAGS) -o $@ $^ $(LIBGCC) + $(LD) $(LDFLAGS) -o $@ $^ libcom.a: $(LIBOBJS) -rm -f $@ diff --git a/dos/__divdi3.c b/dos/__divdi3.c new file mode 100644 index 00000000..be13caed --- /dev/null +++ b/dos/__divdi3.c @@ -0,0 +1,29 @@ +/* + * arch/i386/libgcc/__divdi3.c + */ + +#include <stdint.h> +#include <stddef.h> + +extern uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem); + +int64_t __divdi3(int64_t num, int64_t den) +{ + int minus = 0; + int64_t v; + + if ( num < 0 ) { + num = -num; + minus = 1; + } + if ( den < 0 ) { + den = -den; + minus ^= 1; + } + + v = __udivmoddi4(num, den, NULL); + if ( minus ) + v = -v; + + return v; +} diff --git a/dos/__udivmoddi4.c b/dos/__udivmoddi4.c new file mode 100644 index 00000000..57b20e23 --- /dev/null +++ b/dos/__udivmoddi4.c @@ -0,0 +1,31 @@ +#include <stdint.h> + +uint64_t __udivmoddi4(uint64_t num, uint64_t den, uint64_t *rem_p) +{ + uint64_t quot = 0, qbit = 1; + + if ( den == 0 ) { + asm volatile("int $0"); + return 0; /* If trap returns... */ + } + + /* Left-justify denominator and count shift */ + while ( (int64_t)den >= 0 ) { + den <<= 1; + qbit <<= 1; + } + + while ( qbit ) { + if ( den <= num ) { + num -= den; + quot += qbit; + } + den >>= 1; + qbit >>= 1; + } + + if ( rem_p ) + *rem_p = num; + + return quot; +} |