OpenCores
URL https://opencores.org/ocsvn/hf-risc/hf-risc/trunk

Subversion Repositories hf-risc

[/] [hf-risc/] [trunk/] [tools/] [riscv-gnu-toolchain-master/] [glibc/] [sysdeps/] [riscv/] [strlen.c] - Blame information for rev 13

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 13 serginhofr
#include <string.h>
2
#include <stdint.h>
3
 
4
#undef strlen
5
 
6
size_t strlen(const char* str)
7
{
8
  const char* start = str;
9
 
10
  if (__builtin_expect((uintptr_t)str & (sizeof(long)-1), 0)) do
11
  {
12
    char ch = *str;
13
    str++;
14
    if (!ch)
15
      return str - start - 1;
16
  } while ((uintptr_t)str & (sizeof(long)-1));
17
 
18
  unsigned long* ls = (unsigned long*)str;
19
  while (!__libc_detect_null(*ls++))
20
    ;
21
  asm volatile ("" : "+r"(ls)); /* prevent "optimization" */
22
 
23
  str = (const char*)ls;
24
  size_t ret = str - start, sl = sizeof(long);
25
 
26
  char c0 = str[0-sl], c1 = str[1-sl], c2 = str[2-sl], c3 = str[3-sl];
27
  if (c0 == 0)            return ret + 0 - sl;
28
  if (c1 == 0)            return ret + 1 - sl;
29
  if (c2 == 0)            return ret + 2 - sl;
30
  if (sl == 4 || c3 == 0) return ret + 3 - sl;
31
 
32
  c0 = str[4-sl], c1 = str[5-sl], c2 = str[6-sl], c3 = str[7-sl];
33
  if (c0 == 0)            return ret + 4 - sl;
34
  if (c1 == 0)            return ret + 5 - sl;
35
  if (c2 == 0)            return ret + 6 - sl;
36
                          return ret + 7 - sl;
37
}
38
libc_hidden_def(strlen)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.