source: trunk/libs/newlib/src/newlib/libc/machine/h8300/memset.S @ 444

Last change on this file since 444 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
30word_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
38long_copy:
39        ; Copy longwords.
40        mov.l   er1,@er3+
41        sub     #4,LEN(r2)
42        bhs     long_copy
43
44longs_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
51words_done:
52        ; Copy a byte.
53        bld     #0,r2l
54        bcc     bytes_done
55        mov.b   r1l,@er3+
56
57bytes_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
90wordloop:
91        mov.w   A1,@-A3P
92        CMPP    A3P,A0P
93        bne     wordloop
94quit:   rts     
95
96byteloop:
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.