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