From 9ad2a73ed65d39c3a638ff9bd2d73250b41212c6 Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Mon, 15 Jul 2013 13:55:45 -0700 Subject: [PATCH] Fix assembler errors in generic arm strlen.c. Tested using a static version of the strlen libc_test program on a nexus7 that uses the generic code. Merge from internal master. (cherry-picked from d8d10a8994472e40d19301b7087806630877b4d5) Change-Id: I88f7dc01dc5b5c3ac2d5580d92153bc1bc36c564 --- libc/arch-arm/generic/bionic/strlen.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/libc/arch-arm/generic/bionic/strlen.c b/libc/arch-arm/generic/bionic/strlen.c index ca0669de3..824cf78d0 100644 --- a/libc/arch-arm/generic/bionic/strlen.c +++ b/libc/arch-arm/generic/bionic/strlen.c @@ -33,16 +33,16 @@ size_t strlen(const char *s) { __builtin_prefetch(s); __builtin_prefetch(s+32); - + union { const char *b; const uint32_t *w; uintptr_t i; } u; - + // these are some scratch variables for the asm code below uint32_t v, t; - + // initialize the string length to zero size_t l = 0; @@ -69,42 +69,50 @@ size_t strlen(const char *s) "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" #if !defined(__OPTIMIZE_SIZE__) "bne 1f \n" "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" "bne 1f \n" "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" "bne 1f \n" "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" "bne 1f \n" "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" "bne 1f \n" "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" "bne 1f \n" "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" "bne 1f \n" "sub %[t], %[v], %[mask], lsr #7\n" "and %[t], %[t], %[mask] \n" "bics %[t], %[t], %[v] \n" + "it eq \n" "ldreq %[v], [%[s]], #4 \n" #endif "beq 0b \n" @@ -117,13 +125,14 @@ size_t strlen(const char *s) "beq 2f \n" "add %[l], %[l], #1 \n" "tst %[v], #0xFF0000 \n" + "it ne \n" "addne %[l], %[l], #1 \n" "2: \n" : [l]"=&r"(l), [v]"=&r"(v), [t]"=&r"(t), [s]"=&r"(u.b) : "%[l]"(l), "%[s]"(u.b), [mask]"r"(0x80808080UL) : "cc" ); - + done: return l; } -- 2.11.0