hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/* Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
   2004, 2005, 2006
   Free Software Foundation, Inc.
 
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
!! libgcc routines for the Renesas / SuperH SH CPUs.
!! Contributed by Steve Chamberlain.
!! sac@cygnus.com
 
!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines
!! recoded in assembly by Toshiyasu Morita
!! tm@netcom.com
 
/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and
   ELF local label prefixes by J"orn Rennecke
   amylaar@cygnus.com  */
 
   .text
   .balign    4
   .global    __movmem
   .global __movstr
   .set __movstr, __movmem
   /* This would be a lot simpler if r6 contained the byte count
      minus 64, and we wouldn't be called here for a byte count of 64.  */
__movmem:
   sts.l    pr,@-r15
   shll2    r6
   bsr    __movmemSI52+2
   mov.l    @(48,r5),r0
   .balign    4
movmem_loop: /* Reached with rts */
   mov.l    @(60,r5),r0
   add    #-64,r6
   mov.l    r0,@(60,r4)
   tst    r6,r6
   mov.l    @(56,r5),r0
   bt    movmem_done
   mov.l    r0,@(56,r4)
   cmp/pl    r6
   mov.l    @(52,r5),r0
   add    #64,r5
   mov.l    r0,@(52,r4)
   add    #64,r4
   bt    __movmemSI52
! done all the large groups, do the remainder
! jump to movmem+
   mova    __movmemSI4+4,r0
   add    r6,r0
   jmp    @r0
movmem_done: ! share slot insn, works out aligned.
   lds.l    @r15+,pr
   mov.l    r0,@(56,r4)
   mov.l    @(52,r5),r0
   rts
   mov.l    r0,@(52,r4)
   .balign    4
 
   .global    __movmemSI64
   .global __movstrSI64
   .set    __movstrSI64, __movmemSI64
__movmemSI64:
   mov.l    @(60,r5),r0
   mov.l    r0,@(60,r4)
   .global    __movmemSI60
   .global __movstrSI60
   .set    __movstrSI60, __movmemSI60
__movmemSI60:
   mov.l    @(56,r5),r0
   mov.l    r0,@(56,r4)
   .global    __movmemSI56
   .global __movstrSI56
   .set    __movstrSI56, __movmemSI56
__movmemSI56:
   mov.l    @(52,r5),r0
   mov.l    r0,@(52,r4)
   .global    __movmemSI52
   .global __movstrSI52
   .set    __movstrSI52, __movmemSI52
__movmemSI52:
   mov.l    @(48,r5),r0
   mov.l    r0,@(48,r4)
   .global    __movmemSI48
   .global    __movstrSI48
   .set    __movstrSI48, __movmemSI48
__movmemSI48:
   mov.l    @(44,r5),r0
   mov.l    r0,@(44,r4)
   .global    __movmemSI44
   .global    __movstrSI44
   .set    __movstrSI44, __movmemSI44
__movmemSI44:
   mov.l    @(40,r5),r0
   mov.l    r0,@(40,r4)
   .global    __movmemSI40
   .global __movstrSI40
   .set    __movstrSI40, __movmemSI40
__movmemSI40:
   mov.l    @(36,r5),r0
   mov.l    r0,@(36,r4)
   .global    __movmemSI36
   .global    __movstrSI36
   .set    __movstrSI36, __movmemSI36
__movmemSI36:
   mov.l    @(32,r5),r0
   mov.l    r0,@(32,r4)
   .global    __movmemSI32
   .global    __movstrSI32
   .set    __movstrSI32, __movmemSI32
__movmemSI32:
   mov.l    @(28,r5),r0
   mov.l    r0,@(28,r4)
   .global    __movmemSI28
   .global    __movstrSI28
   .set    __movstrSI28, __movmemSI28
__movmemSI28:
   mov.l    @(24,r5),r0
   mov.l    r0,@(24,r4)
   .global    __movmemSI24
   .global    __movstrSI24
   .set    __movstrSI24, __movmemSI24
__movmemSI24:
   mov.l    @(20,r5),r0
   mov.l    r0,@(20,r4)
   .global    __movmemSI20
   .global    __movstrSI20
   .set    __movstrSI20, __movmemSI20
__movmemSI20:
   mov.l    @(16,r5),r0
   mov.l    r0,@(16,r4)
   .global    __movmemSI16
   .global    __movstrSI16
   .set    __movstrSI16, __movmemSI16
__movmemSI16:
   mov.l    @(12,r5),r0
   mov.l    r0,@(12,r4)
   .global    __movmemSI12
   .global    __movstrSI12
   .set    __movstrSI12, __movmemSI12
__movmemSI12:
   mov.l    @(8,r5),r0
   mov.l    r0,@(8,r4)
   .global    __movmemSI8
   .global    __movstrSI8
   .set    __movstrSI8, __movmemSI8
__movmemSI8:
   mov.l    @(4,r5),r0
   mov.l    r0,@(4,r4)
   .global    __movmemSI4
   .global    __movstrSI4
   .set    __movstrSI4, __movmemSI4
__movmemSI4:
   mov.l    @(0,r5),r0
   rts
   mov.l    r0,@(0,r4)
 
   .global    __movmem_i4_even
   .global    __movstr_i4_even
   .set    __movstr_i4_even, __movmem_i4_even
 
   .global    __movmem_i4_odd
   .global    __movstr_i4_odd
   .set    __movstr_i4_odd, __movmem_i4_odd
 
   .global    __movmemSI12_i4
   .global    __movstrSI12_i4
   .set    __movstrSI12_i4, __movmemSI12_i4
 
   .p2align    5
L_movmem_2mod4_end:
   mov.l    r0,@(16,r4)
   rts
   mov.l    r1,@(20,r4)
 
   .p2align    2
 
__movmem_i4_even:
   mov.l    @r5+,r0
   bra    L_movmem_start_even
   mov.l    @r5+,r1
 
__movmem_i4_odd:
   mov.l    @r5+,r1
   add    #-4,r4
   mov.l    @r5+,r2
   mov.l    @r5+,r3
   mov.l    r1,@(4,r4)
   mov.l    r2,@(8,r4)
 
L_movmem_loop:
   mov.l    r3,@(12,r4)
   dt    r6
   mov.l    @r5+,r0
   bt/s    L_movmem_2mod4_end
   mov.l    @r5+,r1
   add    #16,r4
L_movmem_start_even:
   mov.l    @r5+,r2
   mov.l    @r5+,r3
   mov.l    r0,@r4
   dt    r6
   mov.l    r1,@(4,r4)
   bf/s    L_movmem_loop
   mov.l    r2,@(8,r4)
   rts
   mov.l    r3,@(12,r4)
 
   .p2align    4
__movmemSI12_i4:
   mov.l    @r5,r0
   mov.l    @(4,r5),r1
   mov.l    @(8,r5),r2
   mov.l    r0,@r4
   mov.l    r1,@(4,r4)
   rts
   mov.l    r2,@(8,r4)