root/arch/arm/lib/io-writesb.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  *  linux/arch/arm/lib/io-writesb.S
   4  *
   5  *  Copyright (C) 1995-2000 Russell King
   6  */
   7 #include <linux/linkage.h>
   8 #include <asm/assembler.h>
   9 
  10                 .macro  outword, rd
  11 #ifndef __ARMEB__
  12                 strb    \rd, [r0]
  13                 mov     \rd, \rd, lsr #8
  14                 strb    \rd, [r0]
  15                 mov     \rd, \rd, lsr #8
  16                 strb    \rd, [r0]
  17                 mov     \rd, \rd, lsr #8
  18                 strb    \rd, [r0]
  19 #else
  20                 mov     lr, \rd, lsr #24
  21                 strb    lr, [r0]
  22                 mov     lr, \rd, lsr #16
  23                 strb    lr, [r0]
  24                 mov     lr, \rd, lsr #8
  25                 strb    lr, [r0]
  26                 strb    \rd, [r0]
  27 #endif
  28                 .endm
  29 
  30 .Loutsb_align:  rsb     ip, ip, #4
  31                 cmp     ip, r2
  32                 movgt   ip, r2
  33                 cmp     ip, #2
  34                 ldrb    r3, [r1], #1
  35                 strb    r3, [r0]
  36                 ldrbge  r3, [r1], #1
  37                 strbge  r3, [r0]
  38                 ldrbgt  r3, [r1], #1
  39                 strbgt  r3, [r0]
  40                 subs    r2, r2, ip
  41                 bne     .Loutsb_aligned
  42 
  43 ENTRY(__raw_writesb)
  44                 teq     r2, #0          @ do we have to check for the zero len?
  45                 reteq   lr
  46                 ands    ip, r1, #3
  47                 bne     .Loutsb_align
  48 
  49 .Loutsb_aligned:
  50                 stmfd   sp!, {r4, r5, lr}
  51 
  52                 subs    r2, r2, #16
  53                 bmi     .Loutsb_no_16
  54 
  55 .Loutsb_16_lp:  ldmia   r1!, {r3, r4, r5, ip}
  56                 outword r3
  57                 outword r4
  58                 outword r5
  59                 outword ip
  60                 subs    r2, r2, #16
  61                 bpl     .Loutsb_16_lp
  62 
  63                 tst     r2, #15
  64                 ldmfdeq sp!, {r4, r5, pc}
  65 
  66 .Loutsb_no_16:  tst     r2, #8
  67                 beq     .Loutsb_no_8
  68 
  69                 ldmia   r1!, {r3, r4}
  70                 outword r3
  71                 outword r4
  72 
  73 .Loutsb_no_8:   tst     r2, #4
  74                 beq     .Loutsb_no_4
  75 
  76                 ldr     r3, [r1], #4
  77                 outword r3
  78 
  79 .Loutsb_no_4:   ands    r2, r2, #3
  80                 ldmfdeq sp!, {r4, r5, pc}
  81 
  82                 cmp     r2, #2
  83                 ldrb    r3, [r1], #1
  84                 strb    r3, [r0]
  85                 ldrbge  r3, [r1], #1
  86                 strbge  r3, [r0]
  87                 ldrbgt  r3, [r1]
  88                 strbgt  r3, [r0]
  89 
  90                 ldmfd   sp!, {r4, r5, pc}
  91 ENDPROC(__raw_writesb)

/* [<][>][^][v][top][bottom][index][help] */