Last change
on this file was
444,
checked in by satin@…, 6 years ago
|
add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc
|
File size:
1.6 KB
|
Line | |
---|
1 | #include "setarch.h" |
---|
2 | |
---|
3 | #include "defines.h" |
---|
4 | |
---|
5 | #if defined (__H8300SX__) |
---|
6 | |
---|
7 | .global _memset |
---|
8 | _memset: |
---|
9 | ; Use er3 is a temporary since er0 must remain unchanged on exit. |
---|
10 | mov.l er0,er3 |
---|
11 | |
---|
12 | ; Fill er1 with the byte to copy. |
---|
13 | mov.b r1l,r1h |
---|
14 | mov.w r1,e1 |
---|
15 | |
---|
16 | ; Account for any excess bytes and words that will be copied after |
---|
17 | ; the main loop. r2 >= 0 if there is a longword to copy. |
---|
18 | sub #4,LEN(r2) |
---|
19 | blo longs_done |
---|
20 | |
---|
21 | ; Copy one byte if doing so will make er3 word-aligned. |
---|
22 | ; This isn't needed for correctness but it makes the main loop |
---|
23 | ; slightly faster. |
---|
24 | bld #0,r3l |
---|
25 | bcc word_aligned |
---|
26 | mov.b r1l,@er3+ |
---|
27 | sub #1,LEN(r2) |
---|
28 | blo longs_done |
---|
29 | |
---|
30 | word_aligned: |
---|
31 | ; Likewise one word for longword alignment. |
---|
32 | bld #1,r3l |
---|
33 | bcc long_copy |
---|
34 | mov.w r1,@er3+ |
---|
35 | sub #2,LEN(r2) |
---|
36 | blo longs_done |
---|
37 | |
---|
38 | long_copy: |
---|
39 | ; Copy longwords. |
---|
40 | mov.l er1,@er3+ |
---|
41 | sub #4,LEN(r2) |
---|
42 | bhs long_copy |
---|
43 | |
---|
44 | longs_done: |
---|
45 | ; At this point, we need to copy r2 & 3 bytes. Copy a word |
---|
46 | ; if necessary. |
---|
47 | bld #1,r2l |
---|
48 | bcc words_done |
---|
49 | mov.w r1,@er3+ |
---|
50 | |
---|
51 | words_done: |
---|
52 | ; Copy a byte. |
---|
53 | bld #0,r2l |
---|
54 | bcc bytes_done |
---|
55 | mov.b r1l,@er3+ |
---|
56 | |
---|
57 | bytes_done: |
---|
58 | rts |
---|
59 | |
---|
60 | #else |
---|
61 | |
---|
62 | ; A0P pointer to cursor |
---|
63 | ; A1P thing to copy |
---|
64 | .global _memset |
---|
65 | |
---|
66 | _memset: |
---|
67 | |
---|
68 | ; MOVP @(2/4,r7),A2P ; dst |
---|
69 | ; MOVP @(4/8,r7),A1 ; src thing |
---|
70 | ; MOVP @(6/12,r7),A3P ; len |
---|
71 | |
---|
72 | MOVP A2P,A2P |
---|
73 | beq quit |
---|
74 | |
---|
75 | ; A3 points to the end of the area |
---|
76 | MOVP A0P,A3P |
---|
77 | ADDP A2P,A3P |
---|
78 | |
---|
79 | ; see if we can do it in words |
---|
80 | ; by oring in the start of the buffer to the end address |
---|
81 | |
---|
82 | or A0L,A2L |
---|
83 | btst #0,A2L |
---|
84 | bne byteloop |
---|
85 | |
---|
86 | ; we can do it a word at a time |
---|
87 | |
---|
88 | mov.b A1L,A1H |
---|
89 | |
---|
90 | wordloop: |
---|
91 | mov.w A1,@-A3P |
---|
92 | CMPP A3P,A0P |
---|
93 | bne wordloop |
---|
94 | quit: rts |
---|
95 | |
---|
96 | byteloop: |
---|
97 | mov.b A1L,@-A3P |
---|
98 | CMPP A3P,A0P |
---|
99 | bne byteloop |
---|
100 | rts |
---|
101 | |
---|
102 | #endif |
---|
Note: See
TracBrowser
for help on using the repository browser.