diff options
author | Steve Chamberlain <sac@gnu.org> | 1994-09-09 23:40:17 +0000 |
---|---|---|
committer | Steve Chamberlain <sac@gnu.org> | 1994-09-09 23:40:17 +0000 |
commit | a1dba937e509b9c0ed2872354df9af4e9675285e (patch) | |
tree | f8371f506c5bda4e5a35f570555114468d7b6774 /gcc | |
parent | 516422ef0ce1bc2e24aa4f6570349b6b6a1f8ddd (diff) | |
download | gcc-a1dba937e509b9c0ed2872354df9af4e9675285e.zip gcc-a1dba937e509b9c0ed2872354df9af4e9675285e.tar.gz gcc-a1dba937e509b9c0ed2872354df9af4e9675285e.tar.bz2 |
Initial revision
From-SVN: r8063
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/sh/lib1funcs.asm | 483 |
1 files changed, 483 insertions, 0 deletions
diff --git a/gcc/config/sh/lib1funcs.asm b/gcc/config/sh/lib1funcs.asm new file mode 100644 index 0000000..7eebb69 --- /dev/null +++ b/gcc/config/sh/lib1funcs.asm @@ -0,0 +1,483 @@ +/* Copyright (C) 1994 Free Software Foundation, Inc. + +This file is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +In addition to the permissions in the GNU General Public License, the +Free Software Foundation gives you unlimited permission to link the +compiled version of this file with other programs, and to distribute +those programs without any restriction coming from the use of this +file. (The General Public License restrictions do apply in other +respects; for example, they cover modification of the file, and +distribution when not linked into another program.) + +This file 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 +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* As a special exception, if you link this library with other files, + some of which are compiled with GCC, to produce an executable, + this library does not by itself cause the resulting executable + to be covered by the GNU General Public License. + This exception does not however invalidate any other reasons why + the executable file might be covered by the GNU General Public License. */ + + +!! libgcc1 routines for the Hitachi SH cpu. +!! Contributed by Steve Chamberlain. +!! sac@cygnus.com + + +#ifdef L_ashiftrt + .global ___ashiftrt_r4_0 + .global ___ashiftrt_r4_1 + .global ___ashiftrt_r4_2 + .global ___ashiftrt_r4_3 + .global ___ashiftrt_r4_4 + .global ___ashiftrt_r4_5 + .global ___ashiftrt_r4_6 + .global ___ashiftrt_r4_7 + .global ___ashiftrt_r4_8 + .global ___ashiftrt_r4_9 + .global ___ashiftrt_r4_10 + .global ___ashiftrt_r4_11 + .global ___ashiftrt_r4_12 + .global ___ashiftrt_r4_13 + .global ___ashiftrt_r4_14 + .global ___ashiftrt_r4_15 + .global ___ashiftrt_r4_16 + .global ___ashiftrt_r4_17 + .global ___ashiftrt_r4_18 + .global ___ashiftrt_r4_19 + .global ___ashiftrt_r4_20 + .global ___ashiftrt_r4_21 + .global ___ashiftrt_r4_22 + .global ___ashiftrt_r4_23 + .global ___ashiftrt_r4_24 + .global ___ashiftrt_r4_25 + .global ___ashiftrt_r4_26 + .global ___ashiftrt_r4_27 + .global ___ashiftrt_r4_28 + .global ___ashiftrt_r4_29 + .global ___ashiftrt_r4_30 + .global ___ashiftrt_r4_31 + .global ___ashiftrt_r4_32 + +___ashiftrt_r4_32: + shar r4 +___ashiftrt_r4_31: + shar r4 +___ashiftrt_r4_30: + shar r4 +___ashiftrt_r4_29: + shar r4 +___ashiftrt_r4_28: + shar r4 +___ashiftrt_r4_27: + shar r4 +___ashiftrt_r4_26: + shar r4 +___ashiftrt_r4_25: + shar r4 +___ashiftrt_r4_24: + shar r4 +___ashiftrt_r4_23: + shar r4 +___ashiftrt_r4_22: + shar r4 +___ashiftrt_r4_21: + shar r4 +___ashiftrt_r4_20: + shar r4 +___ashiftrt_r4_19: + shar r4 +___ashiftrt_r4_18: + shar r4 +___ashiftrt_r4_17: + shar r4 +___ashiftrt_r4_16: + shar r4 +___ashiftrt_r4_15: + shar r4 +___ashiftrt_r4_14: + shar r4 +___ashiftrt_r4_13: + shar r4 +___ashiftrt_r4_12: + shar r4 +___ashiftrt_r4_11: + shar r4 +___ashiftrt_r4_10: + shar r4 +___ashiftrt_r4_9: + shar r4 +___ashiftrt_r4_8: + shar r4 +___ashiftrt_r4_7: + shar r4 +___ashiftrt_r4_6: + shar r4 +___ashiftrt_r4_5: + shar r4 +___ashiftrt_r4_4: + shar r4 +___ashiftrt_r4_3: + shar r4 +___ashiftrt_r4_2: + shar r4 +___ashiftrt_r4_1: + rts + shar r4 + +___ashiftrt_r4_0: + or r0,r0 + rts +#endif + +#ifdef L_movstr + .text +! done all the large groups, do the remainder + +! jump to movstr+ +done: + add #64,r5 + mova ___movstrSI0,r0 + shll2 r6 + add r6,r0 + jmp @r0 + add #64,r4 + .align 4 + .global ___movstrSI64 +___movstrSI64: + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) + .global ___movstrSI60 +___movstrSI60: + mov.l @(56,r5),r0 + mov.l r0,@(56,r4) + .global ___movstrSI56 +___movstrSI56: + mov.l @(52,r5),r0 + mov.l r0,@(52,r4) + .global ___movstrSI52 +___movstrSI52: + mov.l @(48,r5),r0 + mov.l r0,@(48,r4) + .global ___movstrSI48 +___movstrSI48: + mov.l @(44,r5),r0 + mov.l r0,@(44,r4) + .global ___movstrSI44 +___movstrSI44: + mov.l @(40,r5),r0 + mov.l r0,@(40,r4) + .global ___movstrSI40 +___movstrSI40: + mov.l @(36,r5),r0 + mov.l r0,@(36,r4) + .global ___movstrSI36 +___movstrSI36: + mov.l @(32,r5),r0 + mov.l r0,@(32,r4) + .global ___movstrSI32 +___movstrSI32: + mov.l @(28,r5),r0 + mov.l r0,@(28,r4) + .global ___movstrSI28 +___movstrSI28: + mov.l @(24,r5),r0 + mov.l r0,@(24,r4) + .global ___movstrSI24 +___movstrSI24: + mov.l @(20,r5),r0 + mov.l r0,@(20,r4) + .global ___movstrSI20 +___movstrSI20: + mov.l @(16,r5),r0 + mov.l r0,@(16,r4) + .global ___movstrSI16 +___movstrSI16: + mov.l @(12,r5),r0 + mov.l r0,@(12,r4) + .global ___movstrSI12 +___movstrSI12: + mov.l @(8,r5),r0 + mov.l r0,@(8,r4) + .global ___movstrSI8 +___movstrSI8: + mov.l @(4,r5),r0 + mov.l r0,@(4,r4) + .global ___movstrSI4 +___movstrSI4: + mov.l @(0,r5),r0 + mov.l r0,@(0,r4) +___movstrSI0: + rts + or r0,r0,r0 + + .align 4 + + .global ___movstr +___movstr: + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) + + mov.l @(56,r5),r0 + mov.l r0,@(56,r4) + + mov.l @(52,r5),r0 + mov.l r0,@(52,r4) + + mov.l @(48,r5),r0 + mov.l r0,@(48,r4) + + mov.l @(44,r5),r0 + mov.l r0,@(44,r4) + + mov.l @(40,r5),r0 + mov.l r0,@(40,r4) + + mov.l @(36,r5),r0 + mov.l r0,@(36,r4) + + mov.l @(32,r5),r0 + mov.l r0,@(32,r4) + + mov.l @(28,r5),r0 + mov.l r0,@(28,r4) + + mov.l @(24,r5),r0 + mov.l r0,@(24,r4) + + mov.l @(20,r5),r0 + mov.l r0,@(20,r4) + + mov.l @(16,r5),r0 + mov.l r0,@(16,r4) + + mov.l @(12,r5),r0 + mov.l r0,@(12,r4) + + mov.l @(8,r5),r0 + mov.l r0,@(8,r4) + + mov.l @(4,r5),r0 + mov.l r0,@(4,r4) + + mov.l @(0,r5),r0 + mov.l r0,@(0,r4) + + add #-16,r6 + cmp/pl r6 + bf done + + add #64,r5 + bra ___movstr + add #64,r4 +#endif + +#ifdef L_mulsi3 + + + .global ___mulsi3 + +! r4 = aabb +! r5 = ccdd +! r0 = aabb*ccdd via partial products +! +! if aa == 0 and cc = 0 +! r0 = bb*dd +! +! else +! aa = bb*dd + (aa*dd*65536) + (cc*bb*65536) +! + +___mulsi3: + mulu r4,r5 ! multiply the lsws macl=bb*dd + mov r5,r3 ! r3 = ccdd + swap.w r4,r2 ! r2 = bbaa + xtrct r2,r3 ! r3 = aacc + tst r3,r3 ! msws zero ? + bf hiset + rts ! yes - then weve got the answer + sts macl,r0 + +hiset: sts macl,r0 ! r0 = bb*dd + mulu r2,r5 | brewing macl = aa*dd + sts macl,r1 + mulu r3,r4 | brewing macl = cc*bb + sts macl,r2 + add r1,r2 + shll16 r2 + rts + add r2,r0 + + +#endif +#ifdef L_sdivsi3 + .title "SH DIVIDE" +!! 4 byte integer Divide code for the Hitachi SH +!! +!! Steve Chamberlain +!! sac@cygnus.com +!! +!! + +!! args in r4 and r5, result in r0 clobber r1,r2,r3 + + .global ___sdivsi3 +___sdivsi3: + mov r4,r1 + mov r5,r0 + + tst r0,r0 + bt div0 + mov #0,r2 + div0s r2,r1 + subc r3,r3 + subc r2,r1 + div0s r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + div1 r0,r3 + rotcl r1 + addc r2,r1 + rts + mov r1,r0 + + +div0: rts + mov #0,r0 + +#endif +#ifdef L_udivsi3 + + .title "SH DIVIDE" +!! 4 byte integer Divide code for the Hitachi SH +!! +!! Steve Chamberlain +!! sac@cygnus.com +!! +!! + +!! args in r4 and r5, result in r0, clobbers r4,r6, pr and t bit + .global ___udivsi3 + +___udivsi3: +longway: + mov #0,r0 + div0u + ! get one bit from the msb of the numerator into the T + ! bit and divide it by whats in r5. Put the answer bit + ! into the T bit so it can come out again at the bottom + + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 +shortway: + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + +vshortway: + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 ; div1 r5,r0 + rotcl r4 +ret: rts + mov r4,r0 + +#endif + |