1/* $Id: memset.S,v 1.1 2000/04/14 16:49:01 mjd Exp $ 2 * 3 * "memset" implementation of SuperH 4 * 5 * Copyright (C) 1999 Niibe Yutaka 6 * 7 */ 8 9/* 10 * void *memset(void *s, int c, size_t n); 11 */ 12 13#include <linux/linkage.h> 14 15ENTRY(memset) 16 tst r6,r6 17 bt/s 5f ! if n=0, do nothing 18 add r6,r4 19 mov #12,r0 20 cmp/gt r6,r0 21 bt/s 4f ! if it's too small, set a byte at once 22 mov r4,r0 23 and #3,r0 24 cmp/eq #0,r0 25 bt/s 2f ! It's aligned 26 sub r0,r6 271: 28 dt r0 29 bf/s 1b 30 mov.b r5,@-r4 312: ! make VVVV 32 extu.b r5,r5 33 swap.b r5,r0 ! V0 34 or r0,r5 ! VV 35 swap.w r5,r0 ! VV00 36 or r0,r5 ! VVVV 37 ! 38 mov r6,r0 39 shlr2 r0 40 shlr r0 ! r0 = r6 >> 3 413: 42 dt r0 43 mov.l r5,@-r4 ! set 8-byte at once 44 bf/s 3b 45 mov.l r5,@-r4 46 ! 47 mov #7,r0 48 and r0,r6 49 tst r6,r6 50 bt 5f 51 ! fill bytes 524: 53 dt r6 54 bf/s 4b 55 mov.b r5,@-r4 565: 57 rts 58 mov r4,r0 59