1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * linux/arch/arm/lib/io-readsw-armv4.S 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 1995-2000 Russell King 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun#include <linux/linkage.h> 8*4882a593Smuzhiyun#include <asm/assembler.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun .macro pack, rd, hw1, hw2 11*4882a593Smuzhiyun#ifndef __ARMEB__ 12*4882a593Smuzhiyun orr \rd, \hw1, \hw2, lsl #16 13*4882a593Smuzhiyun#else 14*4882a593Smuzhiyun orr \rd, \hw2, \hw1, lsl #16 15*4882a593Smuzhiyun#endif 16*4882a593Smuzhiyun .endm 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun.Linsw_align: movs ip, r1, lsl #31 19*4882a593Smuzhiyun bne .Linsw_noalign 20*4882a593Smuzhiyun ldrh ip, [r0] 21*4882a593Smuzhiyun sub r2, r2, #1 22*4882a593Smuzhiyun strh ip, [r1], #2 23*4882a593Smuzhiyun 24*4882a593SmuzhiyunENTRY(__raw_readsw) 25*4882a593Smuzhiyun teq r2, #0 26*4882a593Smuzhiyun reteq lr 27*4882a593Smuzhiyun tst r1, #3 28*4882a593Smuzhiyun bne .Linsw_align 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun stmfd sp!, {r4, r5, lr} 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun subs r2, r2, #8 33*4882a593Smuzhiyun bmi .Lno_insw_8 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun.Linsw_8_lp: ldrh r3, [r0] 36*4882a593Smuzhiyun ldrh r4, [r0] 37*4882a593Smuzhiyun pack r3, r3, r4 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun ldrh r4, [r0] 40*4882a593Smuzhiyun ldrh r5, [r0] 41*4882a593Smuzhiyun pack r4, r4, r5 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun ldrh r5, [r0] 44*4882a593Smuzhiyun ldrh ip, [r0] 45*4882a593Smuzhiyun pack r5, r5, ip 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun ldrh ip, [r0] 48*4882a593Smuzhiyun ldrh lr, [r0] 49*4882a593Smuzhiyun pack ip, ip, lr 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun subs r2, r2, #8 52*4882a593Smuzhiyun stmia r1!, {r3 - r5, ip} 53*4882a593Smuzhiyun bpl .Linsw_8_lp 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun.Lno_insw_8: tst r2, #4 56*4882a593Smuzhiyun beq .Lno_insw_4 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun ldrh r3, [r0] 59*4882a593Smuzhiyun ldrh r4, [r0] 60*4882a593Smuzhiyun pack r3, r3, r4 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun ldrh r4, [r0] 63*4882a593Smuzhiyun ldrh ip, [r0] 64*4882a593Smuzhiyun pack r4, r4, ip 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun stmia r1!, {r3, r4} 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun.Lno_insw_4: movs r2, r2, lsl #31 69*4882a593Smuzhiyun bcc .Lno_insw_2 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun ldrh r3, [r0] 72*4882a593Smuzhiyun ldrh ip, [r0] 73*4882a593Smuzhiyun pack r3, r3, ip 74*4882a593Smuzhiyun str r3, [r1], #4 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun.Lno_insw_2: ldrhne r3, [r0] 77*4882a593Smuzhiyun strhne r3, [r1] 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun ldmfd sp!, {r4, r5, pc} 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun#ifdef __ARMEB__ 82*4882a593Smuzhiyun#define _BE_ONLY_(code...) code 83*4882a593Smuzhiyun#define _LE_ONLY_(code...) 84*4882a593Smuzhiyun#define push_hbyte0 lsr #8 85*4882a593Smuzhiyun#define pull_hbyte1 lsl #24 86*4882a593Smuzhiyun#else 87*4882a593Smuzhiyun#define _BE_ONLY_(code...) 88*4882a593Smuzhiyun#define _LE_ONLY_(code...) code 89*4882a593Smuzhiyun#define push_hbyte0 lsl #24 90*4882a593Smuzhiyun#define pull_hbyte1 lsr #8 91*4882a593Smuzhiyun#endif 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun.Linsw_noalign: stmfd sp!, {r4, lr} 94*4882a593Smuzhiyun ldrbcc ip, [r1, #-1]! 95*4882a593Smuzhiyun bcc 1f 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun ldrh ip, [r0] 98*4882a593Smuzhiyun sub r2, r2, #1 99*4882a593Smuzhiyun _BE_ONLY_( mov ip, ip, ror #8 ) 100*4882a593Smuzhiyun strb ip, [r1], #1 101*4882a593Smuzhiyun _LE_ONLY_( mov ip, ip, lsr #8 ) 102*4882a593Smuzhiyun _BE_ONLY_( mov ip, ip, lsr #24 ) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun1: subs r2, r2, #2 105*4882a593Smuzhiyun bmi 3f 106*4882a593Smuzhiyun _BE_ONLY_( mov ip, ip, lsl #24 ) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun2: ldrh r3, [r0] 109*4882a593Smuzhiyun ldrh r4, [r0] 110*4882a593Smuzhiyun subs r2, r2, #2 111*4882a593Smuzhiyun orr ip, ip, r3, lsl #8 112*4882a593Smuzhiyun orr ip, ip, r4, push_hbyte0 113*4882a593Smuzhiyun str ip, [r1], #4 114*4882a593Smuzhiyun mov ip, r4, pull_hbyte1 115*4882a593Smuzhiyun bpl 2b 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun _BE_ONLY_( mov ip, ip, lsr #24 ) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun3: tst r2, #1 120*4882a593Smuzhiyun strb ip, [r1], #1 121*4882a593Smuzhiyun ldrhne ip, [r0] 122*4882a593Smuzhiyun _BE_ONLY_( movne ip, ip, ror #8 ) 123*4882a593Smuzhiyun strbne ip, [r1], #1 124*4882a593Smuzhiyun _LE_ONLY_( movne ip, ip, lsr #8 ) 125*4882a593Smuzhiyun _BE_ONLY_( movne ip, ip, lsr #24 ) 126*4882a593Smuzhiyun strbne ip, [r1] 127*4882a593Smuzhiyun ldmfd sp!, {r4, pc} 128*4882a593SmuzhiyunENDPROC(__raw_readsw) 129