18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/arm/lib/io-writesb.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_ci .macro outword, rd 118c2ecf20Sopenharmony_ci#ifndef __ARMEB__ 128c2ecf20Sopenharmony_ci strb \rd, [r0] 138c2ecf20Sopenharmony_ci mov \rd, \rd, lsr #8 148c2ecf20Sopenharmony_ci strb \rd, [r0] 158c2ecf20Sopenharmony_ci mov \rd, \rd, lsr #8 168c2ecf20Sopenharmony_ci strb \rd, [r0] 178c2ecf20Sopenharmony_ci mov \rd, \rd, lsr #8 188c2ecf20Sopenharmony_ci strb \rd, [r0] 198c2ecf20Sopenharmony_ci#else 208c2ecf20Sopenharmony_ci mov lr, \rd, lsr #24 218c2ecf20Sopenharmony_ci strb lr, [r0] 228c2ecf20Sopenharmony_ci mov lr, \rd, lsr #16 238c2ecf20Sopenharmony_ci strb lr, [r0] 248c2ecf20Sopenharmony_ci mov lr, \rd, lsr #8 258c2ecf20Sopenharmony_ci strb lr, [r0] 268c2ecf20Sopenharmony_ci strb \rd, [r0] 278c2ecf20Sopenharmony_ci#endif 288c2ecf20Sopenharmony_ci .endm 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci.Loutsb_align: rsb ip, ip, #4 318c2ecf20Sopenharmony_ci cmp ip, r2 328c2ecf20Sopenharmony_ci movgt ip, r2 338c2ecf20Sopenharmony_ci cmp ip, #2 348c2ecf20Sopenharmony_ci ldrb r3, [r1], #1 358c2ecf20Sopenharmony_ci strb r3, [r0] 368c2ecf20Sopenharmony_ci ldrbge r3, [r1], #1 378c2ecf20Sopenharmony_ci strbge r3, [r0] 388c2ecf20Sopenharmony_ci ldrbgt r3, [r1], #1 398c2ecf20Sopenharmony_ci strbgt r3, [r0] 408c2ecf20Sopenharmony_ci subs r2, r2, ip 418c2ecf20Sopenharmony_ci bne .Loutsb_aligned 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ciENTRY(__raw_writesb) 448c2ecf20Sopenharmony_ci teq r2, #0 @ do we have to check for the zero len? 458c2ecf20Sopenharmony_ci reteq lr 468c2ecf20Sopenharmony_ci ands ip, r1, #3 478c2ecf20Sopenharmony_ci bne .Loutsb_align 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci.Loutsb_aligned: 508c2ecf20Sopenharmony_ci stmfd sp!, {r4, r5, lr} 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci subs r2, r2, #16 538c2ecf20Sopenharmony_ci bmi .Loutsb_no_16 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci.Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip} 568c2ecf20Sopenharmony_ci outword r3 578c2ecf20Sopenharmony_ci outword r4 588c2ecf20Sopenharmony_ci outword r5 598c2ecf20Sopenharmony_ci outword ip 608c2ecf20Sopenharmony_ci subs r2, r2, #16 618c2ecf20Sopenharmony_ci bpl .Loutsb_16_lp 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci tst r2, #15 648c2ecf20Sopenharmony_ci ldmfdeq sp!, {r4, r5, pc} 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci.Loutsb_no_16: tst r2, #8 678c2ecf20Sopenharmony_ci beq .Loutsb_no_8 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci ldmia r1!, {r3, r4} 708c2ecf20Sopenharmony_ci outword r3 718c2ecf20Sopenharmony_ci outword r4 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci.Loutsb_no_8: tst r2, #4 748c2ecf20Sopenharmony_ci beq .Loutsb_no_4 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci ldr r3, [r1], #4 778c2ecf20Sopenharmony_ci outword r3 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci.Loutsb_no_4: ands r2, r2, #3 808c2ecf20Sopenharmony_ci ldmfdeq sp!, {r4, r5, pc} 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci cmp r2, #2 838c2ecf20Sopenharmony_ci ldrb r3, [r1], #1 848c2ecf20Sopenharmony_ci strb r3, [r0] 858c2ecf20Sopenharmony_ci ldrbge r3, [r1], #1 868c2ecf20Sopenharmony_ci strbge r3, [r0] 878c2ecf20Sopenharmony_ci ldrbgt r3, [r1] 888c2ecf20Sopenharmony_ci strbgt r3, [r0] 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci ldmfd sp!, {r4, r5, pc} 918c2ecf20Sopenharmony_ciENDPROC(__raw_writesb) 92