18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/arm/lib/io-readsl.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_ciENTRY(__raw_readsl) 118c2ecf20Sopenharmony_ci teq r2, #0 @ do we have to check for the zero len? 128c2ecf20Sopenharmony_ci reteq lr 138c2ecf20Sopenharmony_ci ands ip, r1, #3 148c2ecf20Sopenharmony_ci bne 3f 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci subs r2, r2, #4 178c2ecf20Sopenharmony_ci bmi 2f 188c2ecf20Sopenharmony_ci stmfd sp!, {r4, lr} 198c2ecf20Sopenharmony_ci1: ldr r3, [r0, #0] 208c2ecf20Sopenharmony_ci ldr r4, [r0, #0] 218c2ecf20Sopenharmony_ci ldr ip, [r0, #0] 228c2ecf20Sopenharmony_ci ldr lr, [r0, #0] 238c2ecf20Sopenharmony_ci subs r2, r2, #4 248c2ecf20Sopenharmony_ci stmia r1!, {r3, r4, ip, lr} 258c2ecf20Sopenharmony_ci bpl 1b 268c2ecf20Sopenharmony_ci ldmfd sp!, {r4, lr} 278c2ecf20Sopenharmony_ci2: movs r2, r2, lsl #31 288c2ecf20Sopenharmony_ci ldrcs r3, [r0, #0] 298c2ecf20Sopenharmony_ci ldrcs ip, [r0, #0] 308c2ecf20Sopenharmony_ci stmiacs r1!, {r3, ip} 318c2ecf20Sopenharmony_ci ldrne r3, [r0, #0] 328c2ecf20Sopenharmony_ci strne r3, [r1, #0] 338c2ecf20Sopenharmony_ci ret lr 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci3: ldr r3, [r0] 368c2ecf20Sopenharmony_ci cmp ip, #2 378c2ecf20Sopenharmony_ci mov ip, r3, get_byte_0 388c2ecf20Sopenharmony_ci strb ip, [r1], #1 398c2ecf20Sopenharmony_ci bgt 6f 408c2ecf20Sopenharmony_ci mov ip, r3, get_byte_1 418c2ecf20Sopenharmony_ci strb ip, [r1], #1 428c2ecf20Sopenharmony_ci beq 5f 438c2ecf20Sopenharmony_ci mov ip, r3, get_byte_2 448c2ecf20Sopenharmony_ci strb ip, [r1], #1 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci4: subs r2, r2, #1 478c2ecf20Sopenharmony_ci mov ip, r3, lspull #24 488c2ecf20Sopenharmony_ci ldrne r3, [r0] 498c2ecf20Sopenharmony_ci orrne ip, ip, r3, lspush #8 508c2ecf20Sopenharmony_ci strne ip, [r1], #4 518c2ecf20Sopenharmony_ci bne 4b 528c2ecf20Sopenharmony_ci b 8f 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci5: subs r2, r2, #1 558c2ecf20Sopenharmony_ci mov ip, r3, lspull #16 568c2ecf20Sopenharmony_ci ldrne r3, [r0] 578c2ecf20Sopenharmony_ci orrne ip, ip, r3, lspush #16 588c2ecf20Sopenharmony_ci strne ip, [r1], #4 598c2ecf20Sopenharmony_ci bne 5b 608c2ecf20Sopenharmony_ci b 7f 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci6: subs r2, r2, #1 638c2ecf20Sopenharmony_ci mov ip, r3, lspull #8 648c2ecf20Sopenharmony_ci ldrne r3, [r0] 658c2ecf20Sopenharmony_ci orrne ip, ip, r3, lspush #24 668c2ecf20Sopenharmony_ci strne ip, [r1], #4 678c2ecf20Sopenharmony_ci bne 6b 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci mov r3, ip, get_byte_2 708c2ecf20Sopenharmony_ci strb r3, [r1, #2] 718c2ecf20Sopenharmony_ci7: mov r3, ip, get_byte_1 728c2ecf20Sopenharmony_ci strb r3, [r1, #1] 738c2ecf20Sopenharmony_ci8: mov r3, ip, get_byte_0 748c2ecf20Sopenharmony_ci strb r3, [r1, #0] 758c2ecf20Sopenharmony_ci ret lr 768c2ecf20Sopenharmony_ciENDPROC(__raw_readsl) 77