Root/target/linux/ubicom32/patches-2.6.32/120-libgcc_func.patch

1--- a/arch/ubicom32/Makefile
2+++ b/arch/ubicom32/Makefile
3@@ -60,9 +60,6 @@ cflags-$(CONFIG_UBICOM32_V4) := -march=
4 ldflags-$(CONFIG_LINKER_RELAXATION) := --relax
5 LDFLAGS_vmlinux := $(ldflags-y)
6 
7-GCCLIBDIR := $(dir $(shell $(CC) $(cflags-y) -print-libgcc-file-name))
8-GCC_LIBS := $(GCCLIBDIR)/libgcc.a
9-
10 KBUILD_CFLAGS += $(cflags-y) -ffunction-sections
11 KBUILD_AFLAGS += $(cflags-y)
12 
13@@ -84,7 +81,6 @@ core-y += arch/$(ARCH)/kernel/ \
14 drivers-$(CONFIG_OPROFILE) += arch/ubicom32/oprofile/
15 
16 libs-y += arch/$(ARCH)/lib/
17-libs-y += $(GCC_LIBS)
18 
19 archclean:
20 
21--- a/arch/ubicom32/lib/Makefile
22+++ b/arch/ubicom32/lib/Makefile
23@@ -30,3 +30,4 @@
24 #
25 
26 lib-y := checksum.o delay.o mem_ubicom32.o
27+lib-y += ashldi3.o ashrdi3.o divmod.o lshrdi3.o muldi3.o
28--- /dev/null
29+++ b/arch/ubicom32/lib/ashldi3.c
30@@ -0,0 +1,62 @@
31+/* ashrdi3.c extracted from gcc-2.95.2/libgcc2.c which is: */
32+/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
33+
34+This file is part of GNU CC.
35+
36+GNU CC is free software; you can redistribute it and/or modify
37+it under the terms of the GNU General Public License as published by
38+the Free Software Foundation; either version 2, or (at your option)
39+any later version.
40+
41+GNU CC is distributed in the hope that it will be useful,
42+but WITHOUT ANY WARRANTY; without even the implied warranty of
43+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
44+GNU General Public License for more details.
45+
46+You should have received a copy of the GNU General Public License
47+along with GNU CC; see the file COPYING. If not, write to
48+the Free Software Foundation, 59 Temple Place - Suite 330,
49+Boston, MA 02111-1307, USA. */
50+
51+#define BITS_PER_UNIT 8
52+
53+typedef int SItype __attribute__ ((mode (SI)));
54+typedef unsigned int USItype __attribute__ ((mode (SI)));
55+typedef int DItype __attribute__ ((mode (DI)));
56+typedef int word_type __attribute__ ((mode (__word__)));
57+
58+struct DIstruct {SItype high, low;};
59+
60+typedef union
61+{
62+ struct DIstruct s;
63+ DItype ll;
64+} DIunion;
65+
66+DItype
67+__ashldi3 (DItype u, word_type b)
68+{
69+ DIunion w;
70+ word_type bm;
71+ DIunion uu;
72+
73+ if (b == 0)
74+ return u;
75+
76+ uu.ll = u;
77+
78+ bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
79+ if (bm <= 0)
80+ {
81+ w.s.low = 0;
82+ w.s.high = (USItype)uu.s.low << -bm;
83+ }
84+ else
85+ {
86+ USItype carries = (USItype)uu.s.low >> bm;
87+ w.s.low = (USItype)uu.s.low << b;
88+ w.s.high = ((USItype)uu.s.high << b) | carries;
89+ }
90+
91+ return w.ll;
92+}
93--- /dev/null
94+++ b/arch/ubicom32/lib/ashrdi3.c
95@@ -0,0 +1,63 @@
96+/* ashrdi3.c extracted from gcc-2.7.2/libgcc2.c which is: */
97+/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
98+
99+This file is part of GNU CC.
100+
101+GNU CC is free software; you can redistribute it and/or modify
102+it under the terms of the GNU General Public License as published by
103+the Free Software Foundation; either version 2, or (at your option)
104+any later version.
105+
106+GNU CC is distributed in the hope that it will be useful,
107+but WITHOUT ANY WARRANTY; without even the implied warranty of
108+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
109+GNU General Public License for more details.
110+
111+You should have received a copy of the GNU General Public License
112+along with GNU CC; see the file COPYING. If not, write to
113+the Free Software Foundation, 59 Temple Place - Suite 330,
114+Boston, MA 02111-1307, USA. */
115+
116+#define BITS_PER_UNIT 8
117+
118+typedef int SItype __attribute__ ((mode (SI)));
119+typedef unsigned int USItype __attribute__ ((mode (SI)));
120+typedef int DItype __attribute__ ((mode (DI)));
121+typedef int word_type __attribute__ ((mode (__word__)));
122+
123+struct DIstruct {SItype high, low;};
124+
125+typedef union
126+{
127+ struct DIstruct s;
128+ DItype ll;
129+} DIunion;
130+
131+DItype
132+__ashrdi3 (DItype u, word_type b)
133+{
134+ DIunion w;
135+ word_type bm;
136+ DIunion uu;
137+
138+ if (b == 0)
139+ return u;
140+
141+ uu.ll = u;
142+
143+ bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
144+ if (bm <= 0)
145+ {
146+ /* w.s.high = 1..1 or 0..0 */
147+ w.s.high = uu.s.high >> (sizeof (SItype) * BITS_PER_UNIT - 1);
148+ w.s.low = uu.s.high >> -bm;
149+ }
150+ else
151+ {
152+ USItype carries = (USItype)uu.s.high << bm;
153+ w.s.high = uu.s.high >> b;
154+ w.s.low = ((USItype)uu.s.low >> b) | carries;
155+ }
156+
157+ return w.ll;
158+}
159--- /dev/null
160+++ b/arch/ubicom32/lib/divmod.c
161@@ -0,0 +1,85 @@
162+unsigned long
163+udivmodsi4(unsigned long num, unsigned long den, int modwanted)
164+{
165+ unsigned long bit = 1;
166+ unsigned long res = 0;
167+
168+ while (den < num && bit && !(den & (1L<<31)))
169+ {
170+ den <<=1;
171+ bit <<=1;
172+ }
173+ while (bit)
174+ {
175+ if (num >= den)
176+ {
177+ num -= den;
178+ res |= bit;
179+ }
180+ bit >>=1;
181+ den >>=1;
182+ }
183+ if (modwanted) return num;
184+ return res;
185+}
186+
187+long
188+__udivsi3 (long a, long b)
189+{
190+ return udivmodsi4 (a, b, 0);
191+}
192+
193+long
194+__umodsi3 (long a, long b)
195+{
196+ return udivmodsi4 (a, b, 1);
197+}
198+
199+long
200+__divsi3 (long a, long b)
201+{
202+ int neg = 0;
203+ long res;
204+
205+ if (a < 0)
206+ {
207+ a = -a;
208+ neg = !neg;
209+ }
210+
211+ if (b < 0)
212+ {
213+ b = -b;
214+ neg = !neg;
215+ }
216+
217+ res = udivmodsi4 (a, b, 0);
218+
219+ if (neg)
220+ res = -res;
221+
222+ return res;
223+}
224+
225+long
226+__modsi3 (long a, long b)
227+{
228+ int neg = 0;
229+ long res;
230+
231+ if (a < 0)
232+ {
233+ a = -a;
234+ neg = 1;
235+ }
236+
237+ if (b < 0)
238+ b = -b;
239+
240+ res = udivmodsi4 (a, b, 1);
241+
242+ if (neg)
243+ res = -res;
244+
245+ return res;
246+}
247--- /dev/null
248+++ b/arch/ubicom32/lib/lshrdi3.c
249@@ -0,0 +1,62 @@
250+/* lshrdi3.c extracted from gcc-2.7.2/libgcc2.c which is: */
251+/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
252+
253+This file is part of GNU CC.
254+
255+GNU CC is free software; you can redistribute it and/or modify
256+it under the terms of the GNU General Public License as published by
257+the Free Software Foundation; either version 2, or (at your option)
258+any later version.
259+
260+GNU CC is distributed in the hope that it will be useful,
261+but WITHOUT ANY WARRANTY; without even the implied warranty of
262+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
263+GNU General Public License for more details.
264+
265+You should have received a copy of the GNU General Public License
266+along with GNU CC; see the file COPYING. If not, write to
267+the Free Software Foundation, 59 Temple Place - Suite 330,
268+Boston, MA 02111-1307, USA. */
269+
270+#define BITS_PER_UNIT 8
271+
272+typedef int SItype __attribute__ ((mode (SI)));
273+typedef unsigned int USItype __attribute__ ((mode (SI)));
274+typedef int DItype __attribute__ ((mode (DI)));
275+typedef int word_type __attribute__ ((mode (__word__)));
276+
277+struct DIstruct {SItype high, low;};
278+
279+typedef union
280+{
281+ struct DIstruct s;
282+ DItype ll;
283+} DIunion;
284+
285+DItype
286+__lshrdi3 (DItype u, word_type b)
287+{
288+ DIunion w;
289+ word_type bm;
290+ DIunion uu;
291+
292+ if (b == 0)
293+ return u;
294+
295+ uu.ll = u;
296+
297+ bm = (sizeof (SItype) * BITS_PER_UNIT) - b;
298+ if (bm <= 0)
299+ {
300+ w.s.high = 0;
301+ w.s.low = (USItype)uu.s.high >> -bm;
302+ }
303+ else
304+ {
305+ USItype carries = (USItype)uu.s.high << bm;
306+ w.s.high = (USItype)uu.s.high >> b;
307+ w.s.low = ((USItype)uu.s.low >> b) | carries;
308+ }
309+
310+ return w.ll;
311+}
312--- /dev/null
313+++ b/arch/ubicom32/lib/muldi3.c
314@@ -0,0 +1,87 @@
315+/* muldi3.c extracted from gcc-2.7.2.3/libgcc2.c and
316+ gcc-2.7.2.3/longlong.h which is: */
317+/* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
318+
319+This file is part of GNU CC.
320+
321+GNU CC is free software; you can redistribute it and/or modify
322+it under the terms of the GNU General Public License as published by
323+the Free Software Foundation; either version 2, or (at your option)
324+any later version.
325+
326+GNU CC is distributed in the hope that it will be useful,
327+but WITHOUT ANY WARRANTY; without even the implied warranty of
328+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
329+GNU General Public License for more details.
330+
331+You should have received a copy of the GNU General Public License
332+along with GNU CC; see the file COPYING. If not, write to
333+the Free Software Foundation, 59 Temple Place - Suite 330,
334+Boston, MA 02111-1307, USA. */
335+
336+#define UWtype USItype
337+#define UHWtype USItype
338+#define W_TYPE_SIZE 32
339+#define __BITS4 (W_TYPE_SIZE / 4)
340+#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
341+#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
342+#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
343+
344+#define umul_ppmm(w1, w0, u, v) \
345+ do { \
346+ UWtype __x0, __x1, __x2, __x3; \
347+ UHWtype __ul, __vl, __uh, __vh; \
348+ \
349+ __ul = __ll_lowpart (u); \
350+ __uh = __ll_highpart (u); \
351+ __vl = __ll_lowpart (v); \
352+ __vh = __ll_highpart (v); \
353+ \
354+ __x0 = (UWtype) __ul * __vl; \
355+ __x1 = (UWtype) __ul * __vh; \
356+ __x2 = (UWtype) __uh * __vl; \
357+ __x3 = (UWtype) __uh * __vh; \
358+ \
359+ __x1 += __ll_highpart (__x0);/* this can't give carry */ \
360+ __x1 += __x2; /* but this indeed can */ \
361+ if (__x1 < __x2) /* did we get it? */ \
362+ __x3 += __ll_B; /* yes, add it in the proper pos. */ \
363+ \
364+ (w1) = __x3 + __ll_highpart (__x1); \
365+ (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \
366+ } while (0)
367+
368+
369+#define __umulsidi3(u, v) \
370+ ({DIunion __w; \
371+ umul_ppmm (__w.s.high, __w.s.low, u, v); \
372+ __w.ll; })
373+
374+typedef int SItype __attribute__ ((mode (SI)));
375+typedef unsigned int USItype __attribute__ ((mode (SI)));
376+typedef int DItype __attribute__ ((mode (DI)));
377+typedef int word_type __attribute__ ((mode (__word__)));
378+
379+struct DIstruct {SItype high, low;};
380+
381+typedef union
382+{
383+ struct DIstruct s;
384+ DItype ll;
385+} DIunion;
386+
387+DItype
388+__muldi3 (DItype u, DItype v)
389+{
390+ DIunion w;
391+ DIunion uu, vv;
392+
393+ uu.ll = u,
394+ vv.ll = v;
395+
396+ w.ll = __umulsidi3 (uu.s.low, vv.s.low);
397+ w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
398+ + (USItype) uu.s.high * (USItype) vv.s.low);
399+
400+ return w.ll;
401+}
402--- a/arch/ubicom32/kernel/ubicom32_ksyms.c
403+++ b/arch/ubicom32/kernel/ubicom32_ksyms.c
404@@ -72,7 +72,6 @@ EXPORT_SYMBOL(memmove);
405 extern void __ashldi3(void);
406 extern void __ashrdi3(void);
407 extern void __divsi3(void);
408-extern void __divdi3(void);
409 extern void __lshrdi3(void);
410 extern void __modsi3(void);
411 extern void __muldi3(void);
412@@ -83,7 +82,6 @@ extern void __umodsi3(void);
413 EXPORT_SYMBOL(__ashldi3);
414 EXPORT_SYMBOL(__ashrdi3);
415 EXPORT_SYMBOL(__divsi3);
416-EXPORT_SYMBOL(__divdi3);
417 EXPORT_SYMBOL(__lshrdi3);
418 EXPORT_SYMBOL(__modsi3);
419 EXPORT_SYMBOL(__muldi3);
420

Archive Download this file



interactive