1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /* memset.S */
- #include <asm/linkage.h>
- #if defined(__H8300H__)
- .h8300h
- #endif
- #if defined(__H8300S__)
- .h8300s
- #endif
- .text
- .global SYMBOL_NAME(memset)
- ;;void *memset(*ptr, int c, size_t count)
- ;; ptr = er0
- ;; c = er1(r1l)
- ;; count = er2
- SYMBOL_NAME_LABEL(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(__H8300H__)
- shlr.l er2
- shlr.l er2
- #endif
- #if defined(__H8300S__)
- 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
|