aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/machine/riscv/strlen.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/riscv/strlen.c')
-rw-r--r--newlib/libc/machine/riscv/strlen.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/newlib/libc/machine/riscv/strlen.c b/newlib/libc/machine/riscv/strlen.c
index 7e5d416..8ab5ce5 100644
--- a/newlib/libc/machine/riscv/strlen.c
+++ b/newlib/libc/machine/riscv/strlen.c
@@ -9,9 +9,10 @@
http://www.opensource.org/licenses.
*/
+#include <sys/types.h>
#include <string.h>
#include <stdint.h>
-#include "sys/asm.h"
+#include "rv_string.h"
size_t strlen(const char *str)
{
@@ -38,7 +39,9 @@ size_t strlen(const char *str)
asm volatile ("" : "+r"(ps)); /* prevent "optimization" */
str = (const char *)ps;
- size_t ret = str - start, sp = sizeof (*ps);
+
+ size_t ret = str - start;
+ ssize_t sp = sizeof (*ps);
#if __riscv_zbb
psval = ~__LIBC_RISCV_ZBB_ORC_B(psval);
@@ -47,16 +50,16 @@ size_t strlen(const char *str)
return ret + (psval >> 3) - sp;
#else
char c0 = str[0 - sp], c1 = str[1 - sp], c2 = str[2 - sp], c3 = str[3 - sp];
- if (c0 == 0) return ret + 0 - sp;
- if (c1 == 0) return ret + 1 - sp;
- if (c2 == 0) return ret + 2 - sp;
- if (c3 == 0) return ret + 3 - sp;
+ if (c0 == 0) return ret + 0 - sp;
+ if (c1 == 0) return ret + 1 - sp;
+ if (c2 == 0) return ret + 2 - sp;
+ if (__riscv_xlen == 32 || c3 == 0) return ret + 3 - sp;
#if __riscv_xlen == 64
c0 = str[4 - sp], c1 = str[5 - sp], c2 = str[6 - sp];
- if (c0 == 0) return ret + 4 - sp;
- if (c1 == 0) return ret + 5 - sp;
- if (c2 == 0) return ret + 6 - sp;
+ if (c0 == 0) return ret + 4 - sp;
+ if (c1 == 0) return ret + 5 - sp;
+ if (c2 == 0) return ret + 6 - sp;
#endif
return ret + 7 - sp;