* Re: compile error on latest git m68k kernel
[not found] <AANLkTimA0ZOhNo=RO5ZhrQFNA6wWORekgj42dMNhnpGY@mail.gmail.com>
@ 2010-11-10 9:17 ` Geert Uytterhoeven
2010-11-10 10:02 ` Andreas Schwab
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Geert Uytterhoeven @ 2010-11-10 9:17 UTC (permalink / raw)
To: Michael Schmitz; +Cc: Linux/m68k
Hi Michael,
On Wed, Nov 10, 2010 at 08:08, Michael Schmitz
<schmitzmic@googlemail.com> wrote:
> seen this before?
Not this particular one...
> LD .tmp_vmlinux1
> fs/built-in.o: In function `alignfile':
> binfmt_elf.c:(.text+0x307bc): undefined reference to `__divdi3'
> fs/built-in.o: In function `elf_core_dump':
> binfmt_elf.c:(.text+0x3139c): undefined reference to `__divdi3'
> make: *** [.tmp_vmlinux1] Error 1
>
> Apparently caused by the roundup macro in include/linux/kernel.h:
>
> #define roundup(x, y) ( \
> { \
> typeof(y) __y = y; \
> (((x) + (__y - 1)) / __y) * __y; \
> }
>
> Toolchain issue?
... but depending on the version of gcc, we sometimes need things like
this, cfr.
arch/m68k/lib/. The fix is to add a __divdi3 there.
Which version are you using?
> MIchael (who just wanted to try out the genrtc driver on Atari :-( ...)
Genrtc (which is obsolete) or rtc-generic (to be obsoleted by rtc-cmos
on Atari ;-)?
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: compile error on latest git m68k kernel
2010-11-10 9:17 ` compile error on latest git m68k kernel Geert Uytterhoeven
@ 2010-11-10 10:02 ` Andreas Schwab
2010-11-10 10:34 ` Geert Uytterhoeven
2010-11-10 19:41 ` Michael Schmitz
2010-11-12 13:24 ` Thorsten Glaser
2 siblings, 1 reply; 8+ messages in thread
From: Andreas Schwab @ 2010-11-10 10:02 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: Michael Schmitz, Linux/m68k
Geert Uytterhoeven <geert@linux-m68k.org> writes:
> Hi Michael,
>
> On Wed, Nov 10, 2010 at 08:08, Michael Schmitz
> <schmitzmic@googlemail.com> wrote:
>> seen this before?
>
> Not this particular one...
>
>> LD .tmp_vmlinux1
>> fs/built-in.o: In function `alignfile':
>> binfmt_elf.c:(.text+0x307bc): undefined reference to `__divdi3'
>> fs/built-in.o: In function `elf_core_dump':
>> binfmt_elf.c:(.text+0x3139c): undefined reference to `__divdi3'
>> make: *** [.tmp_vmlinux1] Error 1
Where is that called? The right fix in most cases is to use do_div from
<asm/div64.h>.
> ... but depending on the version of gcc, we sometimes need things like
> this, cfr.
> arch/m68k/lib/. The fix is to add a __divdi3 there.
It is not provided for a reason.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: compile error on latest git m68k kernel
2010-11-10 10:02 ` Andreas Schwab
@ 2010-11-10 10:34 ` Geert Uytterhoeven
2010-11-10 11:03 ` Andreas Schwab
0 siblings, 1 reply; 8+ messages in thread
From: Geert Uytterhoeven @ 2010-11-10 10:34 UTC (permalink / raw)
To: Andreas Schwab; +Cc: Michael Schmitz, Linux/m68k
On Wed, Nov 10, 2010 at 11:02, Andreas Schwab <schwab@linux-m68k.org> wrote:
> Geert Uytterhoeven <geert@linux-m68k.org> writes:
>> On Wed, Nov 10, 2010 at 08:08, Michael Schmitz
>> <schmitzmic@googlemail.com> wrote:
>>> seen this before?
>>
>> Not this particular one...
>>
>>> LD .tmp_vmlinux1
>>> fs/built-in.o: In function `alignfile':
>>> binfmt_elf.c:(.text+0x307bc): undefined reference to `__divdi3'
>>> fs/built-in.o: In function `elf_core_dump':
>>> binfmt_elf.c:(.text+0x3139c): undefined reference to `__divdi3'
>>> make: *** [.tmp_vmlinux1] Error 1
>
> Where is that called? The right fix in most cases is to use do_div from
> <asm/div64.h>.
alignfile: roundup(*foffset, 4)
elf_core_dump: roundup(offset, ELF_EXEC_PAGESIZE)
(assumed it's caused by the roundup() calls, assembly output?)
Both are divisions by a power-of-two, but the dividend is a (signed!) long long.
>> ... but depending on the version of gcc, we sometimes need things like
>> this, cfr.
>> arch/m68k/lib/. The fix is to add a __divdi3 there.
>
> It is not provided for a reason.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: compile error on latest git m68k kernel
2010-11-10 10:34 ` Geert Uytterhoeven
@ 2010-11-10 11:03 ` Andreas Schwab
0 siblings, 0 replies; 8+ messages in thread
From: Andreas Schwab @ 2010-11-10 11:03 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: Michael Schmitz, Linux/m68k
Geert Uytterhoeven <geert@linux-m68k.org> writes:
> On Wed, Nov 10, 2010 at 11:02, Andreas Schwab <schwab@linux-m68k.org> wrote:
>> Geert Uytterhoeven <geert@linux-m68k.org> writes:
>>> On Wed, Nov 10, 2010 at 08:08, Michael Schmitz
>>> <schmitzmic@googlemail.com> wrote:
>>>> seen this before?
>>>
>>> Not this particular one...
>>>
>>>> LD .tmp_vmlinux1
>>>> fs/built-in.o: In function `alignfile':
>>>> binfmt_elf.c:(.text+0x307bc): undefined reference to `__divdi3'
>>>> fs/built-in.o: In function `elf_core_dump':
>>>> binfmt_elf.c:(.text+0x3139c): undefined reference to `__divdi3'
>>>> make: *** [.tmp_vmlinux1] Error 1
>>
>> Where is that called? The right fix in most cases is to use do_div from
>> <asm/div64.h>.
>
> alignfile: roundup(*foffset, 4)
> elf_core_dump: roundup(offset, ELF_EXEC_PAGESIZE)
> (assumed it's caused by the roundup() calls, assembly output?)
>
> Both are divisions by a power-of-two, but the dividend is a (signed!) long long.
I cannot reproduce that.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: compile error on latest git m68k kernel
2010-11-10 9:17 ` compile error on latest git m68k kernel Geert Uytterhoeven
2010-11-10 10:02 ` Andreas Schwab
@ 2010-11-10 19:41 ` Michael Schmitz
2010-11-12 7:39 ` Michael Schmitz
2010-11-12 13:24 ` Thorsten Glaser
2 siblings, 1 reply; 8+ messages in thread
From: Michael Schmitz @ 2010-11-10 19:41 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: Linux/m68k
Hi All,
On Wed, Nov 10, 2010 at 10:17 PM, Geert Uytterhoeven
<geert@linux-m68k.org> wrote:
> Hi Michael,
>
> On Wed, Nov 10, 2010 at 08:08, Michael Schmitz
> <schmitzmic@googlemail.com> wrote:
>> seen this before?
>
> Not this particular one...
>
>> LD .tmp_vmlinux1
>> fs/built-in.o: In function `alignfile':
>> binfmt_elf.c:(.text+0x307bc): undefined reference to `__divdi3'
>> fs/built-in.o: In function `elf_core_dump':
>> binfmt_elf.c:(.text+0x3139c): undefined reference to `__divdi3'
>> make: *** [.tmp_vmlinux1] Error 1
>>
>> Apparently caused by the roundup macro in include/linux/kernel.h:
>>
>> #define roundup(x, y) ( \
>> { \
>> typeof(y) __y = y; \
>> (((x) + (__y - 1)) / __y) * __y; \
>> }
>>
>> Toolchain issue?
>
> ... but depending on the version of gcc, we sometimes need things like
> this, cfr.
> arch/m68k/lib/. The fix is to add a __divdi3 there.
Ah, missed adding it there. It is not provided for what reason exactly?
> Which version are you using?
gcc 3.3.6 and some matching binutils (gas reports version 2.16).
>
>> MIchael (who just wanted to try out the genrtc driver on Atari :-( ...)
>
> Genrtc (which is obsolete) or rtc-generic (to be obsoleted by rtc-cmos
> on Atari ;-)?
rtc-generic for now, with a view towards adding whatever is needed to
use rtc-cmos after.
Cheers,
Michael
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: compile error on latest git m68k kernel
2010-11-10 19:41 ` Michael Schmitz
@ 2010-11-12 7:39 ` Michael Schmitz
0 siblings, 0 replies; 8+ messages in thread
From: Michael Schmitz @ 2010-11-12 7:39 UTC (permalink / raw)
To: Geert Uytterhoeven; +Cc: Linux/m68k
[-- Attachment #1: Type: text/plain, Size: 1777 bytes --]
Hi All,
> On Wed, Nov 10, 2010 at 10:17 PM, Geert Uytterhoeven
> <geert@linux-m68k.org> wrote:
>> Hi Michael,
>>
>> On Wed, Nov 10, 2010 at 08:08, Michael Schmitz
>> <schmitzmic@googlemail.com> wrote:
>>> seen this before?
>>
>> Not this particular one...
>>
>>> LD .tmp_vmlinux1
>>> fs/built-in.o: In function `alignfile':
>>> binfmt_elf.c:(.text+0x307bc): undefined reference to `__divdi3'
>>> fs/built-in.o: In function `elf_core_dump':
>>> binfmt_elf.c:(.text+0x3139c): undefined reference to `__divdi3'
>>> make: *** [.tmp_vmlinux1] Error 1
>>>
>>> Apparently caused by the roundup macro in include/linux/kernel.h:
>>>
>>> #define roundup(x, y) ( \
>>> { \
>>> typeof(y) __y = y; \
>>> (((x) + (__y - 1)) / __y) * __y; \
>>> }
>>>
>>> Toolchain issue?
>>
>> ... but depending on the version of gcc, we sometimes need things like
>> this, cfr.
>> arch/m68k/lib/. The fix is to add a __divdi3 there.
See attached patch, based on libgcc2.c code using asm inlines - please
review. The UDIV_NEEDS_NORMALIZATION value I am not sure about,
actually.
This patch makes the kernel compile with my toolchain but I am
uncertain on how exactly to test this code path. Write a test case?
Try and force a core dump? The kernel runs OK on my Sarge and Etch
disk images, that is. as good as any previous 2.3.35 or 2.3.36 ones.
>> Genrtc (which is obsolete) or rtc-generic (to be obsoleted by rtc-cmos
>> on Atari ;-)?
>
> rtc-generic for now, with a view towards adding whatever is needed to
> use rtc-cmos after.
rtc-generic tested OK at least on ARAnyM so far.
Cheers,
Michael
[-- Attachment #2: m68k-lib-divdi3.patch --]
[-- Type: text/x-patch, Size: 14786 bytes --]
arch/m68k/lib/Makefile | 2 +-
arch/m68k/lib/divdi3.c | 554 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 555 insertions(+), 1 deletions(-)
Signed-off-by: Michael Schmitz <schmitz@debian.org>
--
diff --git a/arch/m68k/lib/Makefile b/arch/m68k/lib/Makefile
index af9abf8..161297f 100644
--- a/arch/m68k/lib/Makefile
+++ b/arch/m68k/lib/Makefile
@@ -2,5 +2,5 @@
# Makefile for m68k-specific library files..
#
-lib-y := ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
+lib-y := ashldi3.o ashrdi3.o lshrdi3.o muldi3.o divdi3.o \
checksum.o string.o uaccess.o
diff --git a/arch/m68k/lib/divdi3.c b/arch/m68k/lib/divdi3.c
new file mode 100644
index 0000000..178c210
--- /dev/null
+++ b/arch/m68k/lib/divdi3.c
@@ -0,0 +1,554 @@
+/* divdi3.c extracted from gcc-2.95.3/libgcc2.c which is: */
+/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
+
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+/* As a special exception, if you link this library with other files,
+ some of which are compiled with GCC, to produce an executable,
+ this library does not by itself cause the resulting executable
+ to be covered by the GNU General Public License.
+ This exception does not however invalidate any other reasons why
+ the executable file might be covered by the GNU General Public License. */
+
+/* It is incorrect to include config.h here, because this file is being
+ compiled for the target, and hence definitions concerning only the host
+ do not apply. */
+
+
+/* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
+ Copyright (C) 1991, 92, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc.
+
+ This definition file is free software; you can redistribute it
+ and/or modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2, or (at your option) any later version.
+
+ This definition file is distributed in the hope that it will be
+ useful, but WITHOUT ANY WARRANTY; without even the implied
+ warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef SI_TYPE_SIZE
+#define SI_TYPE_SIZE 32
+#endif
+
+#define UDIV_NEEDS_NORMALIZATION 0
+
+#define __BITS4 (SI_TYPE_SIZE / 4)
+#define __ll_B (1L << (SI_TYPE_SIZE / 2))
+#define __ll_lowpart(t) ((USItype) (t) % __ll_B)
+#define __ll_highpart(t) ((USItype) (t) / __ll_B)
+
+typedef unsigned int UQItype __attribute__ ((mode (QI)));
+typedef int SItype __attribute__ ((mode (SI)));
+typedef unsigned int USItype __attribute__ ((mode (SI)));
+typedef int DItype __attribute__ ((mode (DI)));
+typedef unsigned int UDItype __attribute__ ((mode (DI)));
+
+typedef float SFtype __attribute__ ((mode (SF)));
+typedef float DFtype __attribute__ ((mode (DF)));
+
+typedef int word_type __attribute__ ((mode (__word__)));
+
+/* Define auxiliary asm macros.
+
+ 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
+ multiplies two USItype integers MULTIPLER and MULTIPLICAND,
+ and generates a two-part USItype product in HIGH_PROD and
+ LOW_PROD.
+
+ 2) __umulsidi3(a,b) multiplies two USItype integers A and B,
+ and returns a UDItype product. This is just a variant of umul_ppmm.
+
+ 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
+ denominator) divides a two-word unsigned integer, composed by the
+ integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and
+ places the quotient in QUOTIENT and the remainder in REMAINDER.
+ HIGH_NUMERATOR must be less than DENOMINATOR for correct operation.
+ If, in addition, the most significant bit of DENOMINATOR must be 1,
+ then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1.
+
+ 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
+ denominator). Like udiv_qrnnd but the numbers are signed. The
+ quotient is rounded towards 0.
+
+ 5) count_leading_zeros(count, x) counts the number of zero-bits from
+ the msb to the first non-zero bit. This is the number of steps X
+ needs to be shifted left to set the msb. Undefined for X == 0.
+
+ 6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
+ high_addend_2, low_addend_2) adds two two-word unsigned integers,
+ composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and
+ LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and
+ LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is
+ lost.
+
+ 7) sub_ddmmss(high_difference, low_difference, high_minuend,
+ low_minuend, high_subtrahend, low_subtrahend) subtracts two
+ two-word unsigned integers, composed by HIGH_MINUEND_1 and
+ LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2
+ respectively. The result is placed in HIGH_DIFFERENCE and
+ LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
+ and is lost.
+
+ If any of these macros are left undefined for a particular CPU,
+ C macros are used. */
+
+/* The CPUs come in alphabetical order below.
+
+ Please add support for more CPUs here, or improve the current support
+ for the CPUs below!
+ (E.g. WE32100, IBM360.) */
+
+#if 1
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+ __asm__ ("\n" \
+ " sub%.l %5,%1\n" \
+ " subx%.l %3,%0" \
+ : "=d" ((USItype) (sh)), \
+ "=&d" ((USItype) (sl)) \
+ : "0" ((USItype) (ah)), \
+ "d" ((USItype) (bh)), \
+ "1" ((USItype) (al)), \
+ "g" ((USItype) (bl)))
+#else
+#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
+ do { \
+ USItype __x; \
+ __x = (al) - (bl); \
+ (sh) = (ah) - (bh) - (__x > (al)); \
+ (sl) = __x; \
+ } while (0)
+#endif
+
+/* The '020, '030, '040 and CPU32 have 32x32->64 and 64/32->32q-32r. */
+
+#define umul_ppmm(w1, w0, u, v) \
+ __asm__ ("mulu%.l %3,%1:%0" \
+ : "=d" ((USItype) (w0)), \
+ "=d" ((USItype) (w1)) \
+ : "%0" ((USItype) (u)), \
+ "dmi" ((USItype) (v)))
+#define UMUL_TIME 45
+#define udiv_qrnnd(q, r, n1, n0, d) \
+ __asm__ ("divu%.l %4,%1:%0" \
+ : "=d" ((USItype) (q)), \
+ "=d" ((USItype) (r)) \
+ : "0" ((USItype) (n0)), \
+ "1" ((USItype) (n1)), \
+ "dmi" ((USItype) (d)))
+#define UDIV_TIME 90
+#define sdiv_qrnnd(q, r, n1, n0, d) \
+ __asm__ ("divs%.l %4,%1:%0" \
+ : "=d" ((USItype) (q)), \
+ "=d" ((USItype) (r)) \
+ : "0" ((USItype) (n0)), \
+ "1" ((USItype) (n1)), \
+ "dmi" ((USItype) (d)))
+
+/* The '020, '030, '040 and '060 have bitfield insns. */
+#define count_leading_zeros(count, x) \
+ __asm__ ("bfffo %1{%b2:%b2},%0" \
+ : "=d" ((USItype) (count)) \
+ : "od" ((USItype) (x)), "n" (0))
+
+struct DIstruct {SItype high, low;};
+
+typedef union
+{
+ struct DIstruct s;
+ DItype ll;
+} DIunion;
+
+
+static inline
+DItype
+__negdi2 (DItype u)
+{
+ DIunion w;
+ DIunion uu;
+
+ uu.ll = u;
+
+ w.s.low = -uu.s.low;
+ w.s.high = -uu.s.high - ((USItype) w.s.low > 0);
+
+ return w.ll;
+}
+
+USItype
+__udiv_w_sdiv (USItype *rp, USItype a1, USItype a0, USItype d)
+{
+ USItype q, r;
+ USItype c0, c1, b1;
+
+ if ((SItype) d >= 0)
+ {
+ if (a1 < d - a1 - (a0 >> (SI_TYPE_SIZE - 1)))
+ {
+ /* dividend, divisor, and quotient are nonnegative */
+ sdiv_qrnnd (q, r, a1, a0, d);
+ }
+ else
+ {
+ /* Compute c1*2^32 + c0 = a1*2^32 + a0 - 2^31*d */
+ sub_ddmmss (c1, c0, a1, a0, d >> 1, d << (SI_TYPE_SIZE - 1));
+ /* Divide (c1*2^32 + c0) by d */
+ sdiv_qrnnd (q, r, c1, c0, d);
+ /* Add 2^31 to quotient */
+ q += (USItype) 1 << (SI_TYPE_SIZE - 1);
+ }
+ }
+ else
+ {
+ b1 = d >> 1; /* d/2, between 2^30 and 2^31 - 1 */
+ c1 = a1 >> 1; /* A/2 */
+ c0 = (a1 << (SI_TYPE_SIZE - 1)) + (a0 >> 1);
+
+ if (a1 < b1) /* A < 2^32*b1, so A/2 < 2^31*b1 */
+ {
+ sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
+
+ r = 2*r + (a0 & 1); /* Remainder from A/(2*b1) */
+ if ((d & 1) != 0)
+ {
+ if (r >= q)
+ r = r - q;
+ else if (q - r <= d)
+ {
+ r = r - q + d;
+ q--;
+ }
+ else
+ {
+ r = r - q + 2*d;
+ q -= 2;
+ }
+ }
+ }
+ else if (c1 < b1) /* So 2^31 <= (A/2)/b1 < 2^32 */
+ {
+ c1 = (b1 - 1) - c1;
+ c0 = ~c0; /* logical NOT */
+
+ sdiv_qrnnd (q, r, c1, c0, b1); /* (A/2) / (d/2) */
+
+ q = ~q; /* (A/2)/b1 */
+ r = (b1 - 1) - r;
+
+ r = 2*r + (a0 & 1); /* A/(2*b1) */
+
+ if ((d & 1) != 0)
+ {
+ if (r >= q)
+ r = r - q;
+ else if (q - r <= d)
+ {
+ r = r - q + d;
+ q--;
+ }
+ else
+ {
+ r = r - q + 2*d;
+ q -= 2;
+ }
+ }
+ }
+ else /* Implies c1 = b1 */
+ { /* Hence a1 = d - 1 = 2*b1 - 1 */
+ if (a0 >= -d)
+ {
+ q = -1;
+ r = a0 + d;
+ }
+ else
+ {
+ q = -2;
+ r = a0 + 2*d;
+ }
+ }
+ }
+
+ *rp = r;
+ return q;
+}
+
+static const UQItype __clz_tab[] =
+{
+ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
+ 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+};
+
+static inline
+UDItype
+__udivmoddi4 (UDItype n, UDItype d, UDItype *rp)
+{
+ DIunion ww;
+ DIunion nn, dd;
+ DIunion rr;
+ USItype d0, d1, n0, n1, n2;
+ USItype q0, q1;
+ USItype b, bm;
+
+ nn.ll = n;
+ dd.ll = d;
+
+ d0 = dd.s.low;
+ d1 = dd.s.high;
+ n0 = nn.s.low;
+ n1 = nn.s.high;
+
+#if !UDIV_NEEDS_NORMALIZATION
+ if (d1 == 0)
+ {
+ if (d0 > n1)
+ {
+ /* 0q = nn / 0D */
+
+ udiv_qrnnd (q0, n0, n1, n0, d0);
+ q1 = 0;
+
+ /* Remainder in n0. */
+ }
+ else
+ {
+ /* qq = NN / 0d */
+
+ if (d0 == 0)
+ d0 = 1 / d0; /* Divide intentionally by zero. */
+
+ udiv_qrnnd (q1, n1, 0, n1, d0);
+ udiv_qrnnd (q0, n0, n1, n0, d0);
+
+ /* Remainder in n0. */
+ }
+
+ if (rp != 0)
+ {
+ rr.s.low = n0;
+ rr.s.high = 0;
+ *rp = rr.ll;
+ }
+ }
+
+#else /* UDIV_NEEDS_NORMALIZATION */
+
+ if (d1 == 0)
+ {
+ if (d0 > n1)
+ {
+ /* 0q = nn / 0D */
+
+ count_leading_zeros (bm, d0);
+
+ if (bm != 0)
+ {
+ /* Normalize, i.e. make the most significant bit of the
+ denominator set. */
+
+ d0 = d0 << bm;
+ n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
+ n0 = n0 << bm;
+ }
+
+ udiv_qrnnd (q0, n0, n1, n0, d0);
+ q1 = 0;
+
+ /* Remainder in n0 >> bm. */
+ }
+ else
+ {
+ /* qq = NN / 0d */
+
+ if (d0 == 0)
+ d0 = 1 / d0; /* Divide intentionally by zero. */
+
+ count_leading_zeros (bm, d0);
+
+ if (bm == 0)
+ {
+ /* From (n1 >= d0) /\ (the most significant bit of d0 is set),
+ conclude (the most significant bit of n1 is set) /\ (the
+ leading quotient digit q1 = 1).
+
+ This special case is necessary, not an optimization.
+ (Shifts counts of SI_TYPE_SIZE are undefined.) */
+
+ n1 -= d0;
+ q1 = 1;
+ }
+ else
+ {
+ /* Normalize. */
+
+ b = SI_TYPE_SIZE - bm;
+
+ d0 = d0 << bm;
+ n2 = n1 >> b;
+ n1 = (n1 << bm) | (n0 >> b);
+ n0 = n0 << bm;
+
+ udiv_qrnnd (q1, n1, n2, n1, d0);
+ }
+
+ /* n1 != d0... */
+
+ udiv_qrnnd (q0, n0, n1, n0, d0);
+
+ /* Remainder in n0 >> bm. */
+ }
+
+ if (rp != 0)
+ {
+ rr.s.low = n0 >> bm;
+ rr.s.high = 0;
+ *rp = rr.ll;
+ }
+ }
+#endif /* UDIV_NEEDS_NORMALIZATION */
+
+ else
+ {
+ if (d1 > n1)
+ {
+ /* 00 = nn / DD */
+
+ q0 = 0;
+ q1 = 0;
+
+ /* Remainder in n1n0. */
+ if (rp != 0)
+ {
+ rr.s.low = n0;
+ rr.s.high = n1;
+ *rp = rr.ll;
+ }
+ }
+ else
+ {
+ /* 0q = NN / dd */
+
+ count_leading_zeros (bm, d1);
+ if (bm == 0)
+ {
+ /* From (n1 >= d1) /\ (the most significant bit of d1 is set),
+ conclude (the most significant bit of n1 is set) /\ (the
+ quotient digit q0 = 0 or 1).
+
+ This special case is necessary, not an optimization. */
+
+ /* The condition on the next line takes advantage of that
+ n1 >= d1 (true due to program flow). */
+ if (n1 > d1 || n0 >= d0)
+ {
+ q0 = 1;
+ sub_ddmmss (n1, n0, n1, n0, d1, d0);
+ }
+ else
+ q0 = 0;
+
+ q1 = 0;
+
+ if (rp != 0)
+ {
+ rr.s.low = n0;
+ rr.s.high = n1;
+ *rp = rr.ll;
+ }
+ }
+ else
+ {
+ USItype m1, m0;
+ /* Normalize. */
+
+ b = SI_TYPE_SIZE - bm;
+
+ d1 = (d1 << bm) | (d0 >> b);
+ d0 = d0 << bm;
+ n2 = n1 >> b;
+ n1 = (n1 << bm) | (n0 >> b);
+ n0 = n0 << bm;
+
+ udiv_qrnnd (q0, n1, n2, n1, d1);
+ umul_ppmm (m1, m0, q0, d0);
+
+ if (m1 > n1 || (m1 == n1 && m0 > n0))
+ {
+ q0--;
+ sub_ddmmss (m1, m0, m1, m0, d1, d0);
+ }
+
+ q1 = 0;
+
+ /* Remainder in (n1n0 - m1m0) >> bm. */
+ if (rp != 0)
+ {
+ sub_ddmmss (n1, n0, n1, n0, m1, m0);
+ rr.s.low = (n1 << b) | (n0 >> bm);
+ rr.s.high = n1 >> bm;
+ *rp = rr.ll;
+ }
+ }
+ }
+ }
+
+ ww.s.low = q0;
+ ww.s.high = q1;
+ return ww.ll;
+}
+
+#if 0
+UDItype __udivmoddi4 ();
+#endif
+
+DItype
+__divdi3 (DItype u, DItype v)
+{
+ word_type c = 0;
+ DIunion uu, vv;
+ DItype w;
+
+ uu.ll = u;
+ vv.ll = v;
+
+ if (uu.s.high < 0)
+ c = ~c,
+ uu.ll = __negdi2 (uu.ll);
+ if (vv.s.high < 0)
+ c = ~c,
+ vv.ll = __negdi2 (vv.ll);
+
+ w = __udivmoddi4 (uu.ll, vv.ll, (UDItype *) 0);
+ if (c)
+ w = __negdi2 (w);
+
+ return w;
+}
+
+
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: compile error on latest git m68k kernel
2010-11-10 9:17 ` compile error on latest git m68k kernel Geert Uytterhoeven
2010-11-10 10:02 ` Andreas Schwab
2010-11-10 19:41 ` Michael Schmitz
@ 2010-11-12 13:24 ` Thorsten Glaser
2010-11-13 8:38 ` Michael Schmitz
2 siblings, 1 reply; 8+ messages in thread
From: Thorsten Glaser @ 2010-11-12 13:24 UTC (permalink / raw)
To: linux-m68k
Geert Uytterhoeven dixit:
>Genrtc (which is obsolete) or rtc-generic (to be obsoleted by rtc-cmos
>on Atari ;-)?
Hah, just as soon as I got rtc-generic working in the Debian kernels…
;-)
//mirabilos
--
I believe no one can invent an algorithm. One just happens to hit upon it
when God enlightens him. Or only God invents algorithms, we merely copy them.
If you don't believe in God, just consider God as Nature if you won't deny
existence. -- Coywolf Qi Hunt
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: compile error on latest git m68k kernel
2010-11-12 13:24 ` Thorsten Glaser
@ 2010-11-13 8:38 ` Michael Schmitz
0 siblings, 0 replies; 8+ messages in thread
From: Michael Schmitz @ 2010-11-13 8:38 UTC (permalink / raw)
To: Thorsten Glaser; +Cc: linux-m68k
Hi,
On Sat, Nov 13, 2010 at 2:24 AM, Thorsten Glaser <tg@mirbsd.de> wrote:
> Geert Uytterhoeven dixit:
>
>>Genrtc (which is obsolete) or rtc-generic (to be obsoleted by rtc-cmos
>>on Atari ;-)?
>
> Hah, just as soon as I got rtc-generic working in the Debian kernels…
Won't be done in a jiffy (still scratching my head whether the STE RTC
is a mc146818 RTC or not). Let's use rtc-generic for a while.
Cheers,
Michael
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2010-11-13 8:38 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <AANLkTimA0ZOhNo=RO5ZhrQFNA6wWORekgj42dMNhnpGY@mail.gmail.com>
2010-11-10 9:17 ` compile error on latest git m68k kernel Geert Uytterhoeven
2010-11-10 10:02 ` Andreas Schwab
2010-11-10 10:34 ` Geert Uytterhoeven
2010-11-10 11:03 ` Andreas Schwab
2010-11-10 19:41 ` Michael Schmitz
2010-11-12 7:39 ` Michael Schmitz
2010-11-12 13:24 ` Thorsten Glaser
2010-11-13 8:38 ` Michael Schmitz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox