162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/arm/lib/io-readsl.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_readsl)
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:		ldr	r3, [r0, #0]
2062306a36Sopenharmony_ci		ldr	r4, [r0, #0]
2162306a36Sopenharmony_ci		ldr	ip, [r0, #0]
2262306a36Sopenharmony_ci		ldr	lr, [r0, #0]
2362306a36Sopenharmony_ci		subs	r2, r2, #4
2462306a36Sopenharmony_ci		stmia	r1!, {r3, r4, ip, lr}
2562306a36Sopenharmony_ci		bpl	1b
2662306a36Sopenharmony_ci		ldmfd	sp!, {r4, lr}
2762306a36Sopenharmony_ci2:		movs	r2, r2, lsl #31
2862306a36Sopenharmony_ci		ldrcs	r3, [r0, #0]
2962306a36Sopenharmony_ci		ldrcs	ip, [r0, #0]
3062306a36Sopenharmony_ci		stmiacs	r1!, {r3, ip}
3162306a36Sopenharmony_ci		ldrne	r3, [r0, #0]
3262306a36Sopenharmony_ci		strne	r3, [r1, #0]
3362306a36Sopenharmony_ci		ret	lr
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci3:		ldr	r3, [r0]
3662306a36Sopenharmony_ci		cmp	ip, #2
3762306a36Sopenharmony_ci		mov	ip, r3, get_byte_0
3862306a36Sopenharmony_ci		strb	ip, [r1], #1
3962306a36Sopenharmony_ci		bgt	6f
4062306a36Sopenharmony_ci		mov	ip, r3, get_byte_1
4162306a36Sopenharmony_ci		strb	ip, [r1], #1
4262306a36Sopenharmony_ci		beq	5f
4362306a36Sopenharmony_ci		mov	ip, r3, get_byte_2
4462306a36Sopenharmony_ci		strb	ip, [r1], #1
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci4:		subs	r2, r2, #1
4762306a36Sopenharmony_ci		mov	ip, r3, lspull #24
4862306a36Sopenharmony_ci		ldrne	r3, [r0]
4962306a36Sopenharmony_ci		orrne	ip, ip, r3, lspush #8
5062306a36Sopenharmony_ci		strne	ip, [r1], #4
5162306a36Sopenharmony_ci		bne	4b
5262306a36Sopenharmony_ci		b	8f
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci5:		subs	r2, r2, #1
5562306a36Sopenharmony_ci		mov	ip, r3, lspull #16
5662306a36Sopenharmony_ci		ldrne	r3, [r0]
5762306a36Sopenharmony_ci		orrne	ip, ip, r3, lspush #16
5862306a36Sopenharmony_ci		strne	ip, [r1], #4
5962306a36Sopenharmony_ci		bne	5b
6062306a36Sopenharmony_ci		b	7f
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci6:		subs	r2, r2, #1
6362306a36Sopenharmony_ci		mov	ip, r3, lspull #8
6462306a36Sopenharmony_ci		ldrne	r3, [r0]
6562306a36Sopenharmony_ci		orrne	ip, ip, r3, lspush #24
6662306a36Sopenharmony_ci		strne	ip, [r1], #4
6762306a36Sopenharmony_ci		bne	6b
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci		mov	r3, ip, get_byte_2
7062306a36Sopenharmony_ci		strb	r3, [r1, #2]
7162306a36Sopenharmony_ci7:		mov	r3, ip, get_byte_1
7262306a36Sopenharmony_ci		strb	r3, [r1, #1]
7362306a36Sopenharmony_ci8:		mov	r3, ip, get_byte_0
7462306a36Sopenharmony_ci		strb	r3, [r1, #0]
7562306a36Sopenharmony_ci		ret	lr
7662306a36Sopenharmony_ciENDPROC(__raw_readsl)
77