162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/arm/lib/memcpy.S
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Author:	Nicolas Pitre
662306a36Sopenharmony_ci *  Created:	Sep 28, 2005
762306a36Sopenharmony_ci *  Copyright:	MontaVista Software, Inc.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/linkage.h>
1162306a36Sopenharmony_ci#include <asm/assembler.h>
1262306a36Sopenharmony_ci#include <asm/unwind.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define LDR1W_SHIFT	0
1562306a36Sopenharmony_ci#define STR1W_SHIFT	0
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	.macro ldr1w ptr reg abort
1862306a36Sopenharmony_ci	W(ldr) \reg, [\ptr], #4
1962306a36Sopenharmony_ci	.endm
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
2262306a36Sopenharmony_ci	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
2362306a36Sopenharmony_ci	.endm
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
2662306a36Sopenharmony_ci	ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
2762306a36Sopenharmony_ci	.endm
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	.macro ldr1b ptr reg cond=al abort
3062306a36Sopenharmony_ci	ldrb\cond \reg, [\ptr], #1
3162306a36Sopenharmony_ci	.endm
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	.macro str1w ptr reg abort
3462306a36Sopenharmony_ci	W(str) \reg, [\ptr], #4
3562306a36Sopenharmony_ci	.endm
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
3862306a36Sopenharmony_ci	stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
3962306a36Sopenharmony_ci	.endm
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	.macro str1b ptr reg cond=al abort
4262306a36Sopenharmony_ci	strb\cond \reg, [\ptr], #1
4362306a36Sopenharmony_ci	.endm
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	.macro enter regs:vararg
4662306a36Sopenharmony_ciUNWIND( .save	{r0, \regs}		)
4762306a36Sopenharmony_ci	stmdb sp!, {r0, \regs}
4862306a36Sopenharmony_ci	.endm
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	.macro exit regs:vararg
5162306a36Sopenharmony_ci	ldmfd sp!, {r0, \regs}
5262306a36Sopenharmony_ci	.endm
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	.text
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciENTRY(__memcpy)
5962306a36Sopenharmony_ciENTRY(mmiocpy)
6062306a36Sopenharmony_ciWEAK(memcpy)
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#include "copy_template.S"
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciENDPROC(memcpy)
6562306a36Sopenharmony_ciENDPROC(mmiocpy)
6662306a36Sopenharmony_ciENDPROC(__memcpy)
67