]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/mips/strcpy.s
sdiahci, sdodin: avoid calling kproc() while holding ilock()
[plan9front.git] / sys / src / libc / mips / strcpy.s
1 TEXT    strcpy(SB), $0
2
3         MOVW    s2+4(FP),R2             /* R2 is from pointer */
4         MOVW    R1, R3                  /* R3 is to pointer */
5
6 /*
7  * align 'from' pointer
8  */
9 l1:
10         AND     $3, R2, R5
11         ADDU    $1, R2
12         BEQ     R5, l2
13         MOVB    -1(R2), R5
14         ADDU    $1, R3
15         MOVB    R5, -1(R3)
16         BNE     R5, l1
17         RET
18
19 /*
20  * test if 'to' is also alligned
21  */
22 l2:
23         AND     $3,R3, R5
24         BEQ     R5, l4
25
26 /*
27  * copy 4 at a time, 'to' not aligned
28  */
29 l3:
30         MOVW    -1(R2), R4
31         ADD     $4, R2
32         ADD     $4, R3
33         SRL     $24,R4, R5
34         MOVB    R5, -4(R3)
35         BEQ     R5, out
36
37         SRL     $16,R4, R5
38         AND     $0xff, R5
39         MOVB    R5, -3(R3)
40         BEQ     R5, out
41
42         SRL     $8,R4, R5
43         AND     $0xff, R5
44         MOVB    R5, -2(R3)
45         BEQ     R5, out
46
47         AND     $0xff,R4, R5
48         MOVB    R5, -1(R3)
49         BNE     R5, l3
50
51 out:
52         RET
53
54 /*
55  * word at a time both aligned
56  */
57 l4:
58         MOVW    $0xff000000, R7
59         MOVW    $0x00ff0000, R8
60
61 l5:
62         ADDU    $4, R3
63         MOVW    -1(R2), R4      /* fetch */
64
65         ADDU    $4, R2
66         AND     R7,R4, R5       /* is it byte 0 */
67         AND     R8,R4, R6       /* is it byte 1 */
68         BEQ     R5, b0
69
70         AND     $0xff00,R4, R5  /* is it byte 2 */
71         BEQ     R6, b1
72
73         AND     $0xff,R4, R6    /* is it byte 3 */
74         BEQ     R5, b2
75
76         MOVW    R4, -4(R3)      /* store */
77         BNE     R6, l5
78         JMP     out
79
80 b0:
81         MOVB    $0, -4(R3)
82         JMP     out
83
84 b1:
85         SRL     $24, R4
86         MOVB    R4, -4(R3)
87         MOVB    $0, -3(R3)
88         JMP     out
89
90 b2:
91         SRL     $24,R4, R5
92         MOVB    R5, -4(R3)
93         SRL     $16, R4
94         MOVB    R4, -3(R3)
95         MOVB    $0, -2(R3)
96         JMP     out