1*4494ce4fSKuninori Morimoto/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 2*4494ce4fSKuninori Morimoto 3*4494ce4fSKuninori Morimoto Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 41aad54a9SPaul Mundt 2004, 2005, 2006 51aad54a9SPaul Mundt Free Software Foundation, Inc. 6*4494ce4fSKuninori Morimoto*/ 71aad54a9SPaul Mundt 81aad54a9SPaul Mundt!! libgcc routines for the Renesas / SuperH SH CPUs. 91aad54a9SPaul Mundt!! Contributed by Steve Chamberlain. 101aad54a9SPaul Mundt!! sac@cygnus.com 111aad54a9SPaul Mundt 121aad54a9SPaul Mundt!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines 131aad54a9SPaul Mundt!! recoded in assembly by Toshiyasu Morita 141aad54a9SPaul Mundt!! tm@netcom.com 151aad54a9SPaul Mundt 161aad54a9SPaul Mundt/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and 171aad54a9SPaul Mundt ELF local label prefixes by J"orn Rennecke 181aad54a9SPaul Mundt amylaar@cygnus.com */ 191aad54a9SPaul Mundt 201aad54a9SPaul Mundt .text 211aad54a9SPaul Mundt .balign 4 221aad54a9SPaul Mundt .global __movmem 231aad54a9SPaul Mundt .global __movstr 241aad54a9SPaul Mundt .set __movstr, __movmem 251aad54a9SPaul Mundt /* This would be a lot simpler if r6 contained the byte count 261aad54a9SPaul Mundt minus 64, and we wouldn't be called here for a byte count of 64. */ 271aad54a9SPaul Mundt__movmem: 281aad54a9SPaul Mundt sts.l pr,@-r15 291aad54a9SPaul Mundt shll2 r6 301aad54a9SPaul Mundt bsr __movmemSI52+2 311aad54a9SPaul Mundt mov.l @(48,r5),r0 321aad54a9SPaul Mundt .balign 4 331aad54a9SPaul Mundtmovmem_loop: /* Reached with rts */ 341aad54a9SPaul Mundt mov.l @(60,r5),r0 351aad54a9SPaul Mundt add #-64,r6 361aad54a9SPaul Mundt mov.l r0,@(60,r4) 371aad54a9SPaul Mundt tst r6,r6 381aad54a9SPaul Mundt mov.l @(56,r5),r0 391aad54a9SPaul Mundt bt movmem_done 401aad54a9SPaul Mundt mov.l r0,@(56,r4) 411aad54a9SPaul Mundt cmp/pl r6 421aad54a9SPaul Mundt mov.l @(52,r5),r0 431aad54a9SPaul Mundt add #64,r5 441aad54a9SPaul Mundt mov.l r0,@(52,r4) 451aad54a9SPaul Mundt add #64,r4 461aad54a9SPaul Mundt bt __movmemSI52 471aad54a9SPaul Mundt! done all the large groups, do the remainder 481aad54a9SPaul Mundt! jump to movmem+ 491aad54a9SPaul Mundt mova __movmemSI4+4,r0 501aad54a9SPaul Mundt add r6,r0 511aad54a9SPaul Mundt jmp @r0 521aad54a9SPaul Mundtmovmem_done: ! share slot insn, works out aligned. 531aad54a9SPaul Mundt lds.l @r15+,pr 541aad54a9SPaul Mundt mov.l r0,@(56,r4) 551aad54a9SPaul Mundt mov.l @(52,r5),r0 561aad54a9SPaul Mundt rts 571aad54a9SPaul Mundt mov.l r0,@(52,r4) 581aad54a9SPaul Mundt .balign 4 591aad54a9SPaul Mundt 601aad54a9SPaul Mundt .global __movmemSI64 611aad54a9SPaul Mundt .global __movstrSI64 621aad54a9SPaul Mundt .set __movstrSI64, __movmemSI64 631aad54a9SPaul Mundt__movmemSI64: 641aad54a9SPaul Mundt mov.l @(60,r5),r0 651aad54a9SPaul Mundt mov.l r0,@(60,r4) 661aad54a9SPaul Mundt .global __movmemSI60 671aad54a9SPaul Mundt .global __movstrSI60 681aad54a9SPaul Mundt .set __movstrSI60, __movmemSI60 691aad54a9SPaul Mundt__movmemSI60: 701aad54a9SPaul Mundt mov.l @(56,r5),r0 711aad54a9SPaul Mundt mov.l r0,@(56,r4) 721aad54a9SPaul Mundt .global __movmemSI56 731aad54a9SPaul Mundt .global __movstrSI56 741aad54a9SPaul Mundt .set __movstrSI56, __movmemSI56 751aad54a9SPaul Mundt__movmemSI56: 761aad54a9SPaul Mundt mov.l @(52,r5),r0 771aad54a9SPaul Mundt mov.l r0,@(52,r4) 781aad54a9SPaul Mundt .global __movmemSI52 791aad54a9SPaul Mundt .global __movstrSI52 801aad54a9SPaul Mundt .set __movstrSI52, __movmemSI52 811aad54a9SPaul Mundt__movmemSI52: 821aad54a9SPaul Mundt mov.l @(48,r5),r0 831aad54a9SPaul Mundt mov.l r0,@(48,r4) 841aad54a9SPaul Mundt .global __movmemSI48 851aad54a9SPaul Mundt .global __movstrSI48 861aad54a9SPaul Mundt .set __movstrSI48, __movmemSI48 871aad54a9SPaul Mundt__movmemSI48: 881aad54a9SPaul Mundt mov.l @(44,r5),r0 891aad54a9SPaul Mundt mov.l r0,@(44,r4) 901aad54a9SPaul Mundt .global __movmemSI44 911aad54a9SPaul Mundt .global __movstrSI44 921aad54a9SPaul Mundt .set __movstrSI44, __movmemSI44 931aad54a9SPaul Mundt__movmemSI44: 941aad54a9SPaul Mundt mov.l @(40,r5),r0 951aad54a9SPaul Mundt mov.l r0,@(40,r4) 961aad54a9SPaul Mundt .global __movmemSI40 971aad54a9SPaul Mundt .global __movstrSI40 981aad54a9SPaul Mundt .set __movstrSI40, __movmemSI40 991aad54a9SPaul Mundt__movmemSI40: 1001aad54a9SPaul Mundt mov.l @(36,r5),r0 1011aad54a9SPaul Mundt mov.l r0,@(36,r4) 1021aad54a9SPaul Mundt .global __movmemSI36 1031aad54a9SPaul Mundt .global __movstrSI36 1041aad54a9SPaul Mundt .set __movstrSI36, __movmemSI36 1051aad54a9SPaul Mundt__movmemSI36: 1061aad54a9SPaul Mundt mov.l @(32,r5),r0 1071aad54a9SPaul Mundt mov.l r0,@(32,r4) 1081aad54a9SPaul Mundt .global __movmemSI32 1091aad54a9SPaul Mundt .global __movstrSI32 1101aad54a9SPaul Mundt .set __movstrSI32, __movmemSI32 1111aad54a9SPaul Mundt__movmemSI32: 1121aad54a9SPaul Mundt mov.l @(28,r5),r0 1131aad54a9SPaul Mundt mov.l r0,@(28,r4) 1141aad54a9SPaul Mundt .global __movmemSI28 1151aad54a9SPaul Mundt .global __movstrSI28 1161aad54a9SPaul Mundt .set __movstrSI28, __movmemSI28 1171aad54a9SPaul Mundt__movmemSI28: 1181aad54a9SPaul Mundt mov.l @(24,r5),r0 1191aad54a9SPaul Mundt mov.l r0,@(24,r4) 1201aad54a9SPaul Mundt .global __movmemSI24 1211aad54a9SPaul Mundt .global __movstrSI24 1221aad54a9SPaul Mundt .set __movstrSI24, __movmemSI24 1231aad54a9SPaul Mundt__movmemSI24: 1241aad54a9SPaul Mundt mov.l @(20,r5),r0 1251aad54a9SPaul Mundt mov.l r0,@(20,r4) 1261aad54a9SPaul Mundt .global __movmemSI20 1271aad54a9SPaul Mundt .global __movstrSI20 1281aad54a9SPaul Mundt .set __movstrSI20, __movmemSI20 1291aad54a9SPaul Mundt__movmemSI20: 1301aad54a9SPaul Mundt mov.l @(16,r5),r0 1311aad54a9SPaul Mundt mov.l r0,@(16,r4) 1321aad54a9SPaul Mundt .global __movmemSI16 1331aad54a9SPaul Mundt .global __movstrSI16 1341aad54a9SPaul Mundt .set __movstrSI16, __movmemSI16 1351aad54a9SPaul Mundt__movmemSI16: 1361aad54a9SPaul Mundt mov.l @(12,r5),r0 1371aad54a9SPaul Mundt mov.l r0,@(12,r4) 1381aad54a9SPaul Mundt .global __movmemSI12 1391aad54a9SPaul Mundt .global __movstrSI12 1401aad54a9SPaul Mundt .set __movstrSI12, __movmemSI12 1411aad54a9SPaul Mundt__movmemSI12: 1421aad54a9SPaul Mundt mov.l @(8,r5),r0 1431aad54a9SPaul Mundt mov.l r0,@(8,r4) 1441aad54a9SPaul Mundt .global __movmemSI8 1451aad54a9SPaul Mundt .global __movstrSI8 1461aad54a9SPaul Mundt .set __movstrSI8, __movmemSI8 1471aad54a9SPaul Mundt__movmemSI8: 1481aad54a9SPaul Mundt mov.l @(4,r5),r0 1491aad54a9SPaul Mundt mov.l r0,@(4,r4) 1501aad54a9SPaul Mundt .global __movmemSI4 1511aad54a9SPaul Mundt .global __movstrSI4 1521aad54a9SPaul Mundt .set __movstrSI4, __movmemSI4 1531aad54a9SPaul Mundt__movmemSI4: 1541aad54a9SPaul Mundt mov.l @(0,r5),r0 1551aad54a9SPaul Mundt rts 1561aad54a9SPaul Mundt mov.l r0,@(0,r4) 1571aad54a9SPaul Mundt 1581aad54a9SPaul Mundt .global __movmem_i4_even 1591aad54a9SPaul Mundt .global __movstr_i4_even 1601aad54a9SPaul Mundt .set __movstr_i4_even, __movmem_i4_even 1611aad54a9SPaul Mundt 1621aad54a9SPaul Mundt .global __movmem_i4_odd 1631aad54a9SPaul Mundt .global __movstr_i4_odd 1641aad54a9SPaul Mundt .set __movstr_i4_odd, __movmem_i4_odd 1651aad54a9SPaul Mundt 1661aad54a9SPaul Mundt .global __movmemSI12_i4 1671aad54a9SPaul Mundt .global __movstrSI12_i4 1681aad54a9SPaul Mundt .set __movstrSI12_i4, __movmemSI12_i4 1691aad54a9SPaul Mundt 1701aad54a9SPaul Mundt .p2align 5 1711aad54a9SPaul MundtL_movmem_2mod4_end: 1721aad54a9SPaul Mundt mov.l r0,@(16,r4) 1731aad54a9SPaul Mundt rts 1741aad54a9SPaul Mundt mov.l r1,@(20,r4) 1751aad54a9SPaul Mundt 1761aad54a9SPaul Mundt .p2align 2 1771aad54a9SPaul Mundt 1781aad54a9SPaul Mundt__movmem_i4_even: 1791aad54a9SPaul Mundt mov.l @r5+,r0 1801aad54a9SPaul Mundt bra L_movmem_start_even 1811aad54a9SPaul Mundt mov.l @r5+,r1 1821aad54a9SPaul Mundt 1831aad54a9SPaul Mundt__movmem_i4_odd: 1841aad54a9SPaul Mundt mov.l @r5+,r1 1851aad54a9SPaul Mundt add #-4,r4 1861aad54a9SPaul Mundt mov.l @r5+,r2 1871aad54a9SPaul Mundt mov.l @r5+,r3 1881aad54a9SPaul Mundt mov.l r1,@(4,r4) 1891aad54a9SPaul Mundt mov.l r2,@(8,r4) 1901aad54a9SPaul Mundt 1911aad54a9SPaul MundtL_movmem_loop: 1921aad54a9SPaul Mundt mov.l r3,@(12,r4) 1931aad54a9SPaul Mundt dt r6 1941aad54a9SPaul Mundt mov.l @r5+,r0 1951aad54a9SPaul Mundt bt/s L_movmem_2mod4_end 1961aad54a9SPaul Mundt mov.l @r5+,r1 1971aad54a9SPaul Mundt add #16,r4 1981aad54a9SPaul MundtL_movmem_start_even: 1991aad54a9SPaul Mundt mov.l @r5+,r2 2001aad54a9SPaul Mundt mov.l @r5+,r3 2011aad54a9SPaul Mundt mov.l r0,@r4 2021aad54a9SPaul Mundt dt r6 2031aad54a9SPaul Mundt mov.l r1,@(4,r4) 2041aad54a9SPaul Mundt bf/s L_movmem_loop 2051aad54a9SPaul Mundt mov.l r2,@(8,r4) 2061aad54a9SPaul Mundt rts 2071aad54a9SPaul Mundt mov.l r3,@(12,r4) 2081aad54a9SPaul Mundt 2091aad54a9SPaul Mundt .p2align 4 2101aad54a9SPaul Mundt__movmemSI12_i4: 2111aad54a9SPaul Mundt mov.l @r5,r0 2121aad54a9SPaul Mundt mov.l @(4,r5),r1 2131aad54a9SPaul Mundt mov.l @(8,r5),r2 2141aad54a9SPaul Mundt mov.l r0,@r4 2151aad54a9SPaul Mundt mov.l r1,@(4,r4) 2161aad54a9SPaul Mundt rts 2171aad54a9SPaul Mundt mov.l r2,@(8,r4) 218