diff options
Diffstat (limited to 'arch/blackfin/lib/strncpy.S')
-rw-r--r-- | arch/blackfin/lib/strncpy.S | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/arch/blackfin/lib/strncpy.S b/arch/blackfin/lib/strncpy.S new file mode 100644 index 000000000000..39fbbe6523e5 --- /dev/null +++ b/arch/blackfin/lib/strncpy.S @@ -0,0 +1,52 @@ +/* + * Copyright 2005-2010 Analog Devices Inc. + * + * Licensed under the ADI BSD license or the GPL-2 (or later) + */ + +#include <linux/linkage.h> + +/* void *strncpy(char *dest, const char *src, size_t n); + * R0 = address (dest) + * R1 = address (src) + * R2 = size + * Returns a pointer to the destination string dest + */ + +#ifdef CONFIG_STRNCPY_L1 +.section .l1.text +#else +.text +#endif + +.align 2 + +ENTRY(_strncpy) + CC = R2 == 0; + if CC JUMP 4f; + P0 = R0 ; /* dst*/ + P1 = R1 ; /* src*/ + +1: + R1 = B [P1++] (Z); + B [P0++] = R1; + CC = R1; + if ! cc jump 2f; + R2 += -1; + CC = R2 == 0; + if ! cc jump 1b (bp); + jump 4f; +2: + /* if src is shorter than n, we need to null pad bytes in dest */ + R1 = 0; +3: + R2 += -1; + CC = R2 == 0; + if cc jump 4f; + B [P0++] = R1; + jump 3b; + +4: + RTS; + +ENDPROC(_strncpy) |