18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/arm/lib/io-readsw-armv4.S 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 1995-2000 Russell King 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/linkage.h> 88c2ecf20Sopenharmony_ci#include <asm/assembler.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci .macro pack, rd, hw1, hw2 118c2ecf20Sopenharmony_ci#ifndef __ARMEB__ 128c2ecf20Sopenharmony_ci orr \rd, \hw1, \hw2, lsl #16 138c2ecf20Sopenharmony_ci#else 148c2ecf20Sopenharmony_ci orr \rd, \hw2, \hw1, lsl #16 158c2ecf20Sopenharmony_ci#endif 168c2ecf20Sopenharmony_ci .endm 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci.Linsw_align: movs ip, r1, lsl #31 198c2ecf20Sopenharmony_ci bne .Linsw_noalign 208c2ecf20Sopenharmony_ci ldrh ip, [r0] 218c2ecf20Sopenharmony_ci sub r2, r2, #1 228c2ecf20Sopenharmony_ci strh ip, [r1], #2 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ciENTRY(__raw_readsw) 258c2ecf20Sopenharmony_ci teq r2, #0 268c2ecf20Sopenharmony_ci reteq lr 278c2ecf20Sopenharmony_ci tst r1, #3 288c2ecf20Sopenharmony_ci bne .Linsw_align 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci stmfd sp!, {r4, r5, lr} 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci subs r2, r2, #8 338c2ecf20Sopenharmony_ci bmi .Lno_insw_8 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci.Linsw_8_lp: ldrh r3, [r0] 368c2ecf20Sopenharmony_ci ldrh r4, [r0] 378c2ecf20Sopenharmony_ci pack r3, r3, r4 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci ldrh r4, [r0] 408c2ecf20Sopenharmony_ci ldrh r5, [r0] 418c2ecf20Sopenharmony_ci pack r4, r4, r5 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci ldrh r5, [r0] 448c2ecf20Sopenharmony_ci ldrh ip, [r0] 458c2ecf20Sopenharmony_ci pack r5, r5, ip 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci ldrh ip, [r0] 488c2ecf20Sopenharmony_ci ldrh lr, [r0] 498c2ecf20Sopenharmony_ci pack ip, ip, lr 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci subs r2, r2, #8 528c2ecf20Sopenharmony_ci stmia r1!, {r3 - r5, ip} 538c2ecf20Sopenharmony_ci bpl .Linsw_8_lp 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci.Lno_insw_8: tst r2, #4 568c2ecf20Sopenharmony_ci beq .Lno_insw_4 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci ldrh r3, [r0] 598c2ecf20Sopenharmony_ci ldrh r4, [r0] 608c2ecf20Sopenharmony_ci pack r3, r3, r4 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci ldrh r4, [r0] 638c2ecf20Sopenharmony_ci ldrh ip, [r0] 648c2ecf20Sopenharmony_ci pack r4, r4, ip 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci stmia r1!, {r3, r4} 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci.Lno_insw_4: movs r2, r2, lsl #31 698c2ecf20Sopenharmony_ci bcc .Lno_insw_2 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci ldrh r3, [r0] 728c2ecf20Sopenharmony_ci ldrh ip, [r0] 738c2ecf20Sopenharmony_ci pack r3, r3, ip 748c2ecf20Sopenharmony_ci str r3, [r1], #4 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci.Lno_insw_2: ldrhne r3, [r0] 778c2ecf20Sopenharmony_ci strhne r3, [r1] 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci ldmfd sp!, {r4, r5, pc} 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci#ifdef __ARMEB__ 828c2ecf20Sopenharmony_ci#define _BE_ONLY_(code...) code 838c2ecf20Sopenharmony_ci#define _LE_ONLY_(code...) 848c2ecf20Sopenharmony_ci#define push_hbyte0 lsr #8 858c2ecf20Sopenharmony_ci#define pull_hbyte1 lsl #24 868c2ecf20Sopenharmony_ci#else 878c2ecf20Sopenharmony_ci#define _BE_ONLY_(code...) 888c2ecf20Sopenharmony_ci#define _LE_ONLY_(code...) code 898c2ecf20Sopenharmony_ci#define push_hbyte0 lsl #24 908c2ecf20Sopenharmony_ci#define pull_hbyte1 lsr #8 918c2ecf20Sopenharmony_ci#endif 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci.Linsw_noalign: stmfd sp!, {r4, lr} 948c2ecf20Sopenharmony_ci ldrbcc ip, [r1, #-1]! 958c2ecf20Sopenharmony_ci bcc 1f 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci ldrh ip, [r0] 988c2ecf20Sopenharmony_ci sub r2, r2, #1 998c2ecf20Sopenharmony_ci _BE_ONLY_( mov ip, ip, ror #8 ) 1008c2ecf20Sopenharmony_ci strb ip, [r1], #1 1018c2ecf20Sopenharmony_ci _LE_ONLY_( mov ip, ip, lsr #8 ) 1028c2ecf20Sopenharmony_ci _BE_ONLY_( mov ip, ip, lsr #24 ) 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci1: subs r2, r2, #2 1058c2ecf20Sopenharmony_ci bmi 3f 1068c2ecf20Sopenharmony_ci _BE_ONLY_( mov ip, ip, lsl #24 ) 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci2: ldrh r3, [r0] 1098c2ecf20Sopenharmony_ci ldrh r4, [r0] 1108c2ecf20Sopenharmony_ci subs r2, r2, #2 1118c2ecf20Sopenharmony_ci orr ip, ip, r3, lsl #8 1128c2ecf20Sopenharmony_ci orr ip, ip, r4, push_hbyte0 1138c2ecf20Sopenharmony_ci str ip, [r1], #4 1148c2ecf20Sopenharmony_ci mov ip, r4, pull_hbyte1 1158c2ecf20Sopenharmony_ci bpl 2b 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci _BE_ONLY_( mov ip, ip, lsr #24 ) 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci3: tst r2, #1 1208c2ecf20Sopenharmony_ci strb ip, [r1], #1 1218c2ecf20Sopenharmony_ci ldrhne ip, [r0] 1228c2ecf20Sopenharmony_ci _BE_ONLY_( movne ip, ip, ror #8 ) 1238c2ecf20Sopenharmony_ci strbne ip, [r1], #1 1248c2ecf20Sopenharmony_ci _LE_ONLY_( movne ip, ip, lsr #8 ) 1258c2ecf20Sopenharmony_ci _BE_ONLY_( movne ip, ip, lsr #24 ) 1268c2ecf20Sopenharmony_ci strbne ip, [r1] 1278c2ecf20Sopenharmony_ci ldmfd sp!, {r4, pc} 1288c2ecf20Sopenharmony_ciENDPROC(__raw_readsw) 129