mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-21 17:31:10 +03:00
ARM: Convert string/ assembly to unified syntax.
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
2013-03-11 Roland McGrath <roland@hack.frob.com>
|
2013-03-11 Roland McGrath <roland@hack.frob.com>
|
||||||
|
|
||||||
|
* sysdeps/arm/memcpy.S: Convert to unified assembly syntax.
|
||||||
|
* sysdeps/arm/memmove.S: Likewise.
|
||||||
|
* sysdeps/arm/memset.S: Likewise.
|
||||||
|
* sysdeps/arm/strlen.S: Likewise.
|
||||||
|
|
||||||
* sysdeps/arm/memcpy.S: Use r10 instead of r9.
|
* sysdeps/arm/memcpy.S: Use r10 instead of r9.
|
||||||
* sysdeps/arm/memmove.S: Likewise.
|
* sysdeps/arm/memmove.S: Likewise.
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
|
/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
|
||||||
|
|
||||||
@@ -84,7 +85,7 @@ ENTRY(memcpy)
|
|||||||
|
|
||||||
CALGN( ands ip, r1, #31 )
|
CALGN( ands ip, r1, #31 )
|
||||||
CALGN( rsb r3, ip, #32 )
|
CALGN( rsb r3, ip, #32 )
|
||||||
CALGN( sbcnes r4, r3, r2 ) @ C is always set here
|
CALGN( sbcsne r4, r3, r2 ) @ C is always set here
|
||||||
CALGN( bcs 2f )
|
CALGN( bcs 2f )
|
||||||
CALGN( adr r4, 6f )
|
CALGN( adr r4, 6f )
|
||||||
CALGN( subs r2, r2, r3 ) @ C gets set
|
CALGN( subs r2, r2, r3 ) @ C gets set
|
||||||
@@ -139,12 +140,12 @@ ENTRY(memcpy)
|
|||||||
cfi_restore (r8)
|
cfi_restore (r8)
|
||||||
|
|
||||||
8: movs r2, r2, lsl #31
|
8: movs r2, r2, lsl #31
|
||||||
ldrneb r3, [r1], #1
|
ldrbne r3, [r1], #1
|
||||||
ldrcsb r4, [r1], #1
|
ldrbcs r4, [r1], #1
|
||||||
ldrcsb ip, [r1]
|
ldrbcs ip, [r1]
|
||||||
strneb r3, [r0], #1
|
strbne r3, [r0], #1
|
||||||
strcsb r4, [r0], #1
|
strbcs r4, [r0], #1
|
||||||
strcsb ip, [r0]
|
strbcs ip, [r0]
|
||||||
|
|
||||||
#if defined (__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)
|
#if defined (__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)
|
||||||
pop {r0, r4, lr}
|
pop {r0, r4, lr}
|
||||||
@@ -160,11 +161,11 @@ ENTRY(memcpy)
|
|||||||
|
|
||||||
9: rsb ip, ip, #4
|
9: rsb ip, ip, #4
|
||||||
cmp ip, #2
|
cmp ip, #2
|
||||||
ldrgtb r3, [r1], #1
|
ldrbgt r3, [r1], #1
|
||||||
ldrgeb r4, [r1], #1
|
ldrbge r4, [r1], #1
|
||||||
ldrb lr, [r1], #1
|
ldrb lr, [r1], #1
|
||||||
strgtb r3, [r0], #1
|
strbgt r3, [r0], #1
|
||||||
strgeb r4, [r0], #1
|
strbge r4, [r0], #1
|
||||||
subs r2, r2, ip
|
subs r2, r2, ip
|
||||||
strb lr, [r0], #1
|
strb lr, [r0], #1
|
||||||
blt 8b
|
blt 8b
|
||||||
@@ -185,7 +186,7 @@ ENTRY(memcpy)
|
|||||||
|
|
||||||
CALGN( ands ip, r1, #31 )
|
CALGN( ands ip, r1, #31 )
|
||||||
CALGN( rsb ip, ip, #32 )
|
CALGN( rsb ip, ip, #32 )
|
||||||
CALGN( sbcnes r4, ip, r2 ) @ C is always set here
|
CALGN( sbcsne r4, ip, r2 ) @ C is always set here
|
||||||
CALGN( subcc r2, r2, ip )
|
CALGN( subcc r2, r2, ip )
|
||||||
CALGN( bcc 15f )
|
CALGN( bcc 15f )
|
||||||
|
|
||||||
|
|||||||
@@ -53,6 +53,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prototype: void *memmove(void *dest, const void *src, size_t n);
|
* Prototype: void *memmove(void *dest, const void *src, size_t n);
|
||||||
@@ -100,7 +101,7 @@ ENTRY(memmove)
|
|||||||
blt 5f
|
blt 5f
|
||||||
|
|
||||||
CALGN( ands ip, r1, #31 )
|
CALGN( ands ip, r1, #31 )
|
||||||
CALGN( sbcnes r4, ip, r2 ) @ C is always set here
|
CALGN( sbcsne r4, ip, r2 ) @ C is always set here
|
||||||
CALGN( bcs 2f )
|
CALGN( bcs 2f )
|
||||||
CALGN( adr r4, 6f )
|
CALGN( adr r4, 6f )
|
||||||
CALGN( subs r2, r2, ip ) @ C is set here
|
CALGN( subs r2, r2, ip ) @ C is set here
|
||||||
@@ -155,12 +156,12 @@ ENTRY(memmove)
|
|||||||
cfi_restore (r8)
|
cfi_restore (r8)
|
||||||
|
|
||||||
8: movs r2, r2, lsl #31
|
8: movs r2, r2, lsl #31
|
||||||
ldrneb r3, [r1, #-1]!
|
ldrbne r3, [r1, #-1]!
|
||||||
ldrcsb r4, [r1, #-1]!
|
ldrbcs r4, [r1, #-1]!
|
||||||
ldrcsb ip, [r1, #-1]
|
ldrbcs ip, [r1, #-1]
|
||||||
strneb r3, [r0, #-1]!
|
strbne r3, [r0, #-1]!
|
||||||
strcsb r4, [r0, #-1]!
|
strbcs r4, [r0, #-1]!
|
||||||
strcsb ip, [r0, #-1]
|
strbcs ip, [r0, #-1]
|
||||||
|
|
||||||
#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
|
#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
|
||||||
pop {r0, r4, lr}
|
pop {r0, r4, lr}
|
||||||
@@ -175,11 +176,11 @@ ENTRY(memmove)
|
|||||||
cfi_restore_state
|
cfi_restore_state
|
||||||
|
|
||||||
9: cmp ip, #2
|
9: cmp ip, #2
|
||||||
ldrgtb r3, [r1, #-1]!
|
ldrbgt r3, [r1, #-1]!
|
||||||
ldrgeb r4, [r1, #-1]!
|
ldrbge r4, [r1, #-1]!
|
||||||
ldrb lr, [r1, #-1]!
|
ldrb lr, [r1, #-1]!
|
||||||
strgtb r3, [r0, #-1]!
|
strbgt r3, [r0, #-1]!
|
||||||
strgeb r4, [r0, #-1]!
|
strbge r4, [r0, #-1]!
|
||||||
subs r2, r2, ip
|
subs r2, r2, ip
|
||||||
strb lr, [r0, #-1]!
|
strb lr, [r0, #-1]!
|
||||||
blt 8b
|
blt 8b
|
||||||
@@ -200,7 +201,7 @@ ENTRY(memmove)
|
|||||||
|
|
||||||
CALGN( ands ip, r1, #31 )
|
CALGN( ands ip, r1, #31 )
|
||||||
CALGN( rsb ip, ip, #32 )
|
CALGN( rsb ip, ip, #32 )
|
||||||
CALGN( sbcnes r4, ip, r2 ) @ C is always set here
|
CALGN( sbcsne r4, ip, r2 ) @ C is always set here
|
||||||
CALGN( subcc r2, r2, ip )
|
CALGN( subcc r2, r2, ip )
|
||||||
CALGN( bcc 15f )
|
CALGN( bcc 15f )
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,9 @@
|
|||||||
#define NO_THUMB
|
#define NO_THUMB
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
|
.text
|
||||||
|
.syntax unified
|
||||||
|
|
||||||
/* void *memset (dstpp, c, len) */
|
/* void *memset (dstpp, c, len) */
|
||||||
|
|
||||||
ENTRY(memset)
|
ENTRY(memset)
|
||||||
@@ -29,7 +32,7 @@ ENTRY(memset)
|
|||||||
|
|
||||||
1:
|
1:
|
||||||
tst r3, #3 @ aligned yet?
|
tst r3, #3 @ aligned yet?
|
||||||
strneb r1, [r3], #1
|
strbne r1, [r3], #1
|
||||||
subne r2, r2, #1
|
subne r2, r2, #1
|
||||||
bne 1b
|
bne 1b
|
||||||
|
|
||||||
@@ -40,27 +43,27 @@ ENTRY(memset)
|
|||||||
|
|
||||||
1:
|
1:
|
||||||
subs r2, r2, #8
|
subs r2, r2, #8
|
||||||
stmcsia r3!, {r1, ip} @ store up to 32 bytes per loop iteration
|
stmiacs r3!, {r1, ip} @ store up to 32 bytes per loop iteration
|
||||||
subcss r2, r2, #8
|
subscs r2, r2, #8
|
||||||
stmcsia r3!, {r1, ip}
|
stmiacs r3!, {r1, ip}
|
||||||
subcss r2, r2, #8
|
subscs r2, r2, #8
|
||||||
stmcsia r3!, {r1, ip}
|
stmiacs r3!, {r1, ip}
|
||||||
subcss r2, r2, #8
|
subscs r2, r2, #8
|
||||||
stmcsia r3!, {r1, ip}
|
stmiacs r3!, {r1, ip}
|
||||||
bcs 1b
|
bcs 1b
|
||||||
|
|
||||||
and r2, r2, #7
|
and r2, r2, #7
|
||||||
2:
|
2:
|
||||||
subs r2, r2, #1 @ store up to 4 bytes per loop iteration
|
subs r2, r2, #1 @ store up to 4 bytes per loop iteration
|
||||||
strcsb r1, [r3], #1
|
strbcs r1, [r3], #1
|
||||||
subcss r2, r2, #1
|
subscs r2, r2, #1
|
||||||
strcsb r1, [r3], #1
|
strbcs r1, [r3], #1
|
||||||
subcss r2, r2, #1
|
subscs r2, r2, #1
|
||||||
strcsb r1, [r3], #1
|
strbcs r1, [r3], #1
|
||||||
subcss r2, r2, #1
|
subscs r2, r2, #1
|
||||||
strcsb r1, [r3], #1
|
strbcs r1, [r3], #1
|
||||||
bcs 2b
|
bcs 2b
|
||||||
|
|
||||||
DO_RET(lr)
|
DO_RET(lr)
|
||||||
END(memset)
|
END(memset)
|
||||||
libc_hidden_builtin_def (memset)
|
libc_hidden_builtin_def (memset)
|
||||||
|
|||||||
@@ -25,6 +25,9 @@
|
|||||||
* exit: r0 = len
|
* exit: r0 = len
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
.text
|
||||||
|
|
||||||
ENTRY(strlen)
|
ENTRY(strlen)
|
||||||
bic r1, r0, $3 @ addr of word containing first byte
|
bic r1, r0, $3 @ addr of word containing first byte
|
||||||
ldr r2, [r1], $4 @ get the first word
|
ldr r2, [r1], $4 @ get the first word
|
||||||
|
|||||||
Reference in New Issue
Block a user