1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
/*
* linux/arch/arm/lib/io-readsb.S
*
* Copyright (C) 1995-2000 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/hardware.h>
.outsw_bad_alignment:
adr r0, .outsw_bad_align_msg
mov r2, lr
b SYMBOL_NAME(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
ldrh r3, [r1], #2
strh r3, [r0]
subs r2, r2, #1
RETINSTR(moveq, pc, lr)
ENTRY(__arch_writesw)
tst r1, #3
bne .outsw_align
subs r2, r2, #8
bmi .no_outsw_8
stmfd sp!, {r4, r5, lr}
.outsw_8_lp: ldmia r1!, {r3, r4, r5, ip}
strh r3, [r0]
mov r3, r3, lsr #16
strh r3, [r0]
strh r4, [r0]
mov r4, r4, lsr #16
strh r4, [r0]
strh r5, [r0]
mov r5, r5, lsr #16
strh r5, [r0]
strh ip, [r0]
mov ip, ip, lsr #16
strh ip, [r0]
subs r2, r2, #8
bpl .outsw_8_lp
ldmfd sp!, {r4, r5, lr}
tst r2, #7
RETINSTR(moveq, pc, lr)
.no_outsw_8: tst r2, #4
ldmneia r1!, {r3, ip}
strneh r3, [r0]
movne r3, r3, lsr #16
strneh r3, [r0]
strneh ip, [r0]
movne ip, ip, lsr #16
strneh ip, [r0]
tst r2, #2
ldrne r3, [r1], #4
strneh r3, [r0]
movne r3, r3, lsr #16
strneh r3, [r0]
tst r2, #1
ldrneh r3, [r1]
strneh r3, [r0]
RETINSTR(mov, pc, lr)
|