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. Change-Id: If04d15dcb6c0b18f27f2fefadca5510ed49016c5
This commit is contained in:
parent
67e9f47476
commit
d8d10a8994
@ -33,16 +33,16 @@ size_t strlen(const char *s)
|
|||||||
{
|
{
|
||||||
__builtin_prefetch(s);
|
__builtin_prefetch(s);
|
||||||
__builtin_prefetch(s+32);
|
__builtin_prefetch(s+32);
|
||||||
|
|
||||||
union {
|
union {
|
||||||
const char *b;
|
const char *b;
|
||||||
const uint32_t *w;
|
const uint32_t *w;
|
||||||
uintptr_t i;
|
uintptr_t i;
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
// these are some scratch variables for the asm code below
|
// these are some scratch variables for the asm code below
|
||||||
uint32_t v, t;
|
uint32_t v, t;
|
||||||
|
|
||||||
// initialize the string length to zero
|
// initialize the string length to zero
|
||||||
size_t l = 0;
|
size_t l = 0;
|
||||||
|
|
||||||
@ -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,13 +125,14 @@ 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)
|
||||||
: "%[l]"(l), "%[s]"(u.b), [mask]"r"(0x80808080UL)
|
: "%[l]"(l), "%[s]"(u.b), [mask]"r"(0x80808080UL)
|
||||||
: "cc"
|
: "cc"
|
||||||
);
|
);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user