Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / arch / arm / lib / io-writesw-armv4.S
index a4a444e..c8e85bd 100644 (file)
 #endif
                .endm
 
-.outsw_bad_alignment:
-               adr     r0, .outsw_bad_align_msg
-               mov     r2, lr
-               b       panic
-.outsw_bad_align_msg:
-               .asciz  "outsw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
-               .align
-
-.outsw_align:  tst     r1, #1
-               bne     .outsw_bad_alignment
+.Loutsw_align: movs    ip, r1, lsl #31
+               bne     .Loutsw_noalign
 
                ldrh    r3, [r1], #2
+               sub     r2, r2, #1
                strh    r3, [r0]
 
-               subs    r2, r2, #1
-               RETINSTR(moveq, pc, lr)
-
 ENTRY(__raw_writesw)
-               teq     r2, #0          @ do we have to check for the zero len?
+               teq     r2, #0
                moveq   pc, lr
-               tst     r1, #3
-               bne     .outsw_align
+               ands    r3, r1, #3
+               bne     .Loutsw_align
 
                stmfd   sp!, {r4, r5, lr}
 
                subs    r2, r2, #8
-               bmi     .no_outsw_8
+               bmi     .Lno_outsw_8
 
-.outsw_8_lp:   ldmia   r1!, {r3, r4, r5, ip}
+.Loutsw_8_lp:  ldmia   r1!, {r3, r4, r5, ip}
+               subs    r2, r2, #8
                outword r3
                outword r4
                outword r5
                outword ip
-               subs    r2, r2, #8
-               bpl     .outsw_8_lp
-
-               tst     r2, #7
-               LOADREGS(eqfd, sp!, {r4, r5, pc})
+               bpl     .Loutsw_8_lp
 
-.no_outsw_8:   tst     r2, #4
-               beq     .no_outsw_4
+.Lno_outsw_8:  tst     r2, #4
+               beq     .Lno_outsw_4
 
                ldmia   r1!, {r3, ip}
                outword r3
                outword ip
 
-.no_outsw_4:   tst     r2, #2
-               beq     .no_outsw_2
+.Lno_outsw_4:  movs    r2, r2, lsl #31
+               bcc     .Lno_outsw_2
 
                ldr     r3, [r1], #4
                outword r3
 
-.no_outsw_2:   tst     r2, #1
-               ldrneh  r3, [r1]
+.Lno_outsw_2:  ldrneh  r3, [r1]
                strneh  r3, [r0]
 
-               LOADREGS(fd, sp!, {r4, r5, pc})
+               ldmfd   sp!, {r4, r5, pc}
+
+#ifdef __ARMEB__
+#define pull_hbyte0    lsl #8
+#define push_hbyte1    lsr #24
+#else
+#define pull_hbyte0    lsr #24
+#define push_hbyte1    lsl #8
+#endif
+
+.Loutsw_noalign:
+               ldr     r3, [r1, -r3]!
+               subcs   r2, r2, #1
+               bcs     2f
+               subs    r2, r2, #2
+               bmi     3f
+
+1:             mov     ip, r3, lsr #8
+               strh    ip, [r0]
+2:             mov     ip, r3, pull_hbyte0
+               ldr     r3, [r1, #4]!
+               subs    r2, r2, #2
+               orr     ip, ip, r3, push_hbyte1
+               strh    ip, [r0]
+               bpl     1b
+
+               tst     r2, #1
+3:             movne   ip, r3, lsr #8
+               strneh  ip, [r0]
+               mov     pc, lr