162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ WITH GCC-exception-2.0 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 462306a36Sopenharmony_ci 2004, 2005, 2006 562306a36Sopenharmony_ci Free Software Foundation, Inc. 662306a36Sopenharmony_ci*/ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci!! libgcc routines for the Renesas / SuperH SH CPUs. 962306a36Sopenharmony_ci!! Contributed by Steve Chamberlain. 1062306a36Sopenharmony_ci!! sac@cygnus.com 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci!! ashiftrt_r4_x, ___ashrsi3, ___ashlsi3, ___lshrsi3 routines 1362306a36Sopenharmony_ci!! recoded in assembly by Toshiyasu Morita 1462306a36Sopenharmony_ci!! tm@netcom.com 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* SH2 optimizations for ___ashrsi3, ___ashlsi3, ___lshrsi3 and 1762306a36Sopenharmony_ci ELF local label prefixes by J"orn Rennecke 1862306a36Sopenharmony_ci amylaar@cygnus.com */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci .text 2162306a36Sopenharmony_ci .balign 4 2262306a36Sopenharmony_ci .global __movmem 2362306a36Sopenharmony_ci .global __movstr 2462306a36Sopenharmony_ci .set __movstr, __movmem 2562306a36Sopenharmony_ci /* This would be a lot simpler if r6 contained the byte count 2662306a36Sopenharmony_ci minus 64, and we wouldn't be called here for a byte count of 64. */ 2762306a36Sopenharmony_ci__movmem: 2862306a36Sopenharmony_ci sts.l pr,@-r15 2962306a36Sopenharmony_ci shll2 r6 3062306a36Sopenharmony_ci bsr __movmemSI52+2 3162306a36Sopenharmony_ci mov.l @(48,r5),r0 3262306a36Sopenharmony_ci .balign 4 3362306a36Sopenharmony_cimovmem_loop: /* Reached with rts */ 3462306a36Sopenharmony_ci mov.l @(60,r5),r0 3562306a36Sopenharmony_ci add #-64,r6 3662306a36Sopenharmony_ci mov.l r0,@(60,r4) 3762306a36Sopenharmony_ci tst r6,r6 3862306a36Sopenharmony_ci mov.l @(56,r5),r0 3962306a36Sopenharmony_ci bt movmem_done 4062306a36Sopenharmony_ci mov.l r0,@(56,r4) 4162306a36Sopenharmony_ci cmp/pl r6 4262306a36Sopenharmony_ci mov.l @(52,r5),r0 4362306a36Sopenharmony_ci add #64,r5 4462306a36Sopenharmony_ci mov.l r0,@(52,r4) 4562306a36Sopenharmony_ci add #64,r4 4662306a36Sopenharmony_ci bt __movmemSI52 4762306a36Sopenharmony_ci! done all the large groups, do the remainder 4862306a36Sopenharmony_ci! jump to movmem+ 4962306a36Sopenharmony_ci mova __movmemSI4+4,r0 5062306a36Sopenharmony_ci add r6,r0 5162306a36Sopenharmony_ci jmp @r0 5262306a36Sopenharmony_cimovmem_done: ! share slot insn, works out aligned. 5362306a36Sopenharmony_ci lds.l @r15+,pr 5462306a36Sopenharmony_ci mov.l r0,@(56,r4) 5562306a36Sopenharmony_ci mov.l @(52,r5),r0 5662306a36Sopenharmony_ci rts 5762306a36Sopenharmony_ci mov.l r0,@(52,r4) 5862306a36Sopenharmony_ci .balign 4 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci .global __movmemSI64 6162306a36Sopenharmony_ci .global __movstrSI64 6262306a36Sopenharmony_ci .set __movstrSI64, __movmemSI64 6362306a36Sopenharmony_ci__movmemSI64: 6462306a36Sopenharmony_ci mov.l @(60,r5),r0 6562306a36Sopenharmony_ci mov.l r0,@(60,r4) 6662306a36Sopenharmony_ci .global __movmemSI60 6762306a36Sopenharmony_ci .global __movstrSI60 6862306a36Sopenharmony_ci .set __movstrSI60, __movmemSI60 6962306a36Sopenharmony_ci__movmemSI60: 7062306a36Sopenharmony_ci mov.l @(56,r5),r0 7162306a36Sopenharmony_ci mov.l r0,@(56,r4) 7262306a36Sopenharmony_ci .global __movmemSI56 7362306a36Sopenharmony_ci .global __movstrSI56 7462306a36Sopenharmony_ci .set __movstrSI56, __movmemSI56 7562306a36Sopenharmony_ci__movmemSI56: 7662306a36Sopenharmony_ci mov.l @(52,r5),r0 7762306a36Sopenharmony_ci mov.l r0,@(52,r4) 7862306a36Sopenharmony_ci .global __movmemSI52 7962306a36Sopenharmony_ci .global __movstrSI52 8062306a36Sopenharmony_ci .set __movstrSI52, __movmemSI52 8162306a36Sopenharmony_ci__movmemSI52: 8262306a36Sopenharmony_ci mov.l @(48,r5),r0 8362306a36Sopenharmony_ci mov.l r0,@(48,r4) 8462306a36Sopenharmony_ci .global __movmemSI48 8562306a36Sopenharmony_ci .global __movstrSI48 8662306a36Sopenharmony_ci .set __movstrSI48, __movmemSI48 8762306a36Sopenharmony_ci__movmemSI48: 8862306a36Sopenharmony_ci mov.l @(44,r5),r0 8962306a36Sopenharmony_ci mov.l r0,@(44,r4) 9062306a36Sopenharmony_ci .global __movmemSI44 9162306a36Sopenharmony_ci .global __movstrSI44 9262306a36Sopenharmony_ci .set __movstrSI44, __movmemSI44 9362306a36Sopenharmony_ci__movmemSI44: 9462306a36Sopenharmony_ci mov.l @(40,r5),r0 9562306a36Sopenharmony_ci mov.l r0,@(40,r4) 9662306a36Sopenharmony_ci .global __movmemSI40 9762306a36Sopenharmony_ci .global __movstrSI40 9862306a36Sopenharmony_ci .set __movstrSI40, __movmemSI40 9962306a36Sopenharmony_ci__movmemSI40: 10062306a36Sopenharmony_ci mov.l @(36,r5),r0 10162306a36Sopenharmony_ci mov.l r0,@(36,r4) 10262306a36Sopenharmony_ci .global __movmemSI36 10362306a36Sopenharmony_ci .global __movstrSI36 10462306a36Sopenharmony_ci .set __movstrSI36, __movmemSI36 10562306a36Sopenharmony_ci__movmemSI36: 10662306a36Sopenharmony_ci mov.l @(32,r5),r0 10762306a36Sopenharmony_ci mov.l r0,@(32,r4) 10862306a36Sopenharmony_ci .global __movmemSI32 10962306a36Sopenharmony_ci .global __movstrSI32 11062306a36Sopenharmony_ci .set __movstrSI32, __movmemSI32 11162306a36Sopenharmony_ci__movmemSI32: 11262306a36Sopenharmony_ci mov.l @(28,r5),r0 11362306a36Sopenharmony_ci mov.l r0,@(28,r4) 11462306a36Sopenharmony_ci .global __movmemSI28 11562306a36Sopenharmony_ci .global __movstrSI28 11662306a36Sopenharmony_ci .set __movstrSI28, __movmemSI28 11762306a36Sopenharmony_ci__movmemSI28: 11862306a36Sopenharmony_ci mov.l @(24,r5),r0 11962306a36Sopenharmony_ci mov.l r0,@(24,r4) 12062306a36Sopenharmony_ci .global __movmemSI24 12162306a36Sopenharmony_ci .global __movstrSI24 12262306a36Sopenharmony_ci .set __movstrSI24, __movmemSI24 12362306a36Sopenharmony_ci__movmemSI24: 12462306a36Sopenharmony_ci mov.l @(20,r5),r0 12562306a36Sopenharmony_ci mov.l r0,@(20,r4) 12662306a36Sopenharmony_ci .global __movmemSI20 12762306a36Sopenharmony_ci .global __movstrSI20 12862306a36Sopenharmony_ci .set __movstrSI20, __movmemSI20 12962306a36Sopenharmony_ci__movmemSI20: 13062306a36Sopenharmony_ci mov.l @(16,r5),r0 13162306a36Sopenharmony_ci mov.l r0,@(16,r4) 13262306a36Sopenharmony_ci .global __movmemSI16 13362306a36Sopenharmony_ci .global __movstrSI16 13462306a36Sopenharmony_ci .set __movstrSI16, __movmemSI16 13562306a36Sopenharmony_ci__movmemSI16: 13662306a36Sopenharmony_ci mov.l @(12,r5),r0 13762306a36Sopenharmony_ci mov.l r0,@(12,r4) 13862306a36Sopenharmony_ci .global __movmemSI12 13962306a36Sopenharmony_ci .global __movstrSI12 14062306a36Sopenharmony_ci .set __movstrSI12, __movmemSI12 14162306a36Sopenharmony_ci__movmemSI12: 14262306a36Sopenharmony_ci mov.l @(8,r5),r0 14362306a36Sopenharmony_ci mov.l r0,@(8,r4) 14462306a36Sopenharmony_ci .global __movmemSI8 14562306a36Sopenharmony_ci .global __movstrSI8 14662306a36Sopenharmony_ci .set __movstrSI8, __movmemSI8 14762306a36Sopenharmony_ci__movmemSI8: 14862306a36Sopenharmony_ci mov.l @(4,r5),r0 14962306a36Sopenharmony_ci mov.l r0,@(4,r4) 15062306a36Sopenharmony_ci .global __movmemSI4 15162306a36Sopenharmony_ci .global __movstrSI4 15262306a36Sopenharmony_ci .set __movstrSI4, __movmemSI4 15362306a36Sopenharmony_ci__movmemSI4: 15462306a36Sopenharmony_ci mov.l @(0,r5),r0 15562306a36Sopenharmony_ci rts 15662306a36Sopenharmony_ci mov.l r0,@(0,r4) 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci .global __movmem_i4_even 15962306a36Sopenharmony_ci .global __movstr_i4_even 16062306a36Sopenharmony_ci .set __movstr_i4_even, __movmem_i4_even 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci .global __movmem_i4_odd 16362306a36Sopenharmony_ci .global __movstr_i4_odd 16462306a36Sopenharmony_ci .set __movstr_i4_odd, __movmem_i4_odd 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci .global __movmemSI12_i4 16762306a36Sopenharmony_ci .global __movstrSI12_i4 16862306a36Sopenharmony_ci .set __movstrSI12_i4, __movmemSI12_i4 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci .p2align 5 17162306a36Sopenharmony_ciL_movmem_2mod4_end: 17262306a36Sopenharmony_ci mov.l r0,@(16,r4) 17362306a36Sopenharmony_ci rts 17462306a36Sopenharmony_ci mov.l r1,@(20,r4) 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci .p2align 2 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci__movmem_i4_even: 17962306a36Sopenharmony_ci mov.l @r5+,r0 18062306a36Sopenharmony_ci bra L_movmem_start_even 18162306a36Sopenharmony_ci mov.l @r5+,r1 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci__movmem_i4_odd: 18462306a36Sopenharmony_ci mov.l @r5+,r1 18562306a36Sopenharmony_ci add #-4,r4 18662306a36Sopenharmony_ci mov.l @r5+,r2 18762306a36Sopenharmony_ci mov.l @r5+,r3 18862306a36Sopenharmony_ci mov.l r1,@(4,r4) 18962306a36Sopenharmony_ci mov.l r2,@(8,r4) 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ciL_movmem_loop: 19262306a36Sopenharmony_ci mov.l r3,@(12,r4) 19362306a36Sopenharmony_ci dt r6 19462306a36Sopenharmony_ci mov.l @r5+,r0 19562306a36Sopenharmony_ci bt/s L_movmem_2mod4_end 19662306a36Sopenharmony_ci mov.l @r5+,r1 19762306a36Sopenharmony_ci add #16,r4 19862306a36Sopenharmony_ciL_movmem_start_even: 19962306a36Sopenharmony_ci mov.l @r5+,r2 20062306a36Sopenharmony_ci mov.l @r5+,r3 20162306a36Sopenharmony_ci mov.l r0,@r4 20262306a36Sopenharmony_ci dt r6 20362306a36Sopenharmony_ci mov.l r1,@(4,r4) 20462306a36Sopenharmony_ci bf/s L_movmem_loop 20562306a36Sopenharmony_ci mov.l r2,@(8,r4) 20662306a36Sopenharmony_ci rts 20762306a36Sopenharmony_ci mov.l r3,@(12,r4) 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci .p2align 4 21062306a36Sopenharmony_ci__movmemSI12_i4: 21162306a36Sopenharmony_ci mov.l @r5,r0 21262306a36Sopenharmony_ci mov.l @(4,r5),r1 21362306a36Sopenharmony_ci mov.l @(8,r5),r2 21462306a36Sopenharmony_ci mov.l r0,@r4 21562306a36Sopenharmony_ci mov.l r1,@(4,r4) 21662306a36Sopenharmony_ci rts 21762306a36Sopenharmony_ci mov.l r2,@(8,r4) 218