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