blob: 88487c8c4f2353f7f512bd6dbecb019e93e72004 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/arch/arm/lib/io-readsw-armv3.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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070012
Nicolas Pitrea9c48142005-11-11 21:51:48 +000013.Linsw_bad_alignment:
14 adr r0, .Linsw_bad_align_msg
Linus Torvalds1da177e2005-04-16 15:20:36 -070015 mov r2, lr
16 b panic
Nicolas Pitrea9c48142005-11-11 21:51:48 +000017.Linsw_bad_align_msg:
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 .asciz "insw: bad buffer alignment (0x%p, lr=0x%08lX)\n"
19 .align
20
Nicolas Pitrea9c48142005-11-11 21:51:48 +000021.Linsw_align: tst r1, #1
22 bne .Linsw_bad_alignment
Linus Torvalds1da177e2005-04-16 15:20:36 -070023
24 ldr r3, [r0]
25 strb r3, [r1], #1
26 mov r3, r3, lsr #8
27 strb r3, [r1], #1
28
29 subs r2, r2, #1
Russell King7999d8d2006-06-25 11:17:23 +010030 moveq pc, lr
Linus Torvalds1da177e2005-04-16 15:20:36 -070031
32ENTRY(__raw_readsw)
33 teq r2, #0 @ do we have to check for the zero len?
34 moveq pc, lr
35 tst r1, #3
Nicolas Pitrea9c48142005-11-11 21:51:48 +000036 bne .Linsw_align
Linus Torvalds1da177e2005-04-16 15:20:36 -070037
Nicolas Pitrea9c48142005-11-11 21:51:48 +000038.Linsw_aligned: mov ip, #0xff
Linus Torvalds1da177e2005-04-16 15:20:36 -070039 orr ip, ip, ip, lsl #8
40 stmfd sp!, {r4, r5, r6, lr}
41
42 subs r2, r2, #8
Nicolas Pitrea9c48142005-11-11 21:51:48 +000043 bmi .Lno_insw_8
Linus Torvalds1da177e2005-04-16 15:20:36 -070044
Nicolas Pitrea9c48142005-11-11 21:51:48 +000045.Linsw_8_lp: ldr r3, [r0]
Linus Torvalds1da177e2005-04-16 15:20:36 -070046 and r3, r3, ip
47 ldr r4, [r0]
48 orr r3, r3, r4, lsl #16
49
50 ldr r4, [r0]
51 and r4, r4, ip
52 ldr r5, [r0]
53 orr r4, r4, r5, lsl #16
54
55 ldr r5, [r0]
56 and r5, r5, ip
57 ldr r6, [r0]
58 orr r5, r5, r6, lsl #16
59
60 ldr r6, [r0]
61 and r6, r6, ip
62 ldr lr, [r0]
63 orr r6, r6, lr, lsl #16
64
65 stmia r1!, {r3 - r6}
66
67 subs r2, r2, #8
Nicolas Pitrea9c48142005-11-11 21:51:48 +000068 bpl .Linsw_8_lp
Linus Torvalds1da177e2005-04-16 15:20:36 -070069
70 tst r2, #7
Russell King1b93a712006-06-25 11:23:45 +010071 ldmeqfd sp!, {r4, r5, r6, pc}
Linus Torvalds1da177e2005-04-16 15:20:36 -070072
Nicolas Pitrea9c48142005-11-11 21:51:48 +000073.Lno_insw_8: tst r2, #4
74 beq .Lno_insw_4
Linus Torvalds1da177e2005-04-16 15:20:36 -070075
76 ldr r3, [r0]
77 and r3, r3, ip
78 ldr r4, [r0]
79 orr r3, r3, r4, lsl #16
80
81 ldr r4, [r0]
82 and r4, r4, ip
83 ldr r5, [r0]
84 orr r4, r4, r5, lsl #16
85
86 stmia r1!, {r3, r4}
87
Nicolas Pitrea9c48142005-11-11 21:51:48 +000088.Lno_insw_4: tst r2, #2
89 beq .Lno_insw_2
Linus Torvalds1da177e2005-04-16 15:20:36 -070090
91 ldr r3, [r0]
92 and r3, r3, ip
93 ldr r4, [r0]
94 orr r3, r3, r4, lsl #16
95
96 str r3, [r1], #4
97
Nicolas Pitrea9c48142005-11-11 21:51:48 +000098.Lno_insw_2: tst r2, #1
Linus Torvalds1da177e2005-04-16 15:20:36 -070099 ldrne r3, [r0]
100 strneb r3, [r1], #1
101 movne r3, r3, lsr #8
102 strneb r3, [r1]
103
Russell King1b93a712006-06-25 11:23:45 +0100104 ldmfd sp!, {r4, r5, r6, pc}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105
106