18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/arm/lib/io-readsl.S
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  Copyright (C) 1995-2000 Russell King
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci#include <linux/linkage.h>
88c2ecf20Sopenharmony_ci#include <asm/assembler.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ciENTRY(__raw_readsl)
118c2ecf20Sopenharmony_ci		teq	r2, #0		@ do we have to check for the zero len?
128c2ecf20Sopenharmony_ci		reteq	lr
138c2ecf20Sopenharmony_ci		ands	ip, r1, #3
148c2ecf20Sopenharmony_ci		bne	3f
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci		subs	r2, r2, #4
178c2ecf20Sopenharmony_ci		bmi	2f
188c2ecf20Sopenharmony_ci		stmfd	sp!, {r4, lr}
198c2ecf20Sopenharmony_ci1:		ldr	r3, [r0, #0]
208c2ecf20Sopenharmony_ci		ldr	r4, [r0, #0]
218c2ecf20Sopenharmony_ci		ldr	ip, [r0, #0]
228c2ecf20Sopenharmony_ci		ldr	lr, [r0, #0]
238c2ecf20Sopenharmony_ci		subs	r2, r2, #4
248c2ecf20Sopenharmony_ci		stmia	r1!, {r3, r4, ip, lr}
258c2ecf20Sopenharmony_ci		bpl	1b
268c2ecf20Sopenharmony_ci		ldmfd	sp!, {r4, lr}
278c2ecf20Sopenharmony_ci2:		movs	r2, r2, lsl #31
288c2ecf20Sopenharmony_ci		ldrcs	r3, [r0, #0]
298c2ecf20Sopenharmony_ci		ldrcs	ip, [r0, #0]
308c2ecf20Sopenharmony_ci		stmiacs	r1!, {r3, ip}
318c2ecf20Sopenharmony_ci		ldrne	r3, [r0, #0]
328c2ecf20Sopenharmony_ci		strne	r3, [r1, #0]
338c2ecf20Sopenharmony_ci		ret	lr
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci3:		ldr	r3, [r0]
368c2ecf20Sopenharmony_ci		cmp	ip, #2
378c2ecf20Sopenharmony_ci		mov	ip, r3, get_byte_0
388c2ecf20Sopenharmony_ci		strb	ip, [r1], #1
398c2ecf20Sopenharmony_ci		bgt	6f
408c2ecf20Sopenharmony_ci		mov	ip, r3, get_byte_1
418c2ecf20Sopenharmony_ci		strb	ip, [r1], #1
428c2ecf20Sopenharmony_ci		beq	5f
438c2ecf20Sopenharmony_ci		mov	ip, r3, get_byte_2
448c2ecf20Sopenharmony_ci		strb	ip, [r1], #1
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci4:		subs	r2, r2, #1
478c2ecf20Sopenharmony_ci		mov	ip, r3, lspull #24
488c2ecf20Sopenharmony_ci		ldrne	r3, [r0]
498c2ecf20Sopenharmony_ci		orrne	ip, ip, r3, lspush #8
508c2ecf20Sopenharmony_ci		strne	ip, [r1], #4
518c2ecf20Sopenharmony_ci		bne	4b
528c2ecf20Sopenharmony_ci		b	8f
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci5:		subs	r2, r2, #1
558c2ecf20Sopenharmony_ci		mov	ip, r3, lspull #16
568c2ecf20Sopenharmony_ci		ldrne	r3, [r0]
578c2ecf20Sopenharmony_ci		orrne	ip, ip, r3, lspush #16
588c2ecf20Sopenharmony_ci		strne	ip, [r1], #4
598c2ecf20Sopenharmony_ci		bne	5b
608c2ecf20Sopenharmony_ci		b	7f
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci6:		subs	r2, r2, #1
638c2ecf20Sopenharmony_ci		mov	ip, r3, lspull #8
648c2ecf20Sopenharmony_ci		ldrne	r3, [r0]
658c2ecf20Sopenharmony_ci		orrne	ip, ip, r3, lspush #24
668c2ecf20Sopenharmony_ci		strne	ip, [r1], #4
678c2ecf20Sopenharmony_ci		bne	6b
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci		mov	r3, ip, get_byte_2
708c2ecf20Sopenharmony_ci		strb	r3, [r1, #2]
718c2ecf20Sopenharmony_ci7:		mov	r3, ip, get_byte_1
728c2ecf20Sopenharmony_ci		strb	r3, [r1, #1]
738c2ecf20Sopenharmony_ci8:		mov	r3, ip, get_byte_0
748c2ecf20Sopenharmony_ci		strb	r3, [r1, #0]
758c2ecf20Sopenharmony_ci		ret	lr
768c2ecf20Sopenharmony_ciENDPROC(__raw_readsl)
77