GNU Linux-libre 4.14.266-gnu1
[releases.git] / arch / h8300 / lib / memset.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* memset.S */
3
4 #include <asm/linkage.h>
5
6 #if defined(CONFIG_CPU_H8300H)
7         .h8300h
8 #endif
9 #if defined(CONFIG_CPU_H8S)
10         .h8300s
11 #endif
12         .text
13
14 .global memset
15 .global clear_user
16
17 ;;void *memset(*ptr, int c, size_t count)
18 ;; ptr = er0
19 ;; c   = er1(r1l)
20 ;; count = er2
21 memset:
22         btst    #0,r0l
23         beq     2f
24
25         ;; odd address
26 1:
27         mov.b   r1l,@er0
28         adds    #1,er0
29         dec.l   #1,er2
30         beq     6f
31
32         ;; even address
33 2:
34         mov.l   er2,er3
35         cmp.l   #4,er2
36         blo     4f
37         ;; count>=4 -> count/4
38 #if defined(CONFIG_CPU_H8300H)
39         shlr.l  er2
40         shlr.l  er2
41 #endif
42 #if defined(CONFIG_CPU_H8S)
43         shlr.l  #2,er2
44 #endif
45         ;; byte -> long
46         mov.b   r1l,r1h
47         mov.w   r1,e1
48 3:
49         mov.l   er1,@er0
50         adds    #4,er0
51         dec.l   #1,er2
52         bne     3b
53 4:
54         ;; count % 4
55         and.b   #3,r3l
56         beq     6f
57 5:
58         mov.b   r1l,@er0
59         adds    #1,er0
60         dec.b   r3l
61         bne     5b
62 6:
63         rts
64
65 clear_user:
66         mov.l   er1, er2
67         sub.l   er1, er1
68         bra     memset
69
70         .end