1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * linux/arch/arm/lib/io-readsl.S 4 * 5 * Copyright (C) 1995-2000 Russell King 6 */ 7#include <linux/linkage.h> 8#include <asm/assembler.h> 9 10ENTRY(__raw_readsl) 11 teq r2, #0 @ do we have to check for the zero len? 12 reteq lr 13 ands ip, r1, #3 14 bne 3f 15 16 subs r2, r2, #4 17 bmi 2f 18 stmfd sp!, {r4, lr} 191: ldr r3, [r0, #0] 20 ldr r4, [r0, #0] 21 ldr ip, [r0, #0] 22 ldr lr, [r0, #0] 23 subs r2, r2, #4 24 stmia r1!, {r3, r4, ip, lr} 25 bpl 1b 26 ldmfd sp!, {r4, lr} 272: movs r2, r2, lsl #31 28 ldrcs r3, [r0, #0] 29 ldrcs ip, [r0, #0] 30 stmiacs r1!, {r3, ip} 31 ldrne r3, [r0, #0] 32 strne r3, [r1, #0] 33 ret lr 34 353: ldr r3, [r0] 36 cmp ip, #2 37 mov ip, r3, get_byte_0 38 strb ip, [r1], #1 39 bgt 6f 40 mov ip, r3, get_byte_1 41 strb ip, [r1], #1 42 beq 5f 43 mov ip, r3, get_byte_2 44 strb ip, [r1], #1 45 464: subs r2, r2, #1 47 mov ip, r3, lspull #24 48 ldrne r3, [r0] 49 orrne ip, ip, r3, lspush #8 50 strne ip, [r1], #4 51 bne 4b 52 b 8f 53 545: subs r2, r2, #1 55 mov ip, r3, lspull #16 56 ldrne r3, [r0] 57 orrne ip, ip, r3, lspush #16 58 strne ip, [r1], #4 59 bne 5b 60 b 7f 61 626: subs r2, r2, #1 63 mov ip, r3, lspull #8 64 ldrne r3, [r0] 65 orrne ip, ip, r3, lspush #24 66 strne ip, [r1], #4 67 bne 6b 68 69 mov r3, ip, get_byte_2 70 strb r3, [r1, #2] 717: mov r3, ip, get_byte_1 72 strb r3, [r1, #1] 738: mov r3, ip, get_byte_0 74 strb r3, [r1, #0] 75 ret lr 76ENDPROC(__raw_readsl) 77