Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* memset.S */ |
2 | ||
3 | #include <asm/linkage.h> | |
4 | ||
5 | #if defined(__H8300H__) | |
6 | .h8300h | |
7 | #endif | |
8 | #if defined(__H8300S__) | |
9 | .h8300s | |
10 | #endif | |
11 | .text | |
12 | ||
db5ede6f | 13 | .global _memset |
1da177e4 LT |
14 | |
15 | ;;void *memset(*ptr, int c, size_t count) | |
16 | ;; ptr = er0 | |
17 | ;; c = er1(r1l) | |
18 | ;; count = er2 | |
db5ede6f | 19 | _memset: |
1da177e4 LT |
20 | btst #0,r0l |
21 | beq 2f | |
22 | ||
23 | ;; odd address | |
24 | 1: | |
25 | mov.b r1l,@er0 | |
26 | adds #1,er0 | |
27 | dec.l #1,er2 | |
28 | beq 6f | |
29 | ||
30 | ;; even address | |
31 | 2: | |
32 | mov.l er2,er3 | |
33 | cmp.l #4,er2 | |
34 | blo 4f | |
35 | ;; count>=4 -> count/4 | |
36 | #if defined(__H8300H__) | |
37 | shlr.l er2 | |
38 | shlr.l er2 | |
39 | #endif | |
40 | #if defined(__H8300S__) | |
41 | shlr.l #2,er2 | |
42 | #endif | |
43 | ;; byte -> long | |
44 | mov.b r1l,r1h | |
45 | mov.w r1,e1 | |
46 | 3: | |
47 | mov.l er1,@er0 | |
48 | adds #4,er0 | |
49 | dec.l #1,er2 | |
50 | bne 3b | |
51 | 4: | |
52 | ;; count % 4 | |
53 | and.b #3,r3l | |
54 | beq 6f | |
55 | 5: | |
56 | mov.b r1l,@er0 | |
57 | adds #1,er0 | |
58 | dec.b r3l | |
59 | bne 5b | |
60 | 6: | |
61 | rts |