1*d2912cb1SThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-only */ 21da177e4SLinus Torvalds/* 31da177e4SLinus Torvalds * linux/arch/arm/lib/io-writesw-armv4.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 strh \rd, [r0] 131da177e4SLinus Torvalds mov \rd, \rd, lsr #16 141da177e4SLinus Torvalds strh \rd, [r0] 151da177e4SLinus Torvalds#else 161da177e4SLinus Torvalds mov lr, \rd, lsr #16 171da177e4SLinus Torvalds strh lr, [r0] 181da177e4SLinus Torvalds strh \rd, [r0] 191da177e4SLinus Torvalds#endif 201da177e4SLinus Torvalds .endm 211da177e4SLinus Torvalds 22a9c4814dSNicolas Pitre.Loutsw_align: movs ip, r1, lsl #31 23a9c4814dSNicolas Pitre bne .Loutsw_noalign 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds ldrh r3, [r1], #2 261da177e4SLinus Torvalds sub r2, r2, #1 271da177e4SLinus Torvalds strh r3, [r0] 281da177e4SLinus Torvalds 291da177e4SLinus TorvaldsENTRY(__raw_writesw) 301da177e4SLinus Torvalds teq r2, #0 316ebbf2ceSRussell King reteq lr 321da177e4SLinus Torvalds ands r3, r1, #3 33a9c4814dSNicolas Pitre bne .Loutsw_align 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds stmfd sp!, {r4, r5, lr} 361da177e4SLinus Torvalds 371da177e4SLinus Torvalds subs r2, r2, #8 38a9c4814dSNicolas Pitre bmi .Lno_outsw_8 391da177e4SLinus Torvalds 40a9c4814dSNicolas Pitre.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, ip} 411da177e4SLinus Torvalds subs r2, r2, #8 421da177e4SLinus Torvalds outword r3 431da177e4SLinus Torvalds outword r4 441da177e4SLinus Torvalds outword r5 451da177e4SLinus Torvalds outword ip 46a9c4814dSNicolas Pitre bpl .Loutsw_8_lp 471da177e4SLinus Torvalds 48a9c4814dSNicolas Pitre.Lno_outsw_8: tst r2, #4 49a9c4814dSNicolas Pitre beq .Lno_outsw_4 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds ldmia r1!, {r3, ip} 521da177e4SLinus Torvalds outword r3 531da177e4SLinus Torvalds outword ip 541da177e4SLinus Torvalds 55a9c4814dSNicolas Pitre.Lno_outsw_4: movs r2, r2, lsl #31 56a9c4814dSNicolas Pitre bcc .Lno_outsw_2 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds ldr r3, [r1], #4 591da177e4SLinus Torvalds outword r3 601da177e4SLinus Torvalds 61e44fc388SStefan Agner.Lno_outsw_2: ldrhne r3, [r1] 62e44fc388SStefan Agner strhne r3, [r0] 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds ldmfd sp!, {r4, r5, pc} 651da177e4SLinus Torvalds 661da177e4SLinus Torvalds#ifdef __ARMEB__ 671da177e4SLinus Torvalds#define pull_hbyte0 lsl #8 681da177e4SLinus Torvalds#define push_hbyte1 lsr #24 691da177e4SLinus Torvalds#else 701da177e4SLinus Torvalds#define pull_hbyte0 lsr #24 711da177e4SLinus Torvalds#define push_hbyte1 lsl #8 721da177e4SLinus Torvalds#endif 731da177e4SLinus Torvalds 74a9c4814dSNicolas Pitre.Loutsw_noalign: 758b592783SCatalin Marinas ARM( ldr r3, [r1, -r3]! ) 768b592783SCatalin Marinas THUMB( rsb r3, r3, #0 ) 778b592783SCatalin Marinas THUMB( ldr r3, [r1, r3] ) 788b592783SCatalin Marinas THUMB( sub r1, r3 ) 791da177e4SLinus Torvalds subcs r2, r2, #1 801da177e4SLinus Torvalds bcs 2f 811da177e4SLinus Torvalds subs r2, r2, #2 821da177e4SLinus Torvalds bmi 3f 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds1: mov ip, r3, lsr #8 851da177e4SLinus Torvalds strh ip, [r0] 861da177e4SLinus Torvalds2: mov ip, r3, pull_hbyte0 871da177e4SLinus Torvalds ldr r3, [r1, #4]! 881da177e4SLinus Torvalds subs r2, r2, #2 891da177e4SLinus Torvalds orr ip, ip, r3, push_hbyte1 901da177e4SLinus Torvalds strh ip, [r0] 91aeabbbbeSNicolas Pitre bpl 1b 921da177e4SLinus Torvalds 93aeabbbbeSNicolas Pitre tst r2, #1 94aeabbbbeSNicolas Pitre3: movne ip, r3, lsr #8 95e44fc388SStefan Agner strhne ip, [r0] 966ebbf2ceSRussell King ret lr 9793ed3970SCatalin MarinasENDPROC(__raw_writesw) 98