| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | /* memset.S * Copyright (C) 2003, 2005, 2006 Analog Devices Inc., All Rights Reserved. * * This file is subject to the terms and conditions of the GNU Library General * Public License. See the file "COPYING.LIB" in the main directory of this * archive for more details. * * Non-LGPL License also available as part of VisualDSP++ * http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html *//* void *memset(void *s, int c, size_t n); * R0 = address (s) (leave unchanged to form result) * R1 = filler byte (c) * R2 = count (n) * * Note: Favours word aligned data. */.text.align 2.global _memset.type _memset, STT_FUNC_memset:	P0 = R0 ;             // P0 = address	P2 = R2 ;             // P2 = count	R3 = R0 + R2;         // end	CC = R2 <= 7(IU);	IF CC JUMP  too_small;	R1 = R1.B (Z);        // R1 = fill char	R2 =  3;	R2 = R0 & R2;         // addr bottom two bits	CC =  R2 == 0;             // AZ set if zero.	IF !CC JUMP  force_align ;  // Jump if addr not aligned.aligned:	P1 = P2 >> 2;          // count = n/4	R2 = R1 <<  8;         // create quad filler	R2.L = R2.L + R1.L(NS);	R2.H = R2.L + R1.H(NS);	P2 = R3;	LSETUP (quad_loop , quad_loop) LC0=P1;quad_loop:	[P0++] = R2;	CC = P0 == P2;	IF !CC JUMP bytes_left;	RTS;bytes_left:	R2 = R3;         // end point	R3 = P0;         // current position	R2 = R2 - R3;    // bytes left	P2 = R2;too_small:	CC = P2 == 0;           //Check zero count	IF CC JUMP finished;    // Unusualbytes:       LSETUP (byte_loop , byte_loop) LC0=P2;byte_loop:   B[P0++] = R1;finished:	RTS;force_align:	CC = BITTST (R0, 0 );  // odd byte	R0 = 4;	R0 = R0 - R2;	P1 = R0;	R0 = P0;			// Recover return address	IF !CC JUMP skip1;	B[P0++] = R1;skip1:	CC = R2 <= 2;          // 2 bytes	P2 -= P1;              // reduce count	IF !CC JUMP aligned;	B[P0++] = R1;	B[P0++] = R1;	JUMP aligned;.size _memset,.-_memsetlibc_hidden_def (memset)
 |