diff options
Diffstat (limited to 'libc/string/bfin/memcpy.S')
-rw-r--r-- | libc/string/bfin/memcpy.S | 74 |
1 files changed, 41 insertions, 33 deletions
diff --git a/libc/string/bfin/memcpy.S b/libc/string/bfin/memcpy.S index e7ba7048e..ae40cb244 100644 --- a/libc/string/bfin/memcpy.S +++ b/libc/string/bfin/memcpy.S @@ -1,5 +1,5 @@ /* memcpy.S - * Copyright (C) 2003, 2005, 2006 Analog Devices Inc., All Rights Reserved. + * Copyright (C) 2003-2007 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 @@ -9,6 +9,8 @@ * http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html */ +#include <sysdep.h> + /* void *memcpy(void *dest, const void *src, size_t n); * R0 = To Address (dest) (leave unchanged to form result) * R1 = From Address (src) @@ -21,54 +23,60 @@ .align 2 -.global _memcpy -.type _memcpy, STT_FUNC -_memcpy: +/* We have to bypass the libc-symbols.h machinery to make sure we get + * a weak symbol for memcpy (some crummy gcc tests want to redefine it). + */ +.global ___GI_memcpy +.type ___GI_memcpy, STT_FUNC +___GI_memcpy: [--SP] = P3; - P0 = R0; // P0 = To address - P3 = R1; // P3 = From Address - P2 = R2 ; // P2 = count + P0 = R0; /* P0 = To address */ + P3 = R1; /* P3 = From Address */ + P2 = R2; /* P2 = count */ CC = R2 <= 7(IU); - IF CC JUMP too_small; + IF CC JUMP .Ltoo_small; I0 = R1; - R3 = R1 | R0; // OR addresses together - R3 <<= 30; // check bottom two bits - CC = AZ; // AZ set if zero. - IF !CC JUMP bytes ; // Jump if addrs not aligned. - P1 = P2 >> 2; // count = n/4 + R3 = R1 | R0; /* OR addresses together */ + R3 <<= 30; /* check bottom two bits */ + CC = AZ; /* AZ set if zero. */ + IF !CC JUMP .Lbytes; /* Jump if addrs not aligned. */ + P1 = P2 >> 2; /* count = n/4 */ P1 += -1; R3 = 3; - R2 = R2 & R3; // remainder - P2 = R2; // set remainder + R2 = R2 & R3; /* remainder */ + P2 = R2; /* set remainder */ R1 = [I0++]; #if !defined(__WORKAROUND_AVOID_DAG1) - LSETUP (quad_loop , quad_loop) LC0=P1; -quad_loop: MNOP || [P0++] = R1 || R1 = [I0++]; + LSETUP (.Lquad_loop, .Lquad_loop) LC0=P1; +.Lquad_loop: MNOP || [P0++] = R1 || R1 = [I0++]; #else - LSETUP (quad_loop_s , quad_loop_e) LC0=P1; -quad_loop_s: [P0++] = R1; -quad_loop_e: R1 = [I0++]; + LSETUP (.Lquad_loop_s, .Lquad_loop_e) LC0=P1; +.Lquad_loop_s: [P0++] = R1; +.Lquad_loop_e: R1 = [I0++]; #endif [P0++] = R1; - CC = P2 == 0; // any remaining bytes? - P3 = I0; // Ammend P3 for remaining copy - IF !CC JUMP bytes; + CC = P2 == 0; /* any remaining bytes? */ + P3 = I0; /* Ammend P3 for remaining copy */ + IF !CC JUMP .Lbytes; P3 = [SP++]; RTS; -too_small: - CC = P2 == 0; //Check zero count - IF CC JUMP finished; // very unlikely +.Ltoo_small: + CC = P2 == 0; /* Check zero count */ + IF CC JUMP .Lfinished; /* very unlikely */ -bytes: - LSETUP (byte_loop_s , byte_loop_e) LC0=P2; -byte_loop_s: R1 = B[P3++](Z); -byte_loop_e: B[P0++] = R1; +.Lbytes: + LSETUP (.Lbyte_loop_s, .Lbyte_loop_e) LC0=P2; +.Lbyte_loop_s: R1 = B[P3++](Z); +.Lbyte_loop_e: B[P0++] = R1; -finished: +.Lfinished: P3 = [SP++]; + RTS; -.size _memcpy,.-_memcpy +.size ___GI_memcpy,.-___GI_memcpy -libc_hidden_def (memcpy) +.hidden ___GI_memcpy +.weak _memcpy +.set _memcpy,___GI_memcpy |