summaryrefslogtreecommitdiff
path: root/arch/riscv/lib/strlen.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/riscv/lib/strlen.S')
-rw-r--r--arch/riscv/lib/strlen.S13
1 files changed, 6 insertions, 7 deletions
diff --git a/arch/riscv/lib/strlen.S b/arch/riscv/lib/strlen.S
index 962983b73251..e7736ccda514 100644
--- a/arch/riscv/lib/strlen.S
+++ b/arch/riscv/lib/strlen.S
@@ -8,7 +8,8 @@
/* int strlen(const char *s) */
SYM_FUNC_START(strlen)
- ALTERNATIVE("nop", "j strlen_zbb", 0, RISCV_ISA_EXT_ZBB, CONFIG_RISCV_ISA_ZBB)
+ __ALTERNATIVE_CFG("nop", "j strlen_zbb", 0, RISCV_ISA_EXT_ZBB,
+ IS_ENABLED(CONFIG_RISCV_ISA_ZBB) && IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB))
/*
* Returns
@@ -20,20 +21,18 @@ SYM_FUNC_START(strlen)
* Clobbers:
* t0, t1
*/
- mv t1, a0
+ addi t1, a0, -1
1:
- lbu t0, 0(t1)
- beqz t0, 2f
addi t1, t1, 1
- j 1b
-2:
+ lbu t0, 0(t1)
+ bnez t0, 1b
sub a0, t1, a0
ret
/*
* Variant of strlen using the ZBB extension if available
*/
-#ifdef CONFIG_RISCV_ISA_ZBB
+#if defined(CONFIG_RISCV_ISA_ZBB) && defined(CONFIG_TOOLCHAIN_HAS_ZBB)
strlen_zbb:
#ifdef CONFIG_CPU_BIG_ENDIAN