/* memset.S */ #include <asm/linkage.h> #if defined([31mCONFIG_CPU_H8300H[0m) .h8300h #endif #if defined([31mCONFIG_CPU_H8S[0m) .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([31mCONFIG_CPU_H8300H[0m) shlr.l er2 shlr.l er2 #endif #if defined([31mCONFIG_CPU_H8S[0m) 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 |