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