162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/io-writesb.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_ci .macro outword, rd 1162306a36Sopenharmony_ci#ifndef __ARMEB__ 1262306a36Sopenharmony_ci strb \rd, [r0] 1362306a36Sopenharmony_ci mov \rd, \rd, lsr #8 1462306a36Sopenharmony_ci strb \rd, [r0] 1562306a36Sopenharmony_ci mov \rd, \rd, lsr #8 1662306a36Sopenharmony_ci strb \rd, [r0] 1762306a36Sopenharmony_ci mov \rd, \rd, lsr #8 1862306a36Sopenharmony_ci strb \rd, [r0] 1962306a36Sopenharmony_ci#else 2062306a36Sopenharmony_ci mov lr, \rd, lsr #24 2162306a36Sopenharmony_ci strb lr, [r0] 2262306a36Sopenharmony_ci mov lr, \rd, lsr #16 2362306a36Sopenharmony_ci strb lr, [r0] 2462306a36Sopenharmony_ci mov lr, \rd, lsr #8 2562306a36Sopenharmony_ci strb lr, [r0] 2662306a36Sopenharmony_ci strb \rd, [r0] 2762306a36Sopenharmony_ci#endif 2862306a36Sopenharmony_ci .endm 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci.Loutsb_align: rsb ip, ip, #4 3162306a36Sopenharmony_ci cmp ip, r2 3262306a36Sopenharmony_ci movgt ip, r2 3362306a36Sopenharmony_ci cmp ip, #2 3462306a36Sopenharmony_ci ldrb r3, [r1], #1 3562306a36Sopenharmony_ci strb r3, [r0] 3662306a36Sopenharmony_ci ldrbge r3, [r1], #1 3762306a36Sopenharmony_ci strbge r3, [r0] 3862306a36Sopenharmony_ci ldrbgt r3, [r1], #1 3962306a36Sopenharmony_ci strbgt r3, [r0] 4062306a36Sopenharmony_ci subs r2, r2, ip 4162306a36Sopenharmony_ci bne .Loutsb_aligned 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ciENTRY(__raw_writesb) 4462306a36Sopenharmony_ci teq r2, #0 @ do we have to check for the zero len? 4562306a36Sopenharmony_ci reteq lr 4662306a36Sopenharmony_ci ands ip, r1, #3 4762306a36Sopenharmony_ci bne .Loutsb_align 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci.Loutsb_aligned: 5062306a36Sopenharmony_ci stmfd sp!, {r4, r5, lr} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci subs r2, r2, #16 5362306a36Sopenharmony_ci bmi .Loutsb_no_16 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci.Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip} 5662306a36Sopenharmony_ci outword r3 5762306a36Sopenharmony_ci outword r4 5862306a36Sopenharmony_ci outword r5 5962306a36Sopenharmony_ci outword ip 6062306a36Sopenharmony_ci subs r2, r2, #16 6162306a36Sopenharmony_ci bpl .Loutsb_16_lp 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci tst r2, #15 6462306a36Sopenharmony_ci ldmfdeq sp!, {r4, r5, pc} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci.Loutsb_no_16: tst r2, #8 6762306a36Sopenharmony_ci beq .Loutsb_no_8 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci ldmia r1!, {r3, r4} 7062306a36Sopenharmony_ci outword r3 7162306a36Sopenharmony_ci outword r4 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci.Loutsb_no_8: tst r2, #4 7462306a36Sopenharmony_ci beq .Loutsb_no_4 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci ldr r3, [r1], #4 7762306a36Sopenharmony_ci outword r3 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci.Loutsb_no_4: ands r2, r2, #3 8062306a36Sopenharmony_ci ldmfdeq sp!, {r4, r5, pc} 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci cmp r2, #2 8362306a36Sopenharmony_ci ldrb r3, [r1], #1 8462306a36Sopenharmony_ci strb r3, [r0] 8562306a36Sopenharmony_ci ldrbge r3, [r1], #1 8662306a36Sopenharmony_ci strbge r3, [r0] 8762306a36Sopenharmony_ci ldrbgt r3, [r1] 8862306a36Sopenharmony_ci strbgt r3, [r0] 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci ldmfd sp!, {r4, r5, pc} 9162306a36Sopenharmony_ciENDPROC(__raw_writesb) 92