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