1 /* memcopy.h -- definitions for memory copy functions.  Motorola 68020 version.
2    Copyright (C) 1991-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library.  If not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #include <sysdeps/generic/memcopy.h>
20 
21 #if	defined(__mc68020__) || defined(mc68020)
22 
23 #undef	OP_T_THRES
24 #define	OP_T_THRES	16
25 
26 /* WORD_COPY_FWD and WORD_COPY_BWD are not symmetric on the 68020,
27    because of its weird instruction overlap characteristics.  */
28 
29 #undef	WORD_COPY_FWD
30 #define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes)		      \
31   do									      \
32     {									      \
33       size_t __nwords = (nbytes) / sizeof (op_t);			      \
34       size_t __nblocks = __nwords / 8 + 1;				      \
35       dst_bp -= (8 - __nwords % 8) * sizeof (op_t);			      \
36       src_bp -= (8 - __nwords % 8) * sizeof (op_t);			      \
37       switch (__nwords % 8)						      \
38 	do								      \
39 	  {								      \
40 	    ((op_t *) dst_bp)[0] = ((op_t *) src_bp)[0];		      \
41 	    /* Fall through.  */					      \
42 	  case 7:							      \
43 	    ((op_t *) dst_bp)[1] = ((op_t *) src_bp)[1];		      \
44 	    /* Fall through.  */					      \
45 	  case 6:							      \
46 	    ((op_t *) dst_bp)[2] = ((op_t *) src_bp)[2];		      \
47 	    /* Fall through.  */					      \
48 	  case 5:							      \
49 	    ((op_t *) dst_bp)[3] = ((op_t *) src_bp)[3];		      \
50 	    /* Fall through.  */					      \
51 	  case 4:							      \
52 	    ((op_t *) dst_bp)[4] = ((op_t *) src_bp)[4];		      \
53 	    /* Fall through.  */					      \
54 	  case 3:							      \
55 	    ((op_t *) dst_bp)[5] = ((op_t *) src_bp)[5];		      \
56 	    /* Fall through.  */					      \
57 	  case 2:							      \
58 	    ((op_t *) dst_bp)[6] = ((op_t *) src_bp)[6];		      \
59 	    /* Fall through.  */					      \
60 	  case 1:							      \
61 	    ((op_t *) dst_bp)[7] = ((op_t *) src_bp)[7];		      \
62 	    /* Fall through.  */					      \
63 	  case 0:							      \
64 	    src_bp += 32;						      \
65 	    dst_bp += 32;						      \
66 	    __nblocks--;						      \
67 	  }								      \
68       while (__nblocks != 0);						      \
69       (nbytes_left) = (nbytes) % sizeof (op_t);				      \
70     } while (0)
71 
72 #undef	WORD_COPY_BWD
73 #define WORD_COPY_BWD(dst_ep, src_ep, nbytes_left, nbytes)		      \
74   do									      \
75     {									      \
76       size_t __nblocks = (nbytes) / 32 + 1;				      \
77       op_t *__dst_ep = (op_t *) (dst_ep);				      \
78       op_t *__src_ep = (op_t *) (src_ep);				      \
79       switch ((nbytes) / sizeof (op_t) % 8)				      \
80 	do								      \
81 	  {								      \
82 	    *--__dst_ep = *--__src_ep;					      \
83 	    /* Fall through.  */					      \
84 	  case 7:							      \
85 	    *--__dst_ep = *--__src_ep;					      \
86 	    /* Fall through.  */					      \
87 	  case 6:							      \
88 	    *--__dst_ep = *--__src_ep;					      \
89 	    /* Fall through.  */					      \
90 	  case 5:							      \
91 	    *--__dst_ep = *--__src_ep;					      \
92 	    /* Fall through.  */					      \
93 	  case 4:							      \
94 	    *--__dst_ep = *--__src_ep;					      \
95 	    /* Fall through.  */					      \
96 	  case 3:							      \
97 	    *--__dst_ep = *--__src_ep;					      \
98 	    /* Fall through.  */					      \
99 	  case 2:							      \
100 	    *--__dst_ep = *--__src_ep;					      \
101 	    /* Fall through.  */					      \
102 	  case 1:							      \
103 	    *--__dst_ep = *--__src_ep;					      \
104 	    /* Fall through.  */					      \
105 	  case 0:							      \
106 	    __nblocks--;						      \
107 	  }								      \
108       while (__nblocks != 0);						      \
109       (nbytes_left) = (nbytes) % sizeof (op_t);				      \
110       (dst_ep) = (unsigned long) __dst_ep;				      \
111       (src_ep) = (unsigned long) __src_ep;				      \
112     } while (0)
113 
114 #endif
115