1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /* memset.S */
- #include <asm/linkage.h>
- #if defined(CONFIG_CPU_H8300H)
- .h8300h
- #endif
- #if defined(CONFIG_CPU_H8S)
- .h8300s
- #endif
- .text
- .global memset
- .global clear_user
- ;;void *memset(*ptr, int c, size_t count)
- ;; ptr = er0
- ;; c = er1(r1l)
- ;; count = er2
- memset:
- btst #0,r0l
- beq 2f
- ;; odd address
- 1:
- mov.b r1l,@er0
- adds #1,er0
- dec.l #1,er2
- beq 6f
- ;; even address
- 2:
- mov.l er2,er3
- cmp.l #4,er2
- blo 4f
- ;; count>=4 -> count/4
- #if defined(CONFIG_CPU_H8300H)
- shlr.l er2
- shlr.l er2
- #endif
- #if defined(CONFIG_CPU_H8S)
- shlr.l #2,er2
- #endif
- ;; byte -> long
- mov.b r1l,r1h
- mov.w r1,e1
- 3:
- mov.l er1,@er0
- adds #4,er0
- dec.l #1,er2
- bne 3b
- 4:
- ;; count % 4
- and.b #3,r3l
- beq 6f
- 5:
- mov.b r1l,@er0
- adds #1,er0
- dec.b r3l
- bne 5b
- 6:
- rts
- clear_user:
- mov.l er1, er2
- sub.l er1, er1
- bra memset
- .end
|