197403Sobrien/* SPDX-License-Identifier: GPL-2.0-only */ 297403Sobrien/* 3169691Skan * linux/arch/arm/lib/io-writesw-armv4.S 497403Sobrien * 597403Sobrien * Copyright (C) 1995-2000 Russell King 697403Sobrien */ 797403Sobrien#include <linux/linkage.h> 897403Sobrien#include <asm/assembler.h> 997403Sobrien 1097403Sobrien .macro outword, rd 1197403Sobrien#ifndef __ARMEB__ 1297403Sobrien strh \rd, [r0] 1397403Sobrien mov \rd, \rd, lsr #16 1497403Sobrien strh \rd, [r0] 1597403Sobrien#else 1697403Sobrien mov lr, \rd, lsr #16 1797403Sobrien strh lr, [r0] 18169691Skan strh \rd, [r0] 1997403Sobrien#endif 2097403Sobrien .endm 2197403Sobrien 2297403Sobrien.Loutsw_align: movs ip, r1, lsl #31 2397403Sobrien bne .Loutsw_noalign 2497403Sobrien 2597403Sobrien ldrh r3, [r1], #2 2697403Sobrien sub r2, r2, #1 2797403Sobrien strh r3, [r0] 2897403Sobrien 2997403SobrienENTRY(__raw_writesw) 3097403Sobrien teq r2, #0 3197403Sobrien reteq lr 3297403Sobrien ands r3, r1, #3 3397403Sobrien bne .Loutsw_align 3497403Sobrien 3597403Sobrien stmfd sp!, {r4, r5, lr} 3697403Sobrien 3797403Sobrien subs r2, r2, #8 3897403Sobrien bmi .Lno_outsw_8 3997403Sobrien 4097403Sobrien.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, ip} 4197403Sobrien subs r2, r2, #8 4297403Sobrien outword r3 4397403Sobrien outword r4 4497403Sobrien outword r5 4597403Sobrien outword ip 4697403Sobrien bpl .Loutsw_8_lp 4797403Sobrien 4897403Sobrien.Lno_outsw_8: tst r2, #4 4997403Sobrien beq .Lno_outsw_4 5097403Sobrien 5197403Sobrien ldmia r1!, {r3, ip} 5297403Sobrien outword r3 5397403Sobrien outword ip 5497403Sobrien 5597403Sobrien.Lno_outsw_4: movs r2, r2, lsl #31 5697403Sobrien bcc .Lno_outsw_2 5797403Sobrien 5897403Sobrien ldr r3, [r1], #4 5997403Sobrien outword r3 6097403Sobrien 61132720Skan.Lno_outsw_2: ldrhne r3, [r1] 62132720Skan strhne r3, [r0] 6397403Sobrien 6497403Sobrien ldmfd sp!, {r4, r5, pc} 6597403Sobrien 66169691Skan#ifdef __ARMEB__ 6797403Sobrien#define pull_hbyte0 lsl #8 68132720Skan#define push_hbyte1 lsr #24 69132720Skan#else 70132720Skan#define pull_hbyte0 lsr #24 71132720Skan#define push_hbyte1 lsl #8 72132720Skan#endif 73132720Skan 74132720Skan.Loutsw_noalign: 75132720Skan ARM( ldr r3, [r1, -r3]! ) 76132720Skan THUMB( rsb r3, r3, #0 ) 77132720Skan THUMB( ldr r3, [r1, r3] ) 78132720Skan THUMB( sub r1, r3 ) 79132720Skan subcs r2, r2, #1 80132720Skan bcs 2f 81132720Skan subs r2, r2, #2 82132720Skan bmi 3f 83132720Skan 84132720Skan1: mov ip, r3, lsr #8 85132720Skan strh ip, [r0] 86132720Skan2: mov ip, r3, pull_hbyte0 87132720Skan ldr r3, [r1, #4]! 88169691Skan subs r2, r2, #2 89169691Skan orr ip, ip, r3, push_hbyte1 90132720Skan strh ip, [r0] 91132720Skan bpl 1b 92132720Skan 93169691Skan tst r2, #1 94132720Skan3: movne ip, r3, lsr #8 95132720Skan strhne ip, [r0] 96132720Skan ret lr 97169691SkanENDPROC(__raw_writesw) 9897403Sobrien