Cygwin: Add new APIs tc[gs]etwinsize()
[newlib-cygwin.git] / newlib / libc / machine / mips / strlen.c
bloba87bddd11fbb604ec42d5b7d8ab445f42d83b7a9
1 /*
2 * strlen.c -- strlen function. On at least some MIPS chips, a simple
3 * strlen is faster than the 'optimized' C version.
5 * Copyright (c) 2001, 2002 Red Hat, Inc.
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.
18 #include <stddef.h>
19 #include <string.h>
21 /* MIPS16 needs to come first. */
23 #if defined(__mips16)
24 size_t
25 strlen (const char *str)
27 const char *start = str;
29 while (*str++ != '\0')
32 return str - start - 1;
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");
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