linux/arch/arm/lib/io-writesw-armv4.S
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/lib/io-writesw-armv4.S
   3 *
   4 *  Copyright (C) 1995-2000 Russell King
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10#include <linux/linkage.h>
  11#include <asm/assembler.h>
  12
  13                .macro  outword, rd
  14#ifndef __ARMEB__
  15                strh    \rd, [r0]
  16                mov     \rd, \rd, lsr #16
  17                strh    \rd, [r0]
  18#else
  19                mov     lr, \rd, lsr #16
  20                strh    lr, [r0]
  21                strh    \rd, [r0]
  22#endif
  23                .endm
  24
  25.Loutsw_align:  movs    ip, r1, lsl #31
  26                bne     .Loutsw_noalign
  27
  28                ldrh    r3, [r1], #2
  29                sub     r2, r2, #1
  30                strh    r3, [r0]
  31
  32ENTRY(__raw_writesw)
  33                teq     r2, #0
  34                reteq   lr
  35                ands    r3, r1, #3
  36                bne     .Loutsw_align
  37
  38                stmfd   sp!, {r4, r5, lr}
  39
  40                subs    r2, r2, #8
  41                bmi     .Lno_outsw_8
  42
  43.Loutsw_8_lp:   ldmia   r1!, {r3, r4, r5, ip}
  44                subs    r2, r2, #8
  45                outword r3
  46                outword r4
  47                outword r5
  48                outword ip
  49                bpl     .Loutsw_8_lp
  50
  51.Lno_outsw_8:   tst     r2, #4
  52                beq     .Lno_outsw_4
  53
  54                ldmia   r1!, {r3, ip}
  55                outword r3
  56                outword ip
  57
  58.Lno_outsw_4:   movs    r2, r2, lsl #31
  59                bcc     .Lno_outsw_2
  60
  61                ldr     r3, [r1], #4
  62                outword r3
  63
  64.Lno_outsw_2:   ldrneh  r3, [r1]
  65                strneh  r3, [r0]
  66
  67                ldmfd   sp!, {r4, r5, pc}
  68
  69#ifdef __ARMEB__
  70#define pull_hbyte0     lsl #8
  71#define push_hbyte1     lsr #24
  72#else
  73#define pull_hbyte0     lsr #24
  74#define push_hbyte1     lsl #8
  75#endif
  76
  77.Loutsw_noalign:
  78 ARM(           ldr     r3, [r1, -r3]!  )
  79 THUMB(         rsb     r3, r3, #0      )
  80 THUMB(         ldr     r3, [r1, r3]    )
  81 THUMB(         sub     r1, r3          )
  82                subcs   r2, r2, #1
  83                bcs     2f
  84                subs    r2, r2, #2
  85                bmi     3f
  86
  871:              mov     ip, r3, lsr #8
  88                strh    ip, [r0]
  892:              mov     ip, r3, pull_hbyte0
  90                ldr     r3, [r1, #4]!
  91                subs    r2, r2, #2
  92                orr     ip, ip, r3, push_hbyte1
  93                strh    ip, [r0]
  94                bpl     1b
  95
  96                tst     r2, #1
  973:              movne   ip, r3, lsr #8
  98                strneh  ip, [r0]
  99                ret     lr
 100ENDPROC(__raw_writesw)
 101