~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/arm/lib/io-readsb.S

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  linux/arch/arm/lib/io-readsb.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
.Linsb_align:   rsb     ip, ip, #4
 
14
                cmp     ip, r2
 
15
                movgt   ip, r2
 
16
                cmp     ip, #2
 
17
                ldrb    r3, [r0]
 
18
                strb    r3, [r1], #1
 
19
                ldrgeb  r3, [r0]
 
20
                strgeb  r3, [r1], #1
 
21
                ldrgtb  r3, [r0]
 
22
                strgtb  r3, [r1], #1
 
23
                subs    r2, r2, ip
 
24
                bne     .Linsb_aligned
 
25
 
 
26
ENTRY(__raw_readsb)
 
27
                teq     r2, #0          @ do we have to check for the zero len?
 
28
                moveq   pc, lr
 
29
                ands    ip, r1, #3
 
30
                bne     .Linsb_align
 
31
 
 
32
.Linsb_aligned: stmfd   sp!, {r4 - r6, lr}
 
33
 
 
34
                subs    r2, r2, #16
 
35
                bmi     .Linsb_no_16
 
36
 
 
37
.Linsb_16_lp:   ldrb    r3, [r0]
 
38
                ldrb    r4, [r0]
 
39
                ldrb    r5, [r0]
 
40
                mov     r3, r3,     put_byte_0
 
41
                ldrb    r6, [r0]
 
42
                orr     r3, r3, r4, put_byte_1
 
43
                ldrb    r4, [r0]
 
44
                orr     r3, r3, r5, put_byte_2
 
45
                ldrb    r5, [r0]
 
46
                orr     r3, r3, r6, put_byte_3
 
47
                ldrb    r6, [r0]
 
48
                mov     r4, r4,     put_byte_0
 
49
                ldrb    ip, [r0]
 
50
                orr     r4, r4, r5, put_byte_1
 
51
                ldrb    r5, [r0]
 
52
                orr     r4, r4, r6, put_byte_2
 
53
                ldrb    r6, [r0]
 
54
                orr     r4, r4, ip, put_byte_3
 
55
                ldrb    ip, [r0]
 
56
                mov     r5, r5,     put_byte_0
 
57
                ldrb    lr, [r0]
 
58
                orr     r5, r5, r6, put_byte_1
 
59
                ldrb    r6, [r0]
 
60
                orr     r5, r5, ip, put_byte_2
 
61
                ldrb    ip, [r0]
 
62
                orr     r5, r5, lr, put_byte_3
 
63
                ldrb    lr, [r0]
 
64
                mov     r6, r6,     put_byte_0
 
65
                orr     r6, r6, ip, put_byte_1
 
66
                ldrb    ip, [r0]
 
67
                orr     r6, r6, lr, put_byte_2
 
68
                orr     r6, r6, ip, put_byte_3
 
69
                stmia   r1!, {r3 - r6}
 
70
 
 
71
                subs    r2, r2, #16
 
72
                bpl     .Linsb_16_lp
 
73
 
 
74
                tst     r2, #15
 
75
                ldmeqfd sp!, {r4 - r6, pc}
 
76
 
 
77
.Linsb_no_16:   tst     r2, #8
 
78
                beq     .Linsb_no_8
 
79
 
 
80
                ldrb    r3, [r0]
 
81
                ldrb    r4, [r0]
 
82
                ldrb    r5, [r0]
 
83
                mov     r3, r3,     put_byte_0
 
84
                ldrb    r6, [r0]
 
85
                orr     r3, r3, r4, put_byte_1
 
86
                ldrb    r4, [r0]
 
87
                orr     r3, r3, r5, put_byte_2
 
88
                ldrb    r5, [r0]
 
89
                orr     r3, r3, r6, put_byte_3
 
90
                ldrb    r6, [r0]
 
91
                mov     r4, r4,     put_byte_0
 
92
                ldrb    ip, [r0]
 
93
                orr     r4, r4, r5, put_byte_1
 
94
                orr     r4, r4, r6, put_byte_2
 
95
                orr     r4, r4, ip, put_byte_3
 
96
                stmia   r1!, {r3, r4}
 
97
 
 
98
.Linsb_no_8:    tst     r2, #4
 
99
                beq     .Linsb_no_4
 
100
 
 
101
                ldrb    r3, [r0]
 
102
                ldrb    r4, [r0]
 
103
                ldrb    r5, [r0]
 
104
                ldrb    r6, [r0]
 
105
                mov     r3, r3,     put_byte_0
 
106
                orr     r3, r3, r4, put_byte_1
 
107
                orr     r3, r3, r5, put_byte_2
 
108
                orr     r3, r3, r6, put_byte_3
 
109
                str     r3, [r1], #4
 
110
 
 
111
.Linsb_no_4:    ands    r2, r2, #3
 
112
                ldmeqfd sp!, {r4 - r6, pc}
 
113
 
 
114
                cmp     r2, #2
 
115
                ldrb    r3, [r0]
 
116
                strb    r3, [r1], #1
 
117
                ldrgeb  r3, [r0]
 
118
                strgeb  r3, [r1], #1
 
119
                ldrgtb  r3, [r0]
 
120
                strgtb  r3, [r1]
 
121
 
 
122
                ldmfd   sp!, {r4 - r6, pc}
 
123
ENDPROC(__raw_readsb)