Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / machine / h8300 / memset.S
blobc92169c6966c936fe7c2d16e7be38d5e2ce1ee90
1 #include "setarch.h"
3 #include "defines.h"
5 #if defined (__H8300SX__)
7         .global _memset
8 _memset:
9         ; Use er3 is a temporary since er0 must remain unchanged on exit.
10         mov.l   er0,er3
12         ; Fill er1 with the byte to copy.
13         mov.b   r1l,r1h
14         mov.w   r1,e1
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
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
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
38 long_copy:
39         ; Copy longwords.
40         mov.l   er1,@er3+
41         sub     #4,LEN(r2)
42         bhs     long_copy
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+
51 words_done:
52         ; Copy a byte.
53         bld     #0,r2l
54         bcc     bytes_done
55         mov.b   r1l,@er3+
57 bytes_done:
58         rts
60 #else
62 ; A0P pointer to cursor
63 ; A1P thing to copy
64         .global _memset
66 _memset:
68 ;       MOVP    @(2/4,r7),A2P   ; dst
69 ;       MOVP    @(4/8,r7),A1    ; src thing
70 ;       MOVP    @(6/12,r7),A3P  ; len
72         MOVP    A2P,A2P
73         beq     quit
75         ; A3 points to the end of the area
76         MOVP    A0P,A3P
77         ADDP    A2P,A3P
79         ; see if we can do it in words
80         ; by oring in the start of the buffer to the end address
82         or      A0L,A2L
83         btst    #0,A2L
84         bne     byteloop
85         
86         ; we can do it a word at a time
88         mov.b   A1L,A1H 
90 wordloop:
91         mov.w   A1,@-A3P
92         CMPP    A3P,A0P
93         bne     wordloop
94 quit:   rts     
96 byteloop:
97         mov.b   A1L,@-A3P
98         CMPP    A3P,A0P
99         bne     byteloop
100         rts
102 #endif