xref: /linux/arch/sh/lib/movmem.S (revision 597473720f4dc69749542bfcfed4a927a43d935e)
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