|
|
1.1 root 1: /* Copyright (C) 1994 Free Software Foundation, Inc.
2:
3: This file is free software; you can redistribute it and/or modify it
4: under the terms of the GNU General Public License as published by the
5: Free Software Foundation; either version 2, or (at your option) any
6: later version.
7:
8: In addition to the permissions in the GNU General Public License, the
9: Free Software Foundation gives you unlimited permission to link the
10: compiled version of this file with other programs, and to distribute
11: those programs without any restriction coming from the use of this
12: file. (The General Public License restrictions do apply in other
13: respects; for example, they cover modification of the file, and
14: distribution when not linked into another program.)
15:
16: This file is distributed in the hope that it will be useful, but
17: WITHOUT ANY WARRANTY; without even the implied warranty of
18: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19: General Public License for more details.
20:
21: You should have received a copy of the GNU General Public License
22: along with this program; see the file COPYING. If not, write to
23: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
24:
25: /* As a special exception, if you link this library with other files,
26: some of which are compiled with GCC, to produce an executable,
27: this library does not by itself cause the resulting executable
28: to be covered by the GNU General Public License.
29: This exception does not however invalidate any other reasons why
30: the executable file might be covered by the GNU General Public License. */
31:
32:
33: !! libgcc1 routines for the Hitachi SH cpu.
34: !! Contributed by Steve Chamberlain.
35: !! [email protected]
36:
37:
38: #ifdef L_ashiftrt
39: .global ___ashiftrt_r4_0
40: .global ___ashiftrt_r4_1
41: .global ___ashiftrt_r4_2
42: .global ___ashiftrt_r4_3
43: .global ___ashiftrt_r4_4
44: .global ___ashiftrt_r4_5
45: .global ___ashiftrt_r4_6
46: .global ___ashiftrt_r4_7
47: .global ___ashiftrt_r4_8
48: .global ___ashiftrt_r4_9
49: .global ___ashiftrt_r4_10
50: .global ___ashiftrt_r4_11
51: .global ___ashiftrt_r4_12
52: .global ___ashiftrt_r4_13
53: .global ___ashiftrt_r4_14
54: .global ___ashiftrt_r4_15
55: .global ___ashiftrt_r4_16
56: .global ___ashiftrt_r4_17
57: .global ___ashiftrt_r4_18
58: .global ___ashiftrt_r4_19
59: .global ___ashiftrt_r4_20
60: .global ___ashiftrt_r4_21
61: .global ___ashiftrt_r4_22
62: .global ___ashiftrt_r4_23
63: .global ___ashiftrt_r4_24
64: .global ___ashiftrt_r4_25
65: .global ___ashiftrt_r4_26
66: .global ___ashiftrt_r4_27
67: .global ___ashiftrt_r4_28
68: .global ___ashiftrt_r4_29
69: .global ___ashiftrt_r4_30
70: .global ___ashiftrt_r4_31
71: .global ___ashiftrt_r4_32
72:
73: ___ashiftrt_r4_32:
74: shar r4
75: ___ashiftrt_r4_31:
76: shar r4
77: ___ashiftrt_r4_30:
78: shar r4
79: ___ashiftrt_r4_29:
80: shar r4
81: ___ashiftrt_r4_28:
82: shar r4
83: ___ashiftrt_r4_27:
84: shar r4
85: ___ashiftrt_r4_26:
86: shar r4
87: ___ashiftrt_r4_25:
88: shar r4
89: ___ashiftrt_r4_24:
90: shar r4
91: ___ashiftrt_r4_23:
92: shar r4
93: ___ashiftrt_r4_22:
94: shar r4
95: ___ashiftrt_r4_21:
96: shar r4
97: ___ashiftrt_r4_20:
98: shar r4
99: ___ashiftrt_r4_19:
100: shar r4
101: ___ashiftrt_r4_18:
102: shar r4
103: ___ashiftrt_r4_17:
104: shar r4
105: ___ashiftrt_r4_16:
106: shar r4
107: ___ashiftrt_r4_15:
108: shar r4
109: ___ashiftrt_r4_14:
110: shar r4
111: ___ashiftrt_r4_13:
112: shar r4
113: ___ashiftrt_r4_12:
114: shar r4
115: ___ashiftrt_r4_11:
116: shar r4
117: ___ashiftrt_r4_10:
118: shar r4
119: ___ashiftrt_r4_9:
120: shar r4
121: ___ashiftrt_r4_8:
122: shar r4
123: ___ashiftrt_r4_7:
124: shar r4
125: ___ashiftrt_r4_6:
126: shar r4
127: ___ashiftrt_r4_5:
128: shar r4
129: ___ashiftrt_r4_4:
130: shar r4
131: ___ashiftrt_r4_3:
132: shar r4
133: ___ashiftrt_r4_2:
134: shar r4
135: ___ashiftrt_r4_1:
136: rts
137: shar r4
138:
139: ___ashiftrt_r4_0:
140: or r0,r0
141: rts
142: #endif
143:
144: #ifdef L_movstr
145: .text
146: ! done all the large groups, do the remainder
147:
148: ! jump to movstr+
149: done:
150: add #64,r5
151: mova ___movstrSI0,r0
152: shll2 r6
153: add r6,r0
154: jmp @r0
155: add #64,r4
156: .align 4
157: .global ___movstrSI64
158: ___movstrSI64:
159: mov.l @(60,r5),r0
160: mov.l r0,@(60,r4)
161: .global ___movstrSI60
162: ___movstrSI60:
163: mov.l @(56,r5),r0
164: mov.l r0,@(56,r4)
165: .global ___movstrSI56
166: ___movstrSI56:
167: mov.l @(52,r5),r0
168: mov.l r0,@(52,r4)
169: .global ___movstrSI52
170: ___movstrSI52:
171: mov.l @(48,r5),r0
172: mov.l r0,@(48,r4)
173: .global ___movstrSI48
174: ___movstrSI48:
175: mov.l @(44,r5),r0
176: mov.l r0,@(44,r4)
177: .global ___movstrSI44
178: ___movstrSI44:
179: mov.l @(40,r5),r0
180: mov.l r0,@(40,r4)
181: .global ___movstrSI40
182: ___movstrSI40:
183: mov.l @(36,r5),r0
184: mov.l r0,@(36,r4)
185: .global ___movstrSI36
186: ___movstrSI36:
187: mov.l @(32,r5),r0
188: mov.l r0,@(32,r4)
189: .global ___movstrSI32
190: ___movstrSI32:
191: mov.l @(28,r5),r0
192: mov.l r0,@(28,r4)
193: .global ___movstrSI28
194: ___movstrSI28:
195: mov.l @(24,r5),r0
196: mov.l r0,@(24,r4)
197: .global ___movstrSI24
198: ___movstrSI24:
199: mov.l @(20,r5),r0
200: mov.l r0,@(20,r4)
201: .global ___movstrSI20
202: ___movstrSI20:
203: mov.l @(16,r5),r0
204: mov.l r0,@(16,r4)
205: .global ___movstrSI16
206: ___movstrSI16:
207: mov.l @(12,r5),r0
208: mov.l r0,@(12,r4)
209: .global ___movstrSI12
210: ___movstrSI12:
211: mov.l @(8,r5),r0
212: mov.l r0,@(8,r4)
213: .global ___movstrSI8
214: ___movstrSI8:
215: mov.l @(4,r5),r0
216: mov.l r0,@(4,r4)
217: .global ___movstrSI4
218: ___movstrSI4:
219: mov.l @(0,r5),r0
220: mov.l r0,@(0,r4)
221: ___movstrSI0:
222: rts
223: or r0,r0,r0
224:
225: .align 4
226:
227: .global ___movstr
228: ___movstr:
229: mov.l @(60,r5),r0
230: mov.l r0,@(60,r4)
231:
232: mov.l @(56,r5),r0
233: mov.l r0,@(56,r4)
234:
235: mov.l @(52,r5),r0
236: mov.l r0,@(52,r4)
237:
238: mov.l @(48,r5),r0
239: mov.l r0,@(48,r4)
240:
241: mov.l @(44,r5),r0
242: mov.l r0,@(44,r4)
243:
244: mov.l @(40,r5),r0
245: mov.l r0,@(40,r4)
246:
247: mov.l @(36,r5),r0
248: mov.l r0,@(36,r4)
249:
250: mov.l @(32,r5),r0
251: mov.l r0,@(32,r4)
252:
253: mov.l @(28,r5),r0
254: mov.l r0,@(28,r4)
255:
256: mov.l @(24,r5),r0
257: mov.l r0,@(24,r4)
258:
259: mov.l @(20,r5),r0
260: mov.l r0,@(20,r4)
261:
262: mov.l @(16,r5),r0
263: mov.l r0,@(16,r4)
264:
265: mov.l @(12,r5),r0
266: mov.l r0,@(12,r4)
267:
268: mov.l @(8,r5),r0
269: mov.l r0,@(8,r4)
270:
271: mov.l @(4,r5),r0
272: mov.l r0,@(4,r4)
273:
274: mov.l @(0,r5),r0
275: mov.l r0,@(0,r4)
276:
277: add #-16,r6
278: cmp/pl r6
279: bf done
280:
281: add #64,r5
282: bra ___movstr
283: add #64,r4
284: #endif
285:
286: #ifdef L_mulsi3
287:
288:
289: .global ___mulsi3
290:
291: ! r4 = aabb
292: ! r5 = ccdd
293: ! r0 = aabb*ccdd via partial products
294: !
295: ! if aa == 0 and cc = 0
296: ! r0 = bb*dd
297: !
298: ! else
299: ! aa = bb*dd + (aa*dd*65536) + (cc*bb*65536)
300: !
301:
302: ___mulsi3:
303: mulu r4,r5 ! multiply the lsws macl=bb*dd
304: mov r5,r3 ! r3 = ccdd
305: swap.w r4,r2 ! r2 = bbaa
306: xtrct r2,r3 ! r3 = aacc
307: tst r3,r3 ! msws zero ?
308: bf hiset
309: rts ! yes - then weve got the answer
310: sts macl,r0
311:
312: hiset: sts macl,r0 ! r0 = bb*dd
313: mulu r2,r5 | brewing macl = aa*dd
314: sts macl,r1
315: mulu r3,r4 | brewing macl = cc*bb
316: sts macl,r2
317: add r1,r2
318: shll16 r2
319: rts
320: add r2,r0
321:
322:
323: #endif
324: #ifdef L_sdivsi3
325: .title "SH DIVIDE"
326: !! 4 byte integer Divide code for the Hitachi SH
327: !!
328: !! Steve Chamberlain
329: !! [email protected]
330: !!
331: !!
332:
333: !! args in r4 and r5, result in r0 clobber r1,r2,r3
334:
335: .global ___sdivsi3
336: ___sdivsi3:
337: mov r4,r1
338: mov r5,r0
339:
340: tst r0,r0
341: bt div0
342: mov #0,r2
343: div0s r2,r1
344: subc r3,r3
345: subc r2,r1
346: div0s r0,r3
347: rotcl r1
348: div1 r0,r3
349: rotcl r1
350: div1 r0,r3
351: rotcl r1
352: div1 r0,r3
353: rotcl r1
354: div1 r0,r3
355: rotcl r1
356: div1 r0,r3
357: rotcl r1
358: div1 r0,r3
359: rotcl r1
360: div1 r0,r3
361: rotcl r1
362: div1 r0,r3
363: rotcl r1
364: div1 r0,r3
365: rotcl r1
366: div1 r0,r3
367: rotcl r1
368: div1 r0,r3
369: rotcl r1
370: div1 r0,r3
371: rotcl r1
372: div1 r0,r3
373: rotcl r1
374: div1 r0,r3
375: rotcl r1
376: div1 r0,r3
377: rotcl r1
378: div1 r0,r3
379: rotcl r1
380: div1 r0,r3
381: rotcl r1
382: div1 r0,r3
383: rotcl r1
384: div1 r0,r3
385: rotcl r1
386: div1 r0,r3
387: rotcl r1
388: div1 r0,r3
389: rotcl r1
390: div1 r0,r3
391: rotcl r1
392: div1 r0,r3
393: rotcl r1
394: div1 r0,r3
395: rotcl r1
396: div1 r0,r3
397: rotcl r1
398: div1 r0,r3
399: rotcl r1
400: div1 r0,r3
401: rotcl r1
402: div1 r0,r3
403: rotcl r1
404: div1 r0,r3
405: rotcl r1
406: div1 r0,r3
407: rotcl r1
408: div1 r0,r3
409: rotcl r1
410: div1 r0,r3
411: rotcl r1
412: addc r2,r1
413: rts
414: mov r1,r0
415:
416:
417: div0: rts
418: mov #0,r0
419:
420: #endif
421: #ifdef L_udivsi3
422:
423: .title "SH DIVIDE"
424: !! 4 byte integer Divide code for the Hitachi SH
425: !!
426: !! Steve Chamberlain
427: !! [email protected]
428: !!
429: !!
430:
431: !! args in r4 and r5, result in r0, clobbers r4,r6, pr and t bit
432: .global ___udivsi3
433:
434: ___udivsi3:
435: longway:
436: mov #0,r0
437: div0u
438: ! get one bit from the msb of the numerator into the T
439: ! bit and divide it by whats in r5. Put the answer bit
440: ! into the T bit so it can come out again at the bottom
441:
442: rotcl r4 ; div1 r5,r0
443: rotcl r4 ; div1 r5,r0
444: rotcl r4 ; div1 r5,r0
445: rotcl r4 ; div1 r5,r0
446: rotcl r4 ; div1 r5,r0
447: rotcl r4 ; div1 r5,r0
448: rotcl r4 ; div1 r5,r0
449: rotcl r4 ; div1 r5,r0
450:
451: rotcl r4 ; div1 r5,r0
452: rotcl r4 ; div1 r5,r0
453: rotcl r4 ; div1 r5,r0
454: rotcl r4 ; div1 r5,r0
455: rotcl r4 ; div1 r5,r0
456: rotcl r4 ; div1 r5,r0
457: rotcl r4 ; div1 r5,r0
458: rotcl r4 ; div1 r5,r0
459: shortway:
460: rotcl r4 ; div1 r5,r0
461: rotcl r4 ; div1 r5,r0
462: rotcl r4 ; div1 r5,r0
463: rotcl r4 ; div1 r5,r0
464: rotcl r4 ; div1 r5,r0
465: rotcl r4 ; div1 r5,r0
466: rotcl r4 ; div1 r5,r0
467: rotcl r4 ; div1 r5,r0
468:
469: vshortway:
470: rotcl r4 ; div1 r5,r0
471: rotcl r4 ; div1 r5,r0
472: rotcl r4 ; div1 r5,r0
473: rotcl r4 ; div1 r5,r0
474: rotcl r4 ; div1 r5,r0
475: rotcl r4 ; div1 r5,r0
476: rotcl r4 ; div1 r5,r0
477: rotcl r4 ; div1 r5,r0
478: rotcl r4
479: ret: rts
480: mov r4,r0
481:
482: #endif
483:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.