libgcc-compat for arm, ia64, m68k, and s390
OK, I've made a patch for libgcc-compat for arm, ia64, m68k, and s390.
I tested it with libgcc-compat-all (2003-03-02). Arm, ia64, and s390
work well. M68k is still building on crest. Ia64 is derived from
redhat's patch.
Thanks to Guido to discuss this issue. I also thank to Ryan, and
Bdale to help my build.
With my some investigations:
arm:
__ashldi3 (libgcc.2):
__ashrdi3 (libgcc.2):
__cmpdi2 (libgcc.2):
__divsi3 (config/divmod.c):
__fixdfdi (libgcc.2):
__floatdidf (libgcc.2 and floatlib.c):
__floatdisf (libgcc.2 and floatlib.c):
__modsi3 (config/divmod.c):
__muldi3 (libgcc.2):
__ucmpdi2 (libgcc.2):
__udivsi3 (config/udivmod.c):
__umodsi3 (config/udivmod.c):
* These are simply added into dpatch.
__divdi3 __moddi3 __udivdi3 __umoddi3:
* It's already included in glibc, so no need to apply.
ia64:
__modsi3 __udivsi3 __umodsi3 __divsi3:
* Need to apply.
__divtf3 __divdf3 __divsf3 __divdi3 __moddi3 __udivdi3
__umoddi3 __multi3:
* They were already applied. See:
http://sources.redhat.com/ml/libc-hacker/2002-05/msg00004.html
It's interesting that when Jakub Jelinek sent this patch,
but Ulrich Drepper added it as GLIBC_2.2 without tests. All
our patch was as GLIBC_2.0 symbols, but I follow Uli's
decision.
* And The latest redhat has another patch for ia64.
This version drops the previous assembler version, and
introduces libgcc-compat style.
__ia64_restore_stack_nonlocal __ia64_save_stack_nonlocal:
* This should be dropped. They are added in 2000:
http://gcc.gnu.org/ml/gcc-patches/2000-03/msg00530.html
http://gcc.gnu.org/ml/gcc-patches/2001-07/msg00105.html
* From this patch, you find below code. "not tested" :-):
+ #ifdef L__restore_stack_nonlocal
+ // This is mostly the same as nonlocal_goto above.
+ // ??? This has not been tested yet.
+ __ia64_restore_stack_nonlocal:
* From Guido's analysis, these symbols are defined only in:
./dpkg-deb-tmpdir/usr/lib/libobjc.so.1
Hmm. libobjc.so.1 is part of gcc. I think it's OK to drop.
m68k:
__ashldi3 __ashrdi3 __fixdfdi __fixsfdi __fixunsdfdi __fixunssfdi
__floatdidf __floatdisf:
* These are simply added into dpatch.
__clear_cache (libgcc2):
* I don't know how to implement. We sould consider this
sensible code. We may be enable to pull __clear_cache from
gcc/libgcc2.c, but I don't do that. Guido's analysis says:
./dpkg-deb-tmpdir/usr/lib/GNUstep/System/Libraries/m68k/linux-gnu/gnu-gnu-gnu/libgnustep-gui.so.0.7.6 __clear_cache
./dpkg-deb-tmpdir/usr/lib/GNUstep/System/Libraries/m68k/linux-gnu/gnu-gnu-gnu/libgnustep-gui.so.0 __clear_cache
./dpkg-deb-tmpdir/usr/lib/GNUstep/System/Libraries/m68k/linux-gnu/gnu-gnu-gnu/libgnustep-gui_d.so.0.7.6 __clear_cache
./dpkg-deb-tmpdir/usr/lib/GNUstep/System/Libraries/m68k/linux-gnu/gnu-gnu-gnu/libgnustep-gui_d.so __clear_cache
./dpkg-deb-tmpdir/usr/lib/GNUstep/System/Libraries/m68k/linux-gnu/gnu-gnu-gnu/libgnustep-gui_d.so.0 __clear_cache
Only libgnostep-gui needs it. However, until we really need
this symbol, it should not be applied. After my build, I
judge it.
__divdi3 __moddi3 __udivdi3 __umoddi3:
* It's already defined in wordsize-32.
s390:
__cmpdi2 __fixdfdi __fixsfdi __fixunsdfdi __fixunssfdi __floatdidf
__floatdisf __ucmpdi2:
* These are simply added into dpatch.
__divdi3 __moddi3 __udivdi3 __umoddi3:
* It's already defined in wordsize-32.
Conclusion: Most symbols should be resolved from woody to sarge for
arm, ia64, m68k, and s390.
Now I would like to commit libgcc-compat-other.dpatch. I can provide
my test build packages, so if you want, please let me know. I attach
this dpatch, Guido, debian-glibc guys, could you review it?
Regards,
-- gotom
#! /bin/sh -e
# DP: Description: libgcc-compat symbols for arm, m68k, ia64, and s390.
# DP: ia64 is derived from RedHat's.
# DP: Author: GOTO Masanori <gotom@debian.org>
# DP: Upstream status: Not submitted
# DP: Date: 2002-10-13, updated 2003-03-04
if [ $# -ne 2 ]; then
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
fi
case "$1" in
-patch) patch -d "$2" -f --no-backup-if-mismatch -p1 < $0;;
-unpatch) patch -d "$2" -f --no-backup-if-mismatch -R -p1 < $0;;
*)
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
esac
exit 0
diff -Nuar glibc-2.3.1.old/sysdeps/arm/Dist glibc-2.3.1/sysdeps/arm/Dist
--- glibc-2.3.1.old/sysdeps/arm/Dist 2002-08-27 21:06:52.000000000 +0900
+++ glibc-2.3.1/sysdeps/arm/Dist 2003-03-01 00:29:42.000000000 +0900
@@ -1,2 +1,3 @@
ieee754.h
bits/link.h
+libgcc-compat.c
diff -Nuar glibc-2.3.1.old/sysdeps/arm/Makefile glibc-2.3.1/sysdeps/arm/Makefile
--- glibc-2.3.1.old/sysdeps/arm/Makefile 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.1/sysdeps/arm/Makefile 2003-03-01 00:29:42.000000000 +0900
@@ -0,0 +1,7 @@
+ifeq ($(subdir),csu)
+ifeq (yes,$(build-shared))
+# Compatibility
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
+endif
+endif
diff -Nuar glibc-2.3.1.old/sysdeps/arm/Versions glibc-2.3.1/sysdeps/arm/Versions
--- glibc-2.3.1.old/sysdeps/arm/Versions 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.1/sysdeps/arm/Versions 2003-03-01 18:22:10.000000000 +0900
@@ -0,0 +1,16 @@
+libc {
+ GLIBC_2.0 {
+ # Functions from libgcc.
+ __ashldi3; __ashrdi3;
+ __cmpdi2;
+ __divsi3;
+ __fixdfdi;
+ __floatdidf;
+ __floatdisf;
+ __modsi3;
+ __muldi3;
+ __ucmpdi2;
+ __udivsi3;
+ __umodsi3;
+ }
+}
diff -Nuar glibc-2.3.1.old/sysdeps/arm/libgcc-compat.c glibc-2.3.1/sysdeps/arm/libgcc-compat.c
--- glibc-2.3.1.old/sysdeps/arm/libgcc-compat.c 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.1/sysdeps/arm/libgcc-compat.c 2003-03-02 19:40:20.000000000 +0900
@@ -0,0 +1,111 @@
+/* pre-.hidden libgcc compatibility
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by GOTO Masanori <gotom@debian.org>
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+
+#include <stdint.h>
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6)
+
+extern int64_t __ashldi3 (int64_t, int32_t);
+int64_t __ashldi3_internal (int64_t u, int32_t b)
+{
+ return __ashldi3 (u, b);
+}
+symbol_version (__ashldi3_internal, __ashldi3, GLIBC_2.0);
+
+extern int64_t __ashrdi3 (int64_t, int32_t);
+int32_t __ashrdi3_internal (int64_t u, int32_t b)
+{
+ return __ashrdi3 (u, b);
+}
+symbol_version (__ashrdi3_internal, __ashrdi3, GLIBC_2.0);
+
+extern int32_t __cmpdi2 (int64_t, int64_t);
+int32_t __cmpdi2_internal (int64_t u, int64_t v)
+{
+ return __cmpdi2 (u, v);
+}
+symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0);
+
+extern int32_t __divsi3 (int32_t, int32_t);
+int32_t __divsi3_internal (int32_t u, int32_t v)
+{
+ return __divsi3 (u, v);
+}
+symbol_version (__divsi3_internal, __divsi3, GLIBC_2.0);
+
+extern int64_t __fixdfdi (double);
+int64_t __fixdfdi_internal (double d)
+{
+ return __fixdfdi (d);
+}
+symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0);
+
+extern double __floatdidf (int64_t);
+double __floatdidf_internal (int64_t u)
+{
+ return __floatdidf (u);
+}
+symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0);
+
+extern float __floatdisf (int64_t);
+float __floatdisf_internal (int64_t u)
+{
+ return __floatdisf (u);
+}
+symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0);
+
+extern int32_t __modsi3 (int32_t, int32_t);
+int32_t __modsi3_internal (int32_t u, int32_t v)
+{
+ return __modsi3 (u, v);
+}
+symbol_version (__modsi3_internal, __modsi3, GLIBC_2.0);
+
+extern int64_t __muldi3 (int64_t, int64_t);
+int64_t __muldi3_internal (int64_t u, int64_t v)
+{
+ return __muldi3 (u, v);
+}
+symbol_version (__muldi3_internal, __muldi3, GLIBC_2.0);
+
+extern int32_t __ucmpdi2 (int64_t, int64_t);
+int32_t __ucmpdi2_internal (int64_t u, int64_t v)
+{
+ return __ucmpdi2 (u, v);
+}
+symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0);
+
+extern int32_t __udivsi3 (int32_t, int32_t);
+int32_t __udivsi3_internal (int32_t u, int32_t v)
+{
+ return __udivsi3 (u, v);
+}
+symbol_version (__udivsi3_internal, __udivsi3, GLIBC_2.0);
+
+extern int32_t __umodsi3 (int32_t, int32_t);
+int32_t __umodsi3_internal (int32_t u, int32_t v)
+{
+ return __umodsi3 (u, v);
+}
+symbol_version (__umodsi3_internal, __umodsi3, GLIBC_2.0);
+
+#endif
diff -Nuar glibc-2.3.1.old/sysdeps/ia64/Makefile glibc-2.3.1/sysdeps/ia64/Makefile
--- glibc-2.3.1.old/sysdeps/ia64/Makefile 2002-05-15 05:46:15.000000000 +0900
+++ glibc-2.3.1/sysdeps/ia64/Makefile 2003-03-04 00:51:34.000000000 +0900
@@ -12,8 +12,8 @@
ifeq (yes,$(build-shared))
# Compatibility
-sysdep_routines += ia64libgcc
-shared-only-routines += ia64libgcc
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
endif
endif
diff -Nuar glibc-2.3.1.old/sysdeps/ia64/Versions glibc-2.3.1/sysdeps/ia64/Versions
--- glibc-2.3.1.old/sysdeps/ia64/Versions 2002-05-03 16:00:46.000000000 +0900
+++ glibc-2.3.1/sysdeps/ia64/Versions 2003-03-04 01:14:39.000000000 +0900
@@ -10,5 +10,9 @@
# Functions from libgcc.
__divtf3; __divdf3; __divsf3; __divdi3; __moddi3; __udivdi3; __umoddi3;
__multi3;
+ __divsi3;
+ __modsi3;
+ __udivsi3;
+ __umodsi3;
}
}
diff -Nuar glibc-2.3.1.old/sysdeps/ia64/ia64libgcc.S glibc-2.3.1/sysdeps/ia64/ia64libgcc.S
--- glibc-2.3.1.old/sysdeps/ia64/ia64libgcc.S 2002-05-15 05:46:15.000000000 +0900
+++ glibc-2.3.1/sysdeps/ia64/ia64libgcc.S 2003-03-04 00:51:34.000000000 +0900
@@ -1,350 +0,0 @@
-/* From the Intel IA-64 Optimization Guide, choose the minimum latency
- alternative. */
-
-#include <sysdep.h>
-#undef ret
-
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_2_6)
-
-/* __divtf3
- Compute a 80-bit IEEE double-extended quotient.
- farg0 holds the dividend. farg1 holds the divisor. */
-
-ENTRY(___divtf3)
- cmp.eq p7, p0 = r0, r0
- frcpa.s0 f10, p6 = farg0, farg1
- ;;
-(p6) cmp.ne p7, p0 = r0, r0
- .pred.rel.mutex p6, p7
-(p6) fnma.s1 f11 = farg1, f10, f1
-(p6) fma.s1 f12 = farg0, f10, f0
- ;;
-(p6) fma.s1 f13 = f11, f11, f0
-(p6) fma.s1 f14 = f11, f11, f11
- ;;
-(p6) fma.s1 f11 = f13, f13, f11
-(p6) fma.s1 f13 = f14, f10, f10
- ;;
-(p6) fma.s1 f10 = f13, f11, f10
-(p6) fnma.s1 f11 = farg1, f12, farg0
- ;;
-(p6) fma.s1 f11 = f11, f10, f12
-(p6) fnma.s1 f12 = farg1, f10, f1
- ;;
-(p6) fma.s1 f10 = f12, f10, f10
-(p6) fnma.s1 f12 = farg1, f11, farg0
- ;;
-(p6) fma.s0 fret0 = f12, f10, f11
-(p7) mov fret0 = f10
- br.ret.sptk rp
-END(___divtf3)
- .symver ___divtf3, __divtf3@GLIBC_2.2
-
-/* __divdf3
- Compute a 64-bit IEEE double quotient.
- farg0 holds the dividend. farg1 holds the divisor. */
-
-ENTRY(___divdf3)
- cmp.eq p7, p0 = r0, r0
- frcpa.s0 f10, p6 = farg0, farg1
- ;;
-(p6) cmp.ne p7, p0 = r0, r0
- .pred.rel.mutex p6, p7
-(p6) fmpy.s1 f11 = farg0, f10
-(p6) fnma.s1 f12 = farg1, f10, f1
- ;;
-(p6) fma.s1 f11 = f12, f11, f11
-(p6) fmpy.s1 f13 = f12, f12
- ;;
-(p6) fma.s1 f10 = f12, f10, f10
-(p6) fma.s1 f11 = f13, f11, f11
- ;;
-(p6) fmpy.s1 f12 = f13, f13
-(p6) fma.s1 f10 = f13, f10, f10
- ;;
-(p6) fma.d.s1 f11 = f12, f11, f11
-(p6) fma.s1 f10 = f12, f10, f10
- ;;
-(p6) fnma.d.s1 f8 = farg1, f11, farg0
- ;;
-(p6) fma.d fret0 = f8, f10, f11
-(p7) mov fret0 = f10
- br.ret.sptk rp
- ;;
-END(___divdf3)
- .symver ___divdf3, __divdf3@GLIBC_2.2
-
-/* __divsf3
- Compute a 32-bit IEEE float quotient.
- farg0 holds the dividend. farg1 holds the divisor. */
-
-ENTRY(___divsf3)
- cmp.eq p7, p0 = r0, r0
- frcpa.s0 f10, p6 = farg0, farg1
- ;;
-(p6) cmp.ne p7, p0 = r0, r0
- .pred.rel.mutex p6, p7
-(p6) fmpy.s1 f8 = farg0, f10
-(p6) fnma.s1 f9 = farg1, f10, f1
- ;;
-(p6) fma.s1 f8 = f9, f8, f8
-(p6) fmpy.s1 f9 = f9, f9
- ;;
-(p6) fma.s1 f8 = f9, f8, f8
-(p6) fmpy.s1 f9 = f9, f9
- ;;
-(p6) fma.d.s1 f10 = f9, f8, f8
- ;;
-(p6) fnorm.s.s0 fret0 = f10
-(p7) mov fret0 = f10
- br.ret.sptk rp
- ;;
-END(___divsf3)
- .symver ___divsf3, __divsf3@GLIBC_2.2
-
-/* __divdi3
- Compute a 64-bit integer quotient.
- in0 holds the dividend. in1 holds the divisor. */
-
-ENTRY(___divdi3)
- .regstk 2,0,0,0
- /* Transfer inputs to FP registers. */
- setf.sig f8 = in0
- setf.sig f9 = in1
- ;;
- /* Convert the inputs to FP, so that they won't be treated as
- unsigned. */
- fcvt.xf f8 = f8
- fcvt.xf f9 = f9
- ;;
- /* Compute the reciprocal approximation. */
- frcpa.s1 f10, p6 = f8, f9
- ;;
- /* 3 Newton-Raphson iterations. */
-(p6) fnma.s1 f11 = f9, f10, f1
-(p6) fmpy.s1 f12 = f8, f10
- ;;
-(p6) fmpy.s1 f13 = f11, f11
-(p6) fma.s1 f12 = f11, f12, f12
- ;;
-(p6) fma.s1 f10 = f11, f10, f10
-(p6) fma.s1 f11 = f13, f12, f12
- ;;
-(p6) fma.s1 f10 = f13, f10, f10
-(p6) fnma.s1 f12 = f9, f11, f8
- ;;
-(p6) fma.s1 f10 = f12, f10, f11
- ;;
- /* Round quotient to an integer. */
- fcvt.fx.trunc.s1 f10 = f10
- ;;
- /* Transfer result to GP registers. */
- getf.sig ret0 = f10
- br.ret.sptk rp
- ;;
-END(___divdi3)
- .symver ___divdi3, __divdi3@GLIBC_2.2
-
-/* __moddi3
- Compute a 64-bit integer modulus.
- in0 holds the dividend (a). in1 holds the divisor (b). */
-
-ENTRY(___moddi3)
- .regstk 2,0,0,0
- /* Transfer inputs to FP registers. */
- setf.sig f14 = in0
- setf.sig f9 = in1
- ;;
- /* Convert the inputs to FP, so that they won't be treated as
- unsigned. */
- fcvt.xf f8 = f14
- fcvt.xf f9 = f9
- ;;
- /* Compute the reciprocal approximation. */
- frcpa.s1 f10, p6 = f8, f9
- ;;
- /* 3 Newton-Raphson iterations. */
-(p6) fmpy.s1 f12 = f8, f10
-(p6) fnma.s1 f11 = f9, f10, f1
- ;;
-(p6) fma.s1 f12 = f11, f12, f12
-(p6) fmpy.s1 f13 = f11, f11
- ;;
-(p6) fma.s1 f10 = f11, f10, f10
-(p6) fma.s1 f11 = f13, f12, f12
- ;;
- sub in1 = r0, in1
-(p6) fma.s1 f10 = f13, f10, f10
-(p6) fnma.s1 f12 = f9, f11, f8
- ;;
- setf.sig f9 = in1
-(p6) fma.s1 f10 = f12, f10, f11
- ;;
- fcvt.fx.trunc.s1 f10 = f10
- ;;
- /* r = q * (-b) + a */
- xma.l f10 = f10, f9, f14
- ;;
- /* Transfer result to GP registers. */
- getf.sig ret0 = f10
- br.ret.sptk rp
- ;;
-END(___moddi3)
- .symver ___moddi3, __moddi3@GLIBC_2.2
-
-/* __udivdi3
- Compute a 64-bit unsigned integer quotient.
- in0 holds the dividend. in1 holds the divisor. */
-
-ENTRY(___udivdi3)
- .regstk 2,0,0,0
- /* Transfer inputs to FP registers. */
- setf.sig f8 = in0
- setf.sig f9 = in1
- ;;
- /* Convert the inputs to FP, to avoid FP software-assist faults. */
- fcvt.xuf.s1 f8 = f8
- fcvt.xuf.s1 f9 = f9
- ;;
- /* Compute the reciprocal approximation. */
- frcpa.s1 f10, p6 = f8, f9
- ;;
- /* 3 Newton-Raphson iterations. */
-(p6) fnma.s1 f11 = f9, f10, f1
-(p6) fmpy.s1 f12 = f8, f10
- ;;
-(p6) fmpy.s1 f13 = f11, f11
-(p6) fma.s1 f12 = f11, f12, f12
- ;;
-(p6) fma.s1 f10 = f11, f10, f10
-(p6) fma.s1 f11 = f13, f12, f12
- ;;
-(p6) fma.s1 f10 = f13, f10, f10
-(p6) fnma.s1 f12 = f9, f11, f8
- ;;
-(p6) fma.s1 f10 = f12, f10, f11
- ;;
- /* Round quotient to an unsigned integer. */
- fcvt.fxu.trunc.s1 f10 = f10
- ;;
- /* Transfer result to GP registers. */
- getf.sig ret0 = f10
- br.ret.sptk rp
- ;;
-END(___udivdi3)
- .symver ___udivdi3, __udivdi3@GLIBC_2.2
-
-/* __umoddi3
- Compute a 64-bit unsigned integer modulus.
- in0 holds the dividend (a). in1 holds the divisor (b). */
-
-ENTRY(___umoddi3)
- .regstk 2,0,0,0
- /* Transfer inputs to FP registers. */
- setf.sig f14 = in0
- setf.sig f9 = in1
- ;;
- /* Convert the inputs to FP, to avoid FP software assist faults. */
- fcvt.xuf.s1 f8 = f14
- fcvt.xuf.s1 f9 = f9
- ;;
- /* Compute the reciprocal approximation. */
- frcpa.s1 f10, p6 = f8, f9
- ;;
- /* 3 Newton-Raphson iterations. */
-(p6) fmpy.s1 f12 = f8, f10
-(p6) fnma.s1 f11 = f9, f10, f1
- ;;
-(p6) fma.s1 f12 = f11, f12, f12
-(p6) fmpy.s1 f13 = f11, f11
- ;;
-(p6) fma.s1 f10 = f11, f10, f10
-(p6) fma.s1 f11 = f13, f12, f12
- ;;
- sub in1 = r0, in1
-(p6) fma.s1 f10 = f13, f10, f10
-(p6) fnma.s1 f12 = f9, f11, f8
- ;;
- setf.sig f9 = in1
-(p6) fma.s1 f10 = f12, f10, f11
- ;;
- /* Round quotient to an unsigned integer. */
- fcvt.fxu.trunc.s1 f10 = f10
- ;;
- /* r = q * (-b) + a */
- xma.l f10 = f10, f9, f14
- ;;
- /* Transfer result to GP registers. */
- getf.sig ret0 = f10
- br.ret.sptk rp
- ;;
-END(___umoddi3)
- .symver ___umoddi3, __umoddi3@GLIBC_2.2
-
-/* __multi3
- Compute a 128-bit multiply of 128-bit multiplicands.
- in0/in1 holds one multiplicand (a), in2/in3 holds the other one (b). */
-
-ENTRY(___multi3)
- .regstk 4,0,0,0
- setf.sig f6 = in1
- movl r19 = 0xffffffff
- setf.sig f7 = in2
- ;;
- and r14 = r19, in0
- ;;
- setf.sig f10 = r14
- and r14 = r19, in2
- xmpy.l f9 = f6, f7
- ;;
- setf.sig f6 = r14
- shr.u r14 = in0, 32
- ;;
- setf.sig f7 = r14
- shr.u r14 = in2, 32
- ;;
- setf.sig f8 = r14
- xmpy.l f11 = f10, f6
- xmpy.l f6 = f7, f6
- ;;
- getf.sig r16 = f11
- xmpy.l f7 = f7, f8
- ;;
- shr.u r14 = r16, 32
- and r16 = r19, r16
- getf.sig r17 = f6
- setf.sig f6 = in0
- ;;
- setf.sig f11 = r14
- getf.sig r21 = f7
- setf.sig f7 = in3
- ;;
- xma.l f11 = f10, f8, f11
- xma.l f6 = f6, f7, f9
- ;;
- getf.sig r18 = f11
- ;;
- add r18 = r18, r17
- ;;
- and r15 = r19, r18
- cmp.ltu p7, p6 = r18, r17
- ;;
- getf.sig r22 = f6
-(p7) adds r14 = 1, r19
- ;;
-(p7) add r21 = r21, r14
- shr.u r14 = r18, 32
- shl r15 = r15, 32
- ;;
- add r20 = r21, r14
- ;;
- add ret0 = r15, r16
- add ret1 = r22, r20
- br.ret.sptk rp
- ;;
-END(___multi3)
- .symver ___multi3, __multi3@GLIBC_2.2
-
-#endif
diff -Nuar glibc-2.3.1.old/sysdeps/ia64/libgcc-compat.c glibc-2.3.1/sysdeps/ia64/libgcc-compat.c
--- glibc-2.3.1.old/sysdeps/ia64/libgcc-compat.c 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.1/sysdeps/ia64/libgcc-compat.c 2003-03-04 01:18:08.000000000 +0900
@@ -0,0 +1,112 @@
+/* pre-.hidden libgcc compatibility
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+
+#include <stdint.h>
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_2_6)
+
+typedef int int128_t __attribute__((__mode__(TI)));
+
+extern long double __divtf3 (long double, long double) attribute_hidden;
+long double INTUSE (__divtf3) (long double x, long double y)
+{
+ return __divtf3 (x, y);
+}
+symbol_version (INTUSE (__divtf3), __divtf3, GLIBC_2.2);
+
+extern double __divdf3 (double, double) attribute_hidden;
+double INTUSE (__divdf3) (double x, double y)
+{
+ return __divdf3 (x, y);
+}
+symbol_version (INTUSE (__divdf3), __divdf3, GLIBC_2.2);
+
+extern float __divsf3 (float, float) attribute_hidden;
+float INTUSE (__divsf3) (float x, float y)
+{
+ return __divsf3 (x, y);
+}
+symbol_version (INTUSE (__divsf3), __divsf3, GLIBC_2.2);
+
+extern int64_t __divdi3 (int64_t, int64_t) attribute_hidden;
+int64_t INTUSE (__divdi3) (int64_t x, int64_t y)
+{
+ return __divdi3 (x, y);
+}
+symbol_version (INTUSE (__divdi3), __divdi3, GLIBC_2.2);
+
+extern int64_t __moddi3 (int64_t, int64_t) attribute_hidden;
+int64_t INTUSE (__moddi3) (int64_t x, int64_t y)
+{
+ return __moddi3 (x, y);
+}
+symbol_version (INTUSE (__moddi3), __moddi3, GLIBC_2.2);
+
+extern uint64_t __udivdi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t INTUSE (__udivdi3) (uint64_t x, uint64_t y)
+{
+ return __udivdi3 (x, y);
+}
+symbol_version (INTUSE (__udivdi3), __udivdi3, GLIBC_2.2);
+
+extern uint64_t __umoddi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t INTUSE (__umoddi3) (uint64_t x, uint64_t y)
+{
+ return __umoddi3 (x, y);
+}
+symbol_version (INTUSE (__umoddi3), __umoddi3, GLIBC_2.2);
+
+extern int128_t __multi3 (int128_t, int128_t) attribute_hidden;
+int128_t INTUSE (__multi3) (int128_t x, int128_t y)
+{
+ return __multi3 (x, y);
+}
+symbol_version (INTUSE (__multi3), __multi3, GLIBC_2.2);
+
+extern int64_t __divsi3 (int64_t, int64_t) attribute_hidden;
+int64_t INTUSE (__divsi3) (int64_t x, int64_t y)
+{
+ return __divsi3 (x, y);
+}
+symbol_version (INTUSE (__divsi3), __divsi3, GLIBC_2.2);
+
+extern int64_t __modsi3 (int64_t, int64_t) attribute_hidden;
+int64_t INTUSE (__modsi3) (int64_t x, int64_t y)
+{
+ return __modsi3 (x, y);
+}
+symbol_version (INTUSE (__modsi3), __modsi3, GLIBC_2.2);
+
+extern uint64_t __udivsi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t INTUSE (__udivsi3) (uint64_t x, uint64_t y)
+{
+ return __udivsi3 (x, y);
+}
+symbol_version (INTUSE (__udivsi3), __udivsi3, GLIBC_2.2);
+
+extern uint64_t __umodsi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t INTUSE (__umodsi3) (uint64_t x, uint64_t y)
+{
+ return __umodsi3 (x, y);
+}
+symbol_version (INTUSE (__umodsi3), __umodsi3, GLIBC_2.2);
+
+#endif
diff -Nuar glibc-2.3.1.old/sysdeps/m68k/Deps glibc-2.3.1/sysdeps/m68k/Deps
--- glibc-2.3.1.old/sysdeps/m68k/Deps 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.1/sysdeps/m68k/Deps 2003-03-01 00:29:42.000000000 +0900
@@ -0,0 +1 @@
+libgcc-compat.c
diff -Nuar glibc-2.3.1.old/sysdeps/m68k/Makefile glibc-2.3.1/sysdeps/m68k/Makefile
--- glibc-2.3.1.old/sysdeps/m68k/Makefile 2003-02-27 19:29:49.000000000 +0900
+++ glibc-2.3.1/sysdeps/m68k/Makefile 2003-03-01 00:29:42.000000000 +0900
@@ -1,4 +1,4 @@
-# Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
+# Copyright (C) 1993, 1994, 1996, 1997, 2003 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@@ -45,3 +45,11 @@
# Build objects in libc_nonshared.a with -fPIC (instead of -fpic) to avoid
# possible linkage problems.
CFLAGS-.oS += -fPIC
+
+ifeq ($(subdir),csu)
+ifeq (yes,$(build-shared))
+# Compatibility
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
+endif
+endif
diff -Nuar glibc-2.3.1.old/sysdeps/m68k/Versions glibc-2.3.1/sysdeps/m68k/Versions
--- glibc-2.3.1.old/sysdeps/m68k/Versions 2000-06-15 15:54:28.000000000 +0900
+++ glibc-2.3.1/sysdeps/m68k/Versions 2003-03-02 01:12:58.000000000 +0900
@@ -2,5 +2,13 @@
GLIBC_2.0 {
# Functions from libgcc.
__divdi3; __moddi3; __udivdi3; __umoddi3;
+ __ashldi3;
+ __ashrdi3;
+ __fixdfdi;
+ __fixsfdi;
+ __fixunsdfdi;
+ __fixunssfdi;
+ __floatdidf;
+ __floatdisf;
}
}
diff -Nuar glibc-2.3.1.old/sysdeps/m68k/libgcc-compat.c glibc-2.3.1/sysdeps/m68k/libgcc-compat.c
--- glibc-2.3.1.old/sysdeps/m68k/libgcc-compat.c 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.1/sysdeps/m68k/libgcc-compat.c 2003-03-02 13:26:49.000000000 +0900
@@ -0,0 +1,83 @@
+/* pre-.hidden libgcc compatibility
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by GOTO Masanori <gotom@debian.org>
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+
+#include <stdint.h>
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6)
+
+extern int64_t __ashldi3 (int64_t, int32_t);
+int64_t __ashldi3_internal (int64_t u, int32_t b)
+{
+ return __ashldi3 (u, b);
+}
+symbol_version (__ashldi3_internal, __ashldi3, GLIBC_2.0);
+
+extern int64_t __ashrdi3 (int64_t, int32_t);
+int64_t __ashrdi3_internal (int64_t u, int32_t b)
+{
+ return __ashrdi3 (u, b);
+}
+symbol_version (__ashrdi3_internal, __ashrdi3, GLIBC_2.0);
+
+extern int64_t __fixdfdi (double);
+int64_t __fixdfdi_internal (double d)
+{
+ return __fixdfdi (d);
+}
+symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0);
+
+extern int64_t __fixsfdi (float);
+int64_t __fixsfdi_internal (float d)
+{
+ return __fixsfdi (d);
+}
+symbol_version (__fixsfdi_internal, __fixsfdi, GLIBC_2.0);
+
+extern int64_t __fixunsdfdi (double);
+int64_t __fixunsdfdi_internal (double d)
+{
+ return __fixunsdfdi (d);
+}
+symbol_version (__fixunsdfdi_internal, __fixunsdfdi, GLIBC_2.0);
+
+extern int64_t __fixunssfdi (float);
+int64_t __fixunssfdi_internal (float d)
+{
+ return __fixunssfdi (d);
+}
+symbol_version (__fixunssfdi_internal, __fixunssfdi, GLIBC_2.0);
+
+extern double __floatdidf (int64_t);
+double __floatdidf_internal (int64_t u)
+{
+ return __floatdidf (u);
+}
+symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0);
+
+extern float __floatdisf (int64_t);
+float __floatdisf_internal (int64_t u)
+{
+ return __floatdisf (u);
+}
+symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0);
+
+#endif
diff -Nuar glibc-2.3.1.old/sysdeps/s390/s390-32/Dist glibc-2.3.1/sysdeps/s390/s390-32/Dist
--- glibc-2.3.1.old/sysdeps/s390/s390-32/Dist 2001-03-27 14:14:38.000000000 +0900
+++ glibc-2.3.1/sysdeps/s390/s390-32/Dist 2003-03-02 11:09:37.000000000 +0900
@@ -1 +1,2 @@
s390-mcount.S
+libgcc-compat.c
diff -Nuar glibc-2.3.1.old/sysdeps/s390/s390-32/Makefile glibc-2.3.1/sysdeps/s390/s390-32/Makefile
--- glibc-2.3.1.old/sysdeps/s390/s390-32/Makefile 2002-09-19 15:42:09.000000000 +0900
+++ glibc-2.3.1/sysdeps/s390/s390-32/Makefile 2003-03-02 11:09:11.000000000 +0900
@@ -9,3 +9,11 @@
CFLAGS-dl-load.c += -Wno-unused
CFLAGS-dl-reloc.c += -Wno-unused
endif
+
+ifeq ($(subdir),csu)
+ifeq (yes,$(build-shared))
+# Compatibility
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
+endif
+endif
diff -Nuar glibc-2.3.1.old/sysdeps/s390/s390-32/Versions glibc-2.3.1/sysdeps/s390/s390-32/Versions
--- glibc-2.3.1.old/sysdeps/s390/s390-32/Versions 2001-03-16 17:15:07.000000000 +0900
+++ glibc-2.3.1/sysdeps/s390/s390-32/Versions 2003-03-02 11:08:03.000000000 +0900
@@ -2,5 +2,13 @@
GLIBC_2.0 {
# Functions from libgcc.
__divdi3; __moddi3; __udivdi3; __umoddi3;
+ __cmpdi2;
+ __fixdfdi;
+ __fixsfdi;
+ __fixunsdfdi;
+ __fixunssfdi;
+ __floatdidf;
+ __floatdisf;
+ __ucmpdi2;
}
}
diff -Nuar glibc-2.3.1.old/sysdeps/s390/s390-32/libgcc-compat.c glibc-2.3.1/sysdeps/s390/s390-32/libgcc-compat.c
--- glibc-2.3.1.old/sysdeps/s390/s390-32/libgcc-compat.c 1970-01-01 09:00:00.000000000 +0900
+++ glibc-2.3.1/sysdeps/s390/s390-32/libgcc-compat.c 2003-03-02 19:42:19.000000000 +0900
@@ -0,0 +1,83 @@
+/* pre-.hidden libgcc compatibility
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by GOTO Masanori <gotom@debian.org>
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+
+#include <stdint.h>
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6)
+
+extern int32_t __cmpdi2 (int64_t, int64_t);
+int32_t __cmpdi2_internal (int64_t u, int64_t v)
+{
+ return __cmpdi2 (u, v);
+}
+symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0);
+
+extern int64_t __fixdfdi (double);
+int64_t __fixdfdi_internal (double d)
+{
+ return __fixdfdi (d);
+}
+symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0);
+
+extern int64_t __fixsfdi (float);
+int64_t __fixsfdi_internal (float d)
+{
+ return __fixsfdi (d);
+}
+symbol_version (__fixsfdi_internal, __fixsfdi, GLIBC_2.0);
+
+extern int64_t __fixunsdfdi (double);
+int64_t __fixunsdfdi_internal (double d)
+{
+ return __fixunsdfdi (d);
+}
+symbol_version (__fixunsdfdi_internal, __fixunsdfdi, GLIBC_2.0);
+
+extern int64_t __fixunssfdi (float);
+int64_t __fixunssfdi_internal (float d)
+{
+ return __fixunssfdi (d);
+}
+symbol_version (__fixunssfdi_internal, __fixunssfdi, GLIBC_2.0);
+
+extern double __floatdidf (int64_t);
+double __floatdidf_internal (int64_t u)
+{
+ return __floatdidf (u);
+}
+symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0);
+
+extern float __floatdisf (int64_t);
+float __floatdisf_internal (int64_t u)
+{
+ return __floatdisf (u);
+}
+symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0);
+
+extern int32_t __ucmpdi2 (int64_t, int64_t);
+int32_t __ucmpdi2_internal (int64_t u, int64_t v)
+{
+ return __ucmpdi2 (u, v);
+}
+symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0);
+
+#endif
Reply to: