1*d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */ 21da177e4SLinus Torvalds/* 31da177e4SLinus Torvalds * linux/arch/arm/lib/io-writesb.S 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 1995-2000 Russell King 61da177e4SLinus Torvalds */ 71da177e4SLinus Torvalds#include <linux/linkage.h> 81da177e4SLinus Torvalds#include <asm/assembler.h> 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds .macro outword, rd 111da177e4SLinus Torvalds#ifndef __ARMEB__ 121da177e4SLinus Torvalds strb \rd, [r0] 131da177e4SLinus Torvalds mov \rd, \rd, lsr #8 141da177e4SLinus Torvalds strb \rd, [r0] 151da177e4SLinus Torvalds mov \rd, \rd, lsr #8 161da177e4SLinus Torvalds strb \rd, [r0] 171da177e4SLinus Torvalds mov \rd, \rd, lsr #8 181da177e4SLinus Torvalds strb \rd, [r0] 191da177e4SLinus Torvalds#else 201da177e4SLinus Torvalds mov lr, \rd, lsr #24 211da177e4SLinus Torvalds strb lr, [r0] 221da177e4SLinus Torvalds mov lr, \rd, lsr #16 231da177e4SLinus Torvalds strb lr, [r0] 241da177e4SLinus Torvalds mov lr, \rd, lsr #8 251da177e4SLinus Torvalds strb lr, [r0] 261da177e4SLinus Torvalds strb \rd, [r0] 271da177e4SLinus Torvalds#endif 281da177e4SLinus Torvalds .endm 291da177e4SLinus Torvalds 30a9c4814dSNicolas Pitre.Loutsb_align: rsb ip, ip, #4 311da177e4SLinus Torvalds cmp ip, r2 321da177e4SLinus Torvalds movgt ip, r2 331da177e4SLinus Torvalds cmp ip, #2 341da177e4SLinus Torvalds ldrb r3, [r1], #1 351da177e4SLinus Torvalds strb r3, [r0] 36e44fc388SStefan Agner ldrbge r3, [r1], #1 37e44fc388SStefan Agner strbge r3, [r0] 38e44fc388SStefan Agner ldrbgt r3, [r1], #1 39e44fc388SStefan Agner strbgt r3, [r0] 401da177e4SLinus Torvalds subs r2, r2, ip 41a9c4814dSNicolas Pitre bne .Loutsb_aligned 421da177e4SLinus Torvalds 431da177e4SLinus TorvaldsENTRY(__raw_writesb) 441da177e4SLinus Torvalds teq r2, #0 @ do we have to check for the zero len? 456ebbf2ceSRussell King reteq lr 461da177e4SLinus Torvalds ands ip, r1, #3 47a9c4814dSNicolas Pitre bne .Loutsb_align 481da177e4SLinus Torvalds 49a9c4814dSNicolas Pitre.Loutsb_aligned: 50a9c4814dSNicolas Pitre stmfd sp!, {r4, r5, lr} 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds subs r2, r2, #16 53a9c4814dSNicolas Pitre bmi .Loutsb_no_16 541da177e4SLinus Torvalds 55a9c4814dSNicolas Pitre.Loutsb_16_lp: ldmia r1!, {r3, r4, r5, ip} 561da177e4SLinus Torvalds outword r3 571da177e4SLinus Torvalds outword r4 581da177e4SLinus Torvalds outword r5 591da177e4SLinus Torvalds outword ip 601da177e4SLinus Torvalds subs r2, r2, #16 61a9c4814dSNicolas Pitre bpl .Loutsb_16_lp 621da177e4SLinus Torvalds 631da177e4SLinus Torvalds tst r2, #15 64e44fc388SStefan Agner ldmfdeq sp!, {r4, r5, pc} 651da177e4SLinus Torvalds 66a9c4814dSNicolas Pitre.Loutsb_no_16: tst r2, #8 67a9c4814dSNicolas Pitre beq .Loutsb_no_8 681da177e4SLinus Torvalds 691da177e4SLinus Torvalds ldmia r1!, {r3, r4} 701da177e4SLinus Torvalds outword r3 711da177e4SLinus Torvalds outword r4 721da177e4SLinus Torvalds 73a9c4814dSNicolas Pitre.Loutsb_no_8: tst r2, #4 74a9c4814dSNicolas Pitre beq .Loutsb_no_4 751da177e4SLinus Torvalds 761da177e4SLinus Torvalds ldr r3, [r1], #4 771da177e4SLinus Torvalds outword r3 781da177e4SLinus Torvalds 79a9c4814dSNicolas Pitre.Loutsb_no_4: ands r2, r2, #3 80e44fc388SStefan Agner ldmfdeq sp!, {r4, r5, pc} 811da177e4SLinus Torvalds 821da177e4SLinus Torvalds cmp r2, #2 831da177e4SLinus Torvalds ldrb r3, [r1], #1 841da177e4SLinus Torvalds strb r3, [r0] 85e44fc388SStefan Agner ldrbge r3, [r1], #1 86e44fc388SStefan Agner strbge r3, [r0] 87e44fc388SStefan Agner ldrbgt r3, [r1] 88e44fc388SStefan Agner strbgt r3, [r0] 891da177e4SLinus Torvalds 901b93a717SRussell King ldmfd sp!, {r4, r5, pc} 9193ed3970SCatalin MarinasENDPROC(__raw_writesb) 92