Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  linux/arch/arm/lib/io-writesb.S
0004  *
0005  *  Copyright (C) 1995-2000 Russell King
0006  */
0007 #include <linux/linkage.h>
0008 #include <asm/assembler.h>
0009 
0010         .macro  outword, rd
0011 #ifndef __ARMEB__
0012         strb    \rd, [r0]
0013         mov \rd, \rd, lsr #8
0014         strb    \rd, [r0]
0015         mov \rd, \rd, lsr #8
0016         strb    \rd, [r0]
0017         mov \rd, \rd, lsr #8
0018         strb    \rd, [r0]
0019 #else
0020         mov lr, \rd, lsr #24
0021         strb    lr, [r0]
0022         mov lr, \rd, lsr #16
0023         strb    lr, [r0]
0024         mov lr, \rd, lsr #8
0025         strb    lr, [r0]
0026         strb    \rd, [r0]
0027 #endif
0028         .endm
0029 
0030 .Loutsb_align:  rsb ip, ip, #4
0031         cmp ip, r2
0032         movgt   ip, r2
0033         cmp ip, #2
0034         ldrb    r3, [r1], #1
0035         strb    r3, [r0]
0036         ldrbge  r3, [r1], #1
0037         strbge  r3, [r0]
0038         ldrbgt  r3, [r1], #1
0039         strbgt  r3, [r0]
0040         subs    r2, r2, ip
0041         bne .Loutsb_aligned
0042 
0043 ENTRY(__raw_writesb)
0044         teq r2, #0      @ do we have to check for the zero len?
0045         reteq   lr
0046         ands    ip, r1, #3
0047         bne .Loutsb_align
0048 
0049 .Loutsb_aligned:
0050         stmfd   sp!, {r4, r5, lr}
0051 
0052         subs    r2, r2, #16
0053         bmi .Loutsb_no_16
0054 
0055 .Loutsb_16_lp:  ldmia   r1!, {r3, r4, r5, ip}
0056         outword r3
0057         outword r4
0058         outword r5
0059         outword ip
0060         subs    r2, r2, #16
0061         bpl .Loutsb_16_lp
0062 
0063         tst r2, #15
0064         ldmfdeq sp!, {r4, r5, pc}
0065 
0066 .Loutsb_no_16:  tst r2, #8
0067         beq .Loutsb_no_8
0068 
0069         ldmia   r1!, {r3, r4}
0070         outword r3
0071         outword r4
0072 
0073 .Loutsb_no_8:   tst r2, #4
0074         beq .Loutsb_no_4
0075 
0076         ldr r3, [r1], #4
0077         outword r3
0078 
0079 .Loutsb_no_4:   ands    r2, r2, #3
0080         ldmfdeq sp!, {r4, r5, pc}
0081 
0082         cmp r2, #2
0083         ldrb    r3, [r1], #1
0084         strb    r3, [r0]
0085         ldrbge  r3, [r1], #1
0086         strbge  r3, [r0]
0087         ldrbgt  r3, [r1]
0088         strbgt  r3, [r0]
0089 
0090         ldmfd   sp!, {r4, r5, pc}
0091 ENDPROC(__raw_writesb)