Browse Source

glibc: fix m68k compile for m68040 cpu

See here for details:
https://sourceware.org/bugzilla/show_bug.cgi?id=30740
Waldemar Brodkorb 9 months ago
parent
commit
bdbc603c54
1 changed files with 231 additions and 0 deletions
  1. 231 0
      toolchain/glibc/patches/2.38/m68k-m68040.patch

+ 231 - 0
toolchain/glibc/patches/2.38/m68k-m68040.patch

@@ -0,0 +1,231 @@
+diff -Nur glibc-2.38.orig/sysdeps/m68k/m680x0/bits/flt-eval-method.h glibc-2.38/sysdeps/m68k/m680x0/bits/flt-eval-method.h
+--- glibc-2.38.orig/sysdeps/m68k/m680x0/bits/flt-eval-method.h	2023-07-31 19:54:16.000000000 +0200
++++ glibc-2.38/sysdeps/m68k/m680x0/bits/flt-eval-method.h	1970-01-01 01:00:00.000000000 +0100
+@@ -1,25 +0,0 @@
+-/* Define __GLIBC_FLT_EVAL_METHOD.  M68K version.
+-   Copyright (C) 2016-2023 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, see
+-   <https://www.gnu.org/licenses/>.  */
+-
+-#ifndef _MATH_H
+-# error "Never use <bits/flt-eval-method.h> directly; include <math.h> instead."
+-#endif
+-
+-/* The m68k FPUs evaluate all values in the 96-bit floating-point
+-   format which is also available for the user as 'long double'.  */
+-#define __GLIBC_FLT_EVAL_METHOD	2
+diff -Nur glibc-2.38.orig/sysdeps/m68k/m680x0/lshift.S glibc-2.38/sysdeps/m68k/m680x0/lshift.S
+--- glibc-2.38.orig/sysdeps/m68k/m680x0/lshift.S	2023-07-31 19:54:16.000000000 +0200
++++ glibc-2.38/sysdeps/m68k/m680x0/lshift.S	1970-01-01 01:00:00.000000000 +0100
+@@ -1,168 +0,0 @@
+-/* mc68020 __mpn_lshift -- Shift left a low-level natural-number integer.
+-
+-Copyright (C) 1996-2023 Free Software Foundation, Inc.
+-
+-This file is part of the GNU MP Library.
+-
+-The GNU MP 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 MP 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 MP Library.  If not, see <https://www.gnu.org/licenses/>.  */
+-
+-/*
+-  INPUT PARAMETERS
+-  res_ptr	(sp + 4)
+-  s_ptr		(sp + 8)
+-  s_size	(sp + 16)
+-  cnt		(sp + 12)
+-*/
+-
+-#include "sysdep.h"
+-#include "asm-syntax.h"
+-
+-#define res_ptr a1
+-#define s_ptr a0
+-#define s_size d6
+-#define cnt d4
+-
+-	TEXT
+-ENTRY(__mpn_lshift)
+-
+-/* Save used registers on the stack.  */
+-	moveml	R(d2)-R(d6)/R(a2),MEM_PREDEC(sp)
+-	cfi_adjust_cfa_offset (6*4)
+-	cfi_rel_offset (R(d2), 0)
+-	cfi_rel_offset (R(d3), 4)
+-	cfi_rel_offset (R(d4), 8)
+-	cfi_rel_offset (R(d5), 12)
+-	cfi_rel_offset (R(d6), 16)
+-	cfi_rel_offset (R(a2), 20)
+-
+-/* Copy the arguments to registers.  */
+-	movel	MEM_DISP(sp,28),R(res_ptr)
+-	movel	MEM_DISP(sp,32),R(s_ptr)
+-	movel	MEM_DISP(sp,36),R(s_size)
+-	movel	MEM_DISP(sp,40),R(cnt)
+-
+-	moveql	#1,R(d5)
+-	cmpl	R(d5),R(cnt)
+-	bne	L(Lnormal)
+-	cmpl	R(s_ptr),R(res_ptr)
+-	bls	L(Lspecial)		/* jump if s_ptr >= res_ptr */
+-#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+-	lea	MEM_INDX1(s_ptr,s_size,l,4),R(a2)
+-#else /* not mc68020 */
+-	movel	R(s_size),R(d0)
+-	asll	#2,R(d0)
+-	lea	MEM_INDX(s_ptr,d0,l),R(a2)
+-#endif
+-	cmpl	R(res_ptr),R(a2)
+-	bls	L(Lspecial)		/* jump if res_ptr >= s_ptr + s_size */
+-
+-L(Lnormal:)
+-	moveql	#32,R(d5)
+-	subl	R(cnt),R(d5)
+-
+-#if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
+-	lea	MEM_INDX1(s_ptr,s_size,l,4),R(s_ptr)
+-	lea	MEM_INDX1(res_ptr,s_size,l,4),R(res_ptr)
+-#else /* not mc68000 */
+-	movel	R(s_size),R(d0)
+-	asll	#2,R(d0)
+-	addl	R(s_size),R(s_ptr)
+-	addl	R(s_size),R(res_ptr)
+-#endif
+-	movel	MEM_PREDEC(s_ptr),R(d2)
+-	movel	R(d2),R(d0)
+-	lsrl	R(d5),R(d0)		/* compute carry limb */
+-
+-	lsll	R(cnt),R(d2)
+-	movel	R(d2),R(d1)
+-	subql	#1,R(s_size)
+-	beq	L(Lend)
+-	lsrl	#1,R(s_size)
+-	bcs	L(L1)
+-	subql	#1,R(s_size)
+-
+-L(Loop:)
+-	movel	MEM_PREDEC(s_ptr),R(d2)
+-	movel	R(d2),R(d3)
+-	lsrl	R(d5),R(d3)
+-	orl	R(d3),R(d1)
+-	movel	R(d1),MEM_PREDEC(res_ptr)
+-	lsll	R(cnt),R(d2)
+-L(L1:)
+-	movel	MEM_PREDEC(s_ptr),R(d1)
+-	movel	R(d1),R(d3)
+-	lsrl	R(d5),R(d3)
+-	orl	R(d3),R(d2)
+-	movel	R(d2),MEM_PREDEC(res_ptr)
+-	lsll	R(cnt),R(d1)
+-
+-	dbf	R(s_size),L(Loop)
+-	subl	#0x10000,R(s_size)
+-	bcc	L(Loop)
+-
+-L(Lend:)
+-	movel	R(d1),MEM_PREDEC(res_ptr) /* store least significant limb */
+-
+-/* Restore used registers from stack frame.  */
+-	moveml	MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+-	cfi_remember_state
+-	cfi_adjust_cfa_offset (-6*4)
+-	cfi_restore (R(d2))
+-	cfi_restore (R(d3))
+-	cfi_restore (R(d4))
+-	cfi_restore (R(d5))
+-	cfi_restore (R(d6))
+-	cfi_restore (R(a2))
+-	rts
+-
+-/* We loop from least significant end of the arrays, which is only
+-   permissible if the source and destination don't overlap, since the
+-   function is documented to work for overlapping source and destination.  */
+-
+-	cfi_restore_state
+-L(Lspecial:)
+-	clrl	R(d0)			/* initialize carry */
+-	eorw	#1,R(s_size)
+-	lsrl	#1,R(s_size)
+-	bcc	L(LL1)
+-	subql	#1,R(s_size)
+-
+-L(LLoop:)
+-	movel	MEM_POSTINC(s_ptr),R(d2)
+-	addxl	R(d2),R(d2)
+-	movel	R(d2),MEM_POSTINC(res_ptr)
+-L(LL1:)
+-	movel	MEM_POSTINC(s_ptr),R(d2)
+-	addxl	R(d2),R(d2)
+-	movel	R(d2),MEM_POSTINC(res_ptr)
+-
+-	dbf	R(s_size),L(LLoop)
+-	addxl	R(d0),R(d0)		/* save cy in lsb */
+-	subl	#0x10000,R(s_size)
+-	bcs	L(LLend)
+-	lsrl	#1,R(d0)		/* restore cy */
+-	bra	L(LLoop)
+-
+-L(LLend:)
+-/* Restore used registers from stack frame.  */
+-	moveml	MEM_POSTINC(sp),R(d2)-R(d6)/R(a2)
+-	cfi_adjust_cfa_offset (-6*4)
+-	cfi_restore (R(d2))
+-	cfi_restore (R(d3))
+-	cfi_restore (R(d4))
+-	cfi_restore (R(d5))
+-	cfi_restore (R(d6))
+-	cfi_restore (R(a2))
+-	rts
+-END(__mpn_lshift)
+diff -Nur glibc-2.38.orig/sysdeps/m68k/m680x0/m68020/wordcopy.S glibc-2.38/sysdeps/m68k/m680x0/m68020/wordcopy.S
+--- glibc-2.38.orig/sysdeps/m68k/m680x0/m68020/wordcopy.S	2023-07-31 19:54:16.000000000 +0200
++++ glibc-2.38/sysdeps/m68k/m680x0/m68020/wordcopy.S	1970-01-01 01:00:00.000000000 +0100
+@@ -1 +0,0 @@
+-/* Empty, not needed.  */
+diff -Nur glibc-2.38.orig/sysdeps/m68k/wordcopy.c glibc-2.38/sysdeps/m68k/wordcopy.c
+--- glibc-2.38.orig/sysdeps/m68k/wordcopy.c	1970-01-01 01:00:00.000000000 +0100
++++ glibc-2.38/sysdeps/m68k/wordcopy.c	2023-08-10 16:23:10.972526508 +0200
+@@ -0,0 +1,21 @@
++/* Definitions for memory copy functions.  Motorola 68020 version.                                                                                                                                                 
++   Copyright (C) 2023 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, see                                                                                                                                                              
++   <https://www.gnu.org/licenses/>.  */                                                                                                                                                                            
++                                                                                                                                                                                                                   
++#if !defined(__mc68020__) && !defined(mc68020)                                                                                                                                                                     
++#include <string/wordcopy.c>                                                                                                                                                                                       
++#endif