162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/io-writesw-armv4.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 strh \rd, [r0] 1362306a36Sopenharmony_ci mov \rd, \rd, lsr #16 1462306a36Sopenharmony_ci strh \rd, [r0] 1562306a36Sopenharmony_ci#else 1662306a36Sopenharmony_ci mov lr, \rd, lsr #16 1762306a36Sopenharmony_ci strh lr, [r0] 1862306a36Sopenharmony_ci strh \rd, [r0] 1962306a36Sopenharmony_ci#endif 2062306a36Sopenharmony_ci .endm 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci.Loutsw_align: movs ip, r1, lsl #31 2362306a36Sopenharmony_ci bne .Loutsw_noalign 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci ldrh r3, [r1], #2 2662306a36Sopenharmony_ci sub r2, r2, #1 2762306a36Sopenharmony_ci strh r3, [r0] 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ciENTRY(__raw_writesw) 3062306a36Sopenharmony_ci teq r2, #0 3162306a36Sopenharmony_ci reteq lr 3262306a36Sopenharmony_ci ands r3, r1, #3 3362306a36Sopenharmony_ci bne .Loutsw_align 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci stmfd sp!, {r4, r5, lr} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci subs r2, r2, #8 3862306a36Sopenharmony_ci bmi .Lno_outsw_8 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci.Loutsw_8_lp: ldmia r1!, {r3, r4, r5, ip} 4162306a36Sopenharmony_ci subs r2, r2, #8 4262306a36Sopenharmony_ci outword r3 4362306a36Sopenharmony_ci outword r4 4462306a36Sopenharmony_ci outword r5 4562306a36Sopenharmony_ci outword ip 4662306a36Sopenharmony_ci bpl .Loutsw_8_lp 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci.Lno_outsw_8: tst r2, #4 4962306a36Sopenharmony_ci beq .Lno_outsw_4 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci ldmia r1!, {r3, ip} 5262306a36Sopenharmony_ci outword r3 5362306a36Sopenharmony_ci outword ip 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci.Lno_outsw_4: movs r2, r2, lsl #31 5662306a36Sopenharmony_ci bcc .Lno_outsw_2 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci ldr r3, [r1], #4 5962306a36Sopenharmony_ci outword r3 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci.Lno_outsw_2: ldrhne r3, [r1] 6262306a36Sopenharmony_ci strhne r3, [r0] 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci ldmfd sp!, {r4, r5, pc} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#ifdef __ARMEB__ 6762306a36Sopenharmony_ci#define pull_hbyte0 lsl #8 6862306a36Sopenharmony_ci#define push_hbyte1 lsr #24 6962306a36Sopenharmony_ci#else 7062306a36Sopenharmony_ci#define pull_hbyte0 lsr #24 7162306a36Sopenharmony_ci#define push_hbyte1 lsl #8 7262306a36Sopenharmony_ci#endif 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci.Loutsw_noalign: 7562306a36Sopenharmony_ci ARM( ldr r3, [r1, -r3]! ) 7662306a36Sopenharmony_ci THUMB( rsb r3, r3, #0 ) 7762306a36Sopenharmony_ci THUMB( ldr r3, [r1, r3] ) 7862306a36Sopenharmony_ci THUMB( sub r1, r3 ) 7962306a36Sopenharmony_ci subcs r2, r2, #1 8062306a36Sopenharmony_ci bcs 2f 8162306a36Sopenharmony_ci subs r2, r2, #2 8262306a36Sopenharmony_ci bmi 3f 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci1: mov ip, r3, lsr #8 8562306a36Sopenharmony_ci strh ip, [r0] 8662306a36Sopenharmony_ci2: mov ip, r3, pull_hbyte0 8762306a36Sopenharmony_ci ldr r3, [r1, #4]! 8862306a36Sopenharmony_ci subs r2, r2, #2 8962306a36Sopenharmony_ci orr ip, ip, r3, push_hbyte1 9062306a36Sopenharmony_ci strh ip, [r0] 9162306a36Sopenharmony_ci bpl 1b 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci tst r2, #1 9462306a36Sopenharmony_ci3: movne ip, r3, lsr #8 9562306a36Sopenharmony_ci strhne ip, [r0] 9662306a36Sopenharmony_ci ret lr 9762306a36Sopenharmony_ciENDPROC(__raw_writesw) 98