Linux-2.6.12-rc2
[linux-2.6.git] / arch / h8300 / lib / memset.S
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
13 .global SYMBOL_NAME(memset)
14
15 ;;void *memset(*ptr, int c, size_t count)
16 ;; ptr = er0
17 ;; c   = er1(r1l)
18 ;; count = er2
19 SYMBOL_NAME_LABEL(memset)
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