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
This commit is contained in:
Christopher Ferris 2013-07-15 13:55:45 -07:00
parent 0aa9b52efa
commit 9ad2a73ed6

View File

@ -69,42 +69,50 @@ size_t strlen(const char *s)
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
#if !defined(__OPTIMIZE_SIZE__) #if !defined(__OPTIMIZE_SIZE__)
"bne 1f \n" "bne 1f \n"
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
"bne 1f \n" "bne 1f \n"
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
"bne 1f \n" "bne 1f \n"
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
"bne 1f \n" "bne 1f \n"
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
"bne 1f \n" "bne 1f \n"
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
"bne 1f \n" "bne 1f \n"
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
"bne 1f \n" "bne 1f \n"
"sub %[t], %[v], %[mask], lsr #7\n" "sub %[t], %[v], %[mask], lsr #7\n"
"and %[t], %[t], %[mask] \n" "and %[t], %[t], %[mask] \n"
"bics %[t], %[t], %[v] \n" "bics %[t], %[t], %[v] \n"
"it eq \n"
"ldreq %[v], [%[s]], #4 \n" "ldreq %[v], [%[s]], #4 \n"
#endif #endif
"beq 0b \n" "beq 0b \n"
@ -117,6 +125,7 @@ size_t strlen(const char *s)
"beq 2f \n" "beq 2f \n"
"add %[l], %[l], #1 \n" "add %[l], %[l], #1 \n"
"tst %[v], #0xFF0000 \n" "tst %[v], #0xFF0000 \n"
"it ne \n"
"addne %[l], %[l], #1 \n" "addne %[l], %[l], #1 \n"
"2: \n" "2: \n"
: [l]"=&r"(l), [v]"=&r"(v), [t]"=&r"(t), [s]"=&r"(u.b) : [l]"=&r"(l), [v]"=&r"(v), [t]"=&r"(t), [s]"=&r"(u.b)