162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/io-readsw-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 pack, rd, hw1, hw2 1162306a36Sopenharmony_ci#ifndef __ARMEB__ 1262306a36Sopenharmony_ci orr \rd, \hw1, \hw2, lsl #16 1362306a36Sopenharmony_ci#else 1462306a36Sopenharmony_ci orr \rd, \hw2, \hw1, lsl #16 1562306a36Sopenharmony_ci#endif 1662306a36Sopenharmony_ci .endm 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci.Linsw_align: movs ip, r1, lsl #31 1962306a36Sopenharmony_ci bne .Linsw_noalign 2062306a36Sopenharmony_ci ldrh ip, [r0] 2162306a36Sopenharmony_ci sub r2, r2, #1 2262306a36Sopenharmony_ci strh ip, [r1], #2 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ciENTRY(__raw_readsw) 2562306a36Sopenharmony_ci teq r2, #0 2662306a36Sopenharmony_ci reteq lr 2762306a36Sopenharmony_ci tst r1, #3 2862306a36Sopenharmony_ci bne .Linsw_align 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci stmfd sp!, {r4, r5, lr} 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci subs r2, r2, #8 3362306a36Sopenharmony_ci bmi .Lno_insw_8 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci.Linsw_8_lp: ldrh r3, [r0] 3662306a36Sopenharmony_ci ldrh r4, [r0] 3762306a36Sopenharmony_ci pack r3, r3, r4 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci ldrh r4, [r0] 4062306a36Sopenharmony_ci ldrh r5, [r0] 4162306a36Sopenharmony_ci pack r4, r4, r5 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci ldrh r5, [r0] 4462306a36Sopenharmony_ci ldrh ip, [r0] 4562306a36Sopenharmony_ci pack r5, r5, ip 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci ldrh ip, [r0] 4862306a36Sopenharmony_ci ldrh lr, [r0] 4962306a36Sopenharmony_ci pack ip, ip, lr 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci subs r2, r2, #8 5262306a36Sopenharmony_ci stmia r1!, {r3 - r5, ip} 5362306a36Sopenharmony_ci bpl .Linsw_8_lp 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci.Lno_insw_8: tst r2, #4 5662306a36Sopenharmony_ci beq .Lno_insw_4 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci ldrh r3, [r0] 5962306a36Sopenharmony_ci ldrh r4, [r0] 6062306a36Sopenharmony_ci pack r3, r3, r4 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci ldrh r4, [r0] 6362306a36Sopenharmony_ci ldrh ip, [r0] 6462306a36Sopenharmony_ci pack r4, r4, ip 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci stmia r1!, {r3, r4} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci.Lno_insw_4: movs r2, r2, lsl #31 6962306a36Sopenharmony_ci bcc .Lno_insw_2 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci ldrh r3, [r0] 7262306a36Sopenharmony_ci ldrh ip, [r0] 7362306a36Sopenharmony_ci pack r3, r3, ip 7462306a36Sopenharmony_ci str r3, [r1], #4 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci.Lno_insw_2: ldrhne r3, [r0] 7762306a36Sopenharmony_ci strhne r3, [r1] 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci ldmfd sp!, {r4, r5, pc} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#ifdef __ARMEB__ 8262306a36Sopenharmony_ci#define _BE_ONLY_(code...) code 8362306a36Sopenharmony_ci#define _LE_ONLY_(code...) 8462306a36Sopenharmony_ci#define push_hbyte0 lsr #8 8562306a36Sopenharmony_ci#define pull_hbyte1 lsl #24 8662306a36Sopenharmony_ci#else 8762306a36Sopenharmony_ci#define _BE_ONLY_(code...) 8862306a36Sopenharmony_ci#define _LE_ONLY_(code...) code 8962306a36Sopenharmony_ci#define push_hbyte0 lsl #24 9062306a36Sopenharmony_ci#define pull_hbyte1 lsr #8 9162306a36Sopenharmony_ci#endif 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci.Linsw_noalign: stmfd sp!, {r4, lr} 9462306a36Sopenharmony_ci ldrbcc ip, [r1, #-1]! 9562306a36Sopenharmony_ci bcc 1f 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci ldrh ip, [r0] 9862306a36Sopenharmony_ci sub r2, r2, #1 9962306a36Sopenharmony_ci _BE_ONLY_( mov ip, ip, ror #8 ) 10062306a36Sopenharmony_ci strb ip, [r1], #1 10162306a36Sopenharmony_ci _LE_ONLY_( mov ip, ip, lsr #8 ) 10262306a36Sopenharmony_ci _BE_ONLY_( mov ip, ip, lsr #24 ) 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci1: subs r2, r2, #2 10562306a36Sopenharmony_ci bmi 3f 10662306a36Sopenharmony_ci _BE_ONLY_( mov ip, ip, lsl #24 ) 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci2: ldrh r3, [r0] 10962306a36Sopenharmony_ci ldrh r4, [r0] 11062306a36Sopenharmony_ci subs r2, r2, #2 11162306a36Sopenharmony_ci orr ip, ip, r3, lsl #8 11262306a36Sopenharmony_ci orr ip, ip, r4, push_hbyte0 11362306a36Sopenharmony_ci str ip, [r1], #4 11462306a36Sopenharmony_ci mov ip, r4, pull_hbyte1 11562306a36Sopenharmony_ci bpl 2b 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci _BE_ONLY_( mov ip, ip, lsr #24 ) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci3: tst r2, #1 12062306a36Sopenharmony_ci strb ip, [r1], #1 12162306a36Sopenharmony_ci ldrhne ip, [r0] 12262306a36Sopenharmony_ci _BE_ONLY_( movne ip, ip, ror #8 ) 12362306a36Sopenharmony_ci strbne ip, [r1], #1 12462306a36Sopenharmony_ci _LE_ONLY_( movne ip, ip, lsr #8 ) 12562306a36Sopenharmony_ci _BE_ONLY_( movne ip, ip, lsr #24 ) 12662306a36Sopenharmony_ci strbne ip, [r1] 12762306a36Sopenharmony_ci ldmfd sp!, {r4, pc} 12862306a36Sopenharmony_ciENDPROC(__raw_readsw) 129