1479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz/*
2479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz * Copyright 2005-2010 Analog Devices Inc.
3479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz *
4479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz * Licensed under the ADI BSD license or the GPL-2 (or later)
5479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz */
6479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
7479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz#include <linux/linkage.h>
8479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
9479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz/* void *strncpy(char *s1, const char *s2, size_t n);
10479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz * R0 = address (dest)
11479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz * R1 = address (src)
12479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz * R2 = size (n)
13479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz * Returns a pointer to the destination string dest
14479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz */
15479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
16479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz#ifdef CONFIG_STRNCMP_L1
17479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz.section .l1.text
18479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz#else
19479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz.text
20479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz#endif
21479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
22479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz.align 2
23479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
24479ba6035862a9c08ce4351c7fff8926fde4ede5Robin GetzENTRY(_strncmp)
25479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	CC = R2 == 0;
26479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	if CC JUMP 5f;
27479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
28479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	P0 = R0 ;       /* s1 */
29479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	P1 = R1 ;       /* s2 */
30479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz1:
31479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	R0 = B[P0++] (Z);      /* get *s1 */
32479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	R1 = B[P1++] (Z);      /* get *s2 */
33479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	CC = R0 == R1;         /* compare a byte */
34479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	if ! cc jump 3f;       /* not equal, break out */
35479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	CC = R0;               /* at end of s1? */
36479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	if ! cc jump 4f;       /* yes, all done */
37479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	R2 += -1;              /* no, adjust count */
38479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	CC = R2 == 0;
39479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	if ! cc jump 1b (bp);  /* more to do, keep going */
40479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz2:
41479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	R0 = 0;                /* strings are equal */
42479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	jump.s 4f;
43479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz3:
44479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	R0 = R0 - R1;          /* *s1 - *s2 */
45479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz4:
46479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	RTS;
47479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
48479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz5:
49479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	R0 = 0;
50479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz	RTS;
51479ba6035862a9c08ce4351c7fff8926fde4ede5Robin Getz
52479ba6035862a9c08ce4351c7fff8926fde4ede5Robin GetzENDPROC(_strncmp)
53