1 /*
2 * strlen.c -- strlen function. On at least some MIPS chips, a simple
3 * strlen is faster than the 'optimized' C version.
4 *
5 * Copyright (c) 2001, 2002 Red Hat, Inc.
6 *
7 * The authors hereby grant permission to use, copy, modify, distribute,
8 * and license this software and its documentation for any purpose, provided
9 * that existing copyright notices are retained in all copies and that this
10 * notice is included verbatim in any distributions. No written agreement,
11 * license, or royalty fee is required for any of the authorized uses.
12 * Modifications to this software may be copyrighted by their authors
13 * and need not follow the licensing terms described here, provided that
14 * the new terms are clearly indicated on the first page of each file where
15 * they apply.
16 */
17
18 #include <stddef.h>
19 #include <string.h>
20
21 /* MIPS16 needs to come first. */
22
23 #if defined(__mips16)
24 size_t
strlen(const char * str)25 strlen (const char *str)
26 {
27 const char *start = str;
28
29 while (*str++ != '\0')
30 ;
31
32 return str - start - 1;
33 }
34 #elif defined(__mips64)
35 __asm__("" /* 64-bit MIPS targets */
36 " .set noreorder\n"
37 " .set nomacro\n"
38 " .globl strlen\n"
39 " .ent strlen\n"
40 "strlen:\n"
41 " daddiu $2,$4,1\n"
42 "\n"
43 "1: lbu $3,0($4)\n"
44 " bnez $3,1b\n"
45 " daddiu $4,$4,1\n"
46 "\n"
47 " jr $31\n"
48 " dsubu $2,$4,$2\n"
49 " .end strlen\n"
50 " .set macro\n"
51 " .set reorder\n");
52
53 #else
54 __asm__("" /* 32-bit MIPS targets */
55 " .set noreorder\n"
56 " .set nomacro\n"
57 " .globl strlen\n"
58 " .ent strlen\n"
59 "strlen:\n"
60 " addiu $2,$4,1\n"
61 "\n"
62 "1: lbu $3,0($4)\n"
63 #if defined(_R3000)
64 " nop \n"
65 #endif
66 " bnez $3,1b\n"
67 " addiu $4,$4,1\n"
68 "\n"
69 " jr $31\n"
70 " subu $2,$4,$2\n"
71 " .end strlen\n"
72 " .set macro\n"
73 " .set reorder\n");
74 #endif
75