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 71