162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/arm/lib/io-writesl.S
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 1995-2000 Russell King
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#include <linux/linkage.h>
862306a36Sopenharmony_ci#include <asm/assembler.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciENTRY(__raw_writesl)
1162306a36Sopenharmony_ci		teq	r2, #0		@ do we have to check for the zero len?
1262306a36Sopenharmony_ci		reteq	lr
1362306a36Sopenharmony_ci		ands	ip, r1, #3
1462306a36Sopenharmony_ci		bne	3f
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci		subs	r2, r2, #4
1762306a36Sopenharmony_ci		bmi	2f
1862306a36Sopenharmony_ci		stmfd	sp!, {r4, lr}
1962306a36Sopenharmony_ci1:		ldmia	r1!, {r3, r4, ip, lr}
2062306a36Sopenharmony_ci		subs	r2, r2, #4
2162306a36Sopenharmony_ci		str	r3, [r0, #0]
2262306a36Sopenharmony_ci		str	r4, [r0, #0]
2362306a36Sopenharmony_ci		str	ip, [r0, #0]
2462306a36Sopenharmony_ci		str	lr, [r0, #0]
2562306a36Sopenharmony_ci		bpl	1b
2662306a36Sopenharmony_ci		ldmfd	sp!, {r4, lr}
2762306a36Sopenharmony_ci2:		movs	r2, r2, lsl #31
2862306a36Sopenharmony_ci		ldmiacs	r1!, {r3, ip}
2962306a36Sopenharmony_ci		strcs	r3, [r0, #0]
3062306a36Sopenharmony_ci		ldrne	r3, [r1, #0]
3162306a36Sopenharmony_ci		strcs	ip, [r0, #0]
3262306a36Sopenharmony_ci		strne	r3, [r0, #0]
3362306a36Sopenharmony_ci		ret	lr
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci3:		bic	r1, r1, #3
3662306a36Sopenharmony_ci		ldr	r3, [r1], #4
3762306a36Sopenharmony_ci		cmp	ip, #2
3862306a36Sopenharmony_ci		blt	5f
3962306a36Sopenharmony_ci		bgt	6f
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci4:		mov	ip, r3, lspull #16
4262306a36Sopenharmony_ci		ldr	r3, [r1], #4
4362306a36Sopenharmony_ci		subs	r2, r2, #1
4462306a36Sopenharmony_ci		orr	ip, ip, r3, lspush #16
4562306a36Sopenharmony_ci		str	ip, [r0]
4662306a36Sopenharmony_ci		bne	4b
4762306a36Sopenharmony_ci		ret	lr
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci5:		mov	ip, r3, lspull #8
5062306a36Sopenharmony_ci		ldr	r3, [r1], #4
5162306a36Sopenharmony_ci		subs	r2, r2, #1
5262306a36Sopenharmony_ci		orr	ip, ip, r3, lspush #24
5362306a36Sopenharmony_ci		str	ip, [r0]
5462306a36Sopenharmony_ci		bne	5b
5562306a36Sopenharmony_ci		ret	lr
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci6:		mov	ip, r3, lspull #24
5862306a36Sopenharmony_ci		ldr	r3, [r1], #4
5962306a36Sopenharmony_ci		subs	r2, r2, #1
6062306a36Sopenharmony_ci		orr	ip, ip, r3, lspush #8
6162306a36Sopenharmony_ci		str	ip, [r0]
6262306a36Sopenharmony_ci		bne	6b
6362306a36Sopenharmony_ci		ret	lr
6462306a36Sopenharmony_ciENDPROC(__raw_writesl)
65