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 _memset 14 15 ;;void *memset(*ptr, int c, size_t count) 16 ;; ptr = er0 17 ;; c = er1(r1l) 18 ;; count = er2 19 _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 62