18c2ecf20Sopenharmony_ci;; SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci;;  Copyright 2010  Free Software Foundation, Inc.
38c2ecf20Sopenharmony_ci;;  Contributed by Bernd Schmidt <bernds@codesourcery.com>.
48c2ecf20Sopenharmony_ci;;
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include <linux/linkage.h>
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci	.text
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ciENTRY(__c6xabi_strasgi)
118c2ecf20Sopenharmony_ci	;; This is essentially memcpy, with alignment known to be at least
128c2ecf20Sopenharmony_ci	;; 4, and the size a multiple of 4 greater than or equal to 28.
138c2ecf20Sopenharmony_ci	 ldw	.d2t1	*B4++, A0
148c2ecf20Sopenharmony_ci||	 mvk	.s2	16, B1
158c2ecf20Sopenharmony_ci	 ldw	.d2t1	*B4++, A1
168c2ecf20Sopenharmony_ci||	 mvk	.s2	20, B2
178c2ecf20Sopenharmony_ci||	 sub	.d1	A6, 24, A6
188c2ecf20Sopenharmony_ci	 ldw	.d2t1	*B4++, A5
198c2ecf20Sopenharmony_ci	 ldw	.d2t1	*B4++, A7
208c2ecf20Sopenharmony_ci||	 mv	.l2x	A6, B7
218c2ecf20Sopenharmony_ci	 ldw	.d2t1	*B4++, A8
228c2ecf20Sopenharmony_ci	 ldw	.d2t1	*B4++, A9
238c2ecf20Sopenharmony_ci||	 mv	.s2x	A0, B5
248c2ecf20Sopenharmony_ci||	 cmpltu	.l2	B2, B7, B0
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci_strasgi_loop:
278c2ecf20Sopenharmony_ci	 stw	.d1t2	B5, *A4++
288c2ecf20Sopenharmony_ci|| [B0]	 ldw	.d2t1	*B4++, A0
298c2ecf20Sopenharmony_ci||	 mv	.s2x	A1, B5
308c2ecf20Sopenharmony_ci||	 mv	.l2	B7, B6
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci   [B0]	 sub	.d2	B6, 24, B7
338c2ecf20Sopenharmony_ci|| [B0]	 b	.s2	_strasgi_loop
348c2ecf20Sopenharmony_ci||	 cmpltu	.l2	B1, B6, B0
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci   [B0]	 ldw	.d2t1	*B4++, A1
378c2ecf20Sopenharmony_ci||	 stw	.d1t2	B5, *A4++
388c2ecf20Sopenharmony_ci||	 mv	.s2x	A5, B5
398c2ecf20Sopenharmony_ci||	 cmpltu	.l2	12, B6, B0
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci   [B0]	 ldw	.d2t1	*B4++, A5
428c2ecf20Sopenharmony_ci||	 stw	.d1t2	B5, *A4++
438c2ecf20Sopenharmony_ci||	 mv	.s2x	A7, B5
448c2ecf20Sopenharmony_ci||	 cmpltu	.l2	8, B6, B0
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci   [B0]	 ldw	.d2t1	*B4++, A7
478c2ecf20Sopenharmony_ci||	 stw	.d1t2	B5, *A4++
488c2ecf20Sopenharmony_ci||	 mv	.s2x	A8, B5
498c2ecf20Sopenharmony_ci||	 cmpltu	.l2	4, B6, B0
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci   [B0]	 ldw	.d2t1	*B4++, A8
528c2ecf20Sopenharmony_ci||	 stw	.d1t2	B5, *A4++
538c2ecf20Sopenharmony_ci||	 mv	.s2x	A9, B5
548c2ecf20Sopenharmony_ci||	 cmpltu	.l2	0, B6, B0
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci   [B0]	 ldw	.d2t1	*B4++, A9
578c2ecf20Sopenharmony_ci||	 stw	.d1t2	B5, *A4++
588c2ecf20Sopenharmony_ci||	 mv	.s2x	A0, B5
598c2ecf20Sopenharmony_ci||	 cmpltu	.l2	B2, B7, B0
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	;; loop back branch happens here
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	 cmpltu	.l2	B1, B6, B0
648c2ecf20Sopenharmony_ci||	 ret	.s2	b3
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci   [B0]	 stw	.d1t1	A1, *A4++
678c2ecf20Sopenharmony_ci||	 cmpltu	.l2	12, B6, B0
688c2ecf20Sopenharmony_ci   [B0]	 stw	.d1t1	A5, *A4++
698c2ecf20Sopenharmony_ci||	 cmpltu	.l2	8, B6, B0
708c2ecf20Sopenharmony_ci   [B0]	 stw	.d1t1	A7, *A4++
718c2ecf20Sopenharmony_ci||	 cmpltu	.l2	4, B6, B0
728c2ecf20Sopenharmony_ci   [B0]	 stw	.d1t1	A8, *A4++
738c2ecf20Sopenharmony_ci||	 cmpltu	.l2	0, B6, B0
748c2ecf20Sopenharmony_ci   [B0]	 stw	.d1t1	A9, *A4++
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci	;; return happens here
778c2ecf20Sopenharmony_ciENDPROC(__c6xabi_strasgi)
78