1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2006 by Jens Arnold
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
18 ****************************************************************************/
21 #define LBLOCKSIZE (sizeof(long)/2)
22 #define UNALIGNED(X) ((long)X & (sizeof(long) - 1))
23 #define TOO_SMALL(LEN) ((LEN) < LBLOCKSIZE)
25 void memset16(void *dst
, int val
, size_t len
)
27 #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
28 unsigned short *p
= (unsigned short *)dst
;
33 unsigned short *p
= (unsigned short *)dst
;
36 unsigned long *aligned_addr
;
38 if (!TOO_SMALL(len
) && !UNALIGNED(dst
))
40 aligned_addr
= (unsigned long *)dst
;
45 buffer
= (val
<< 16) | val
;
50 for (i
= 0; i
< LBLOCKSIZE
; i
++)
51 buffer
= (buffer
<< 16) | val
;
54 while (len
>= LBLOCKSIZE
*4)
56 *aligned_addr
++ = buffer
;
57 *aligned_addr
++ = buffer
;
58 *aligned_addr
++ = buffer
;
59 *aligned_addr
++ = buffer
;
63 while (len
>= LBLOCKSIZE
)
65 *aligned_addr
++ = buffer
;
69 p
= (unsigned short *)aligned_addr
;
74 #endif /* not PREFER_SIZE_OVER_SPEED */