18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 38c2ecf20Sopenharmony_ci * License. See the file COPYING in the main directory of this archive 48c2ecf20Sopenharmony_ci * for more details. 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/module.h> 88c2ecf20Sopenharmony_ci#include <linux/string.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_civoid *memset(void *s, int c, size_t count) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci void *xs = s; 138c2ecf20Sopenharmony_ci size_t temp; 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci if (!count) 168c2ecf20Sopenharmony_ci return xs; 178c2ecf20Sopenharmony_ci c &= 0xff; 188c2ecf20Sopenharmony_ci c |= c << 8; 198c2ecf20Sopenharmony_ci c |= c << 16; 208c2ecf20Sopenharmony_ci if ((long)s & 1) { 218c2ecf20Sopenharmony_ci char *cs = s; 228c2ecf20Sopenharmony_ci *cs++ = c; 238c2ecf20Sopenharmony_ci s = cs; 248c2ecf20Sopenharmony_ci count--; 258c2ecf20Sopenharmony_ci } 268c2ecf20Sopenharmony_ci if (count > 2 && (long)s & 2) { 278c2ecf20Sopenharmony_ci short *ss = s; 288c2ecf20Sopenharmony_ci *ss++ = c; 298c2ecf20Sopenharmony_ci s = ss; 308c2ecf20Sopenharmony_ci count -= 2; 318c2ecf20Sopenharmony_ci } 328c2ecf20Sopenharmony_ci temp = count >> 2; 338c2ecf20Sopenharmony_ci if (temp) { 348c2ecf20Sopenharmony_ci long *ls = s; 358c2ecf20Sopenharmony_ci#if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE) 368c2ecf20Sopenharmony_ci for (; temp; temp--) 378c2ecf20Sopenharmony_ci *ls++ = c; 388c2ecf20Sopenharmony_ci#else 398c2ecf20Sopenharmony_ci size_t temp1; 408c2ecf20Sopenharmony_ci asm volatile ( 418c2ecf20Sopenharmony_ci " movel %1,%2\n" 428c2ecf20Sopenharmony_ci " andw #7,%2\n" 438c2ecf20Sopenharmony_ci " lsrl #3,%1\n" 448c2ecf20Sopenharmony_ci " negw %2\n" 458c2ecf20Sopenharmony_ci " jmp %%pc@(2f,%2:w:2)\n" 468c2ecf20Sopenharmony_ci "1: movel %3,%0@+\n" 478c2ecf20Sopenharmony_ci " movel %3,%0@+\n" 488c2ecf20Sopenharmony_ci " movel %3,%0@+\n" 498c2ecf20Sopenharmony_ci " movel %3,%0@+\n" 508c2ecf20Sopenharmony_ci " movel %3,%0@+\n" 518c2ecf20Sopenharmony_ci " movel %3,%0@+\n" 528c2ecf20Sopenharmony_ci " movel %3,%0@+\n" 538c2ecf20Sopenharmony_ci " movel %3,%0@+\n" 548c2ecf20Sopenharmony_ci "2: dbra %1,1b\n" 558c2ecf20Sopenharmony_ci " clrw %1\n" 568c2ecf20Sopenharmony_ci " subql #1,%1\n" 578c2ecf20Sopenharmony_ci " jpl 1b" 588c2ecf20Sopenharmony_ci : "=a" (ls), "=d" (temp), "=&d" (temp1) 598c2ecf20Sopenharmony_ci : "d" (c), "0" (ls), "1" (temp)); 608c2ecf20Sopenharmony_ci#endif 618c2ecf20Sopenharmony_ci s = ls; 628c2ecf20Sopenharmony_ci } 638c2ecf20Sopenharmony_ci if (count & 2) { 648c2ecf20Sopenharmony_ci short *ss = s; 658c2ecf20Sopenharmony_ci *ss++ = c; 668c2ecf20Sopenharmony_ci s = ss; 678c2ecf20Sopenharmony_ci } 688c2ecf20Sopenharmony_ci if (count & 1) { 698c2ecf20Sopenharmony_ci char *cs = s; 708c2ecf20Sopenharmony_ci *cs = c; 718c2ecf20Sopenharmony_ci } 728c2ecf20Sopenharmony_ci return xs; 738c2ecf20Sopenharmony_ci} 748c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memset); 75