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

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  *  linux/arch/arm/lib/io-readsl.S
   4  *
   5  *  Copyright (C) 1995-2000 Russell King
   6  */
   7 #include <linux/linkage.h>
   8 #include <asm/assembler.h>
   9 
  10 ENTRY(__raw_readsl)
  11                 teq     r2, #0          @ do we have to check for the zero len?
  12                 reteq   lr
  13                 ands    ip, r1, #3
  14                 bne     3f
  15 
  16                 subs    r2, r2, #4
  17                 bmi     2f
  18                 stmfd   sp!, {r4, lr}
  19 1:              ldr     r3, [r0, #0]
  20                 ldr     r4, [r0, #0]
  21                 ldr     ip, [r0, #0]
  22                 ldr     lr, [r0, #0]
  23                 subs    r2, r2, #4
  24                 stmia   r1!, {r3, r4, ip, lr}
  25                 bpl     1b
  26                 ldmfd   sp!, {r4, lr}
  27 2:              movs    r2, r2, lsl #31
  28                 ldrcs   r3, [r0, #0]
  29                 ldrcs   ip, [r0, #0]
  30                 stmiacs r1!, {r3, ip}
  31                 ldrne   r3, [r0, #0]
  32                 strne   r3, [r1, #0]
  33                 ret     lr
  34 
  35 3:              ldr     r3, [r0]
  36                 cmp     ip, #2
  37                 mov     ip, r3, get_byte_0
  38                 strb    ip, [r1], #1
  39                 bgt     6f
  40                 mov     ip, r3, get_byte_1
  41                 strb    ip, [r1], #1
  42                 beq     5f
  43                 mov     ip, r3, get_byte_2
  44                 strb    ip, [r1], #1
  45 
  46 4:              subs    r2, r2, #1
  47                 mov     ip, r3, lspull #24
  48                 ldrne   r3, [r0]
  49                 orrne   ip, ip, r3, lspush #8
  50                 strne   ip, [r1], #4
  51                 bne     4b
  52                 b       8f
  53 
  54 5:              subs    r2, r2, #1
  55                 mov     ip, r3, lspull #16
  56                 ldrne   r3, [r0]
  57                 orrne   ip, ip, r3, lspush #16
  58                 strne   ip, [r1], #4
  59                 bne     5b
  60                 b       7f
  61 
  62 6:              subs    r2, r2, #1
  63                 mov     ip, r3, lspull #8
  64                 ldrne   r3, [r0]
  65                 orrne   ip, ip, r3, lspush #24
  66                 strne   ip, [r1], #4
  67                 bne     6b
  68 
  69                 mov     r3, ip, get_byte_2
  70                 strb    r3, [r1, #2]
  71 7:              mov     r3, ip, get_byte_1
  72                 strb    r3, [r1, #1]
  73 8:              mov     r3, ip, get_byte_0
  74                 strb    r3, [r1, #0]
  75                 ret     lr
  76 ENDPROC(__raw_readsl)

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