]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/arm/strcpy.s
libc/arm: implement _tas() with LDREX/STREX, execute memory barrier on smp systems...
[plan9front.git] / sys / src / libc / arm / strcpy.s
1 TEXT strcpy(SB), $0
2         MOVW            R0, to+0(FP)    /* need to save for return value */
3         MOVW            from+4(FP), R1
4         MOVW            $0xFF, R2       /* mask */
5
6 salign:                                 /* align source on 4 */
7         AND.S           $3, R1, R3
8         BEQ             dalign
9         MOVBU.P         1(R1), R3       /* implicit write back */
10         TST             R3, R2
11         MOVBU.P         R3, 1(R0)       /* implicit write back */
12         BNE             salign
13         B               return
14
15 dalign:                         /* is destination now aligned? */
16         AND.S           $3, R0, R3
17         BNE             uloop
18
19 aloop:
20         MOVW.P          4(R1), R4       /* read 4, write 4 */
21         TST             R4, R2          /* AND.S R3, R2, Rx */
22         TST.NE          R4>>8, R2
23         TST.NE          R4>>16, R2
24         TST.NE          R4>>24, R2
25         BEQ             tail
26         MOVW.P          R4, 4(R0)
27         B               aloop
28
29 uloop:
30         MOVW.P          4(R1), R4       /* read 4, write 1,1,1,1 */
31
32 tail:
33         AND.S           R4, R2, R3
34         MOVBU.NE.P      R3, 1(R0)
35         AND.NE.S        R4>>8, R2, R3
36         MOVBU.NE.P      R3, 1(R0)
37         AND.NE.S        R4>>16, R2, R3
38         MOVBU.NE.P      R3, 1(R0)
39         AND.NE.S        R4>>24, R2, R3
40         MOVBU.P         R3, 1(R0)
41         BNE             uloop
42         B               return
43
44 return:
45         MOVW            to+0(FP), R0
46         RET