Use unified syntax to compile with both llvm and gcc.
All arch-arm and arch-arm64 .S files were compiled
by gcc with and without this patch. The output object files
were identical. When compiled with llvm and this patch,
the output files were also identical to gcc's output.
BUG: 18061004
Change-Id: I458914d512ddf5496e4eb3d288bf032cd526d32b
(cherry picked from commit 33f33515b5)
			
			
This commit is contained in:
		@@ -941,10 +941,6 @@ LOCAL_SRC_FILES := $(libc_bionic_src_files)
 | 
				
			|||||||
LOCAL_CFLAGS := $(libc_common_cflags) \
 | 
					LOCAL_CFLAGS := $(libc_common_cflags) \
 | 
				
			||||||
    -Wframe-larger-than=2048 \
 | 
					    -Wframe-larger-than=2048 \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# memcpy.S, memchr.S, etc. do not compile with Clang.
 | 
					 | 
				
			||||||
LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as
 | 
					 | 
				
			||||||
LOCAL_CLANG_ASFLAGS_arm64 += -no-integrated-as
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 | 
					LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 | 
				
			||||||
LOCAL_CPPFLAGS := $(libc_common_cppflags) -Wold-style-cast
 | 
					LOCAL_CPPFLAGS := $(libc_common_cppflags) -Wold-style-cast
 | 
				
			||||||
LOCAL_C_INCLUDES := $(libc_common_c_includes) bionic/libstdc++/include
 | 
					LOCAL_C_INCLUDES := $(libc_common_c_includes) bionic/libstdc++/include
 | 
				
			||||||
@@ -972,10 +968,6 @@ LOCAL_SRC_FILES := $(libc_bionic_ndk_src_files)
 | 
				
			|||||||
LOCAL_CFLAGS := $(libc_common_cflags) \
 | 
					LOCAL_CFLAGS := $(libc_common_cflags) \
 | 
				
			||||||
    -Wframe-larger-than=2048 \
 | 
					    -Wframe-larger-than=2048 \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# memcpy.S, memchr.S, etc. do not compile with Clang.
 | 
					 | 
				
			||||||
LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as
 | 
					 | 
				
			||||||
LOCAL_CLANG_ASFLAGS_arm64 += -no-integrated-as
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 | 
					LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 | 
				
			||||||
LOCAL_CPPFLAGS := $(libc_common_cppflags) -Wold-style-cast
 | 
					LOCAL_CPPFLAGS := $(libc_common_cppflags) -Wold-style-cast
 | 
				
			||||||
LOCAL_C_INCLUDES := $(libc_common_c_includes) bionic/libstdc++/include
 | 
					LOCAL_C_INCLUDES := $(libc_common_c_includes) bionic/libstdc++/include
 | 
				
			||||||
@@ -1024,10 +1016,6 @@ LOCAL_SRC_FILES := $(libc_pthread_src_files)
 | 
				
			|||||||
LOCAL_CFLAGS := $(libc_common_cflags) \
 | 
					LOCAL_CFLAGS := $(libc_common_cflags) \
 | 
				
			||||||
    -Wframe-larger-than=2048 \
 | 
					    -Wframe-larger-than=2048 \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# memcpy.S, memchr.S, etc. do not compile with Clang.
 | 
					 | 
				
			||||||
LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as
 | 
					 | 
				
			||||||
LOCAL_CLANG_ASFLAGS_arm64 += -no-integrated-as
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 | 
					LOCAL_CONLYFLAGS := $(libc_common_conlyflags)
 | 
				
			||||||
LOCAL_CPPFLAGS := $(libc_common_cppflags) -Wold-style-cast
 | 
					LOCAL_CPPFLAGS := $(libc_common_cppflags) -Wold-style-cast
 | 
				
			||||||
LOCAL_C_INCLUDES := $(libc_common_c_includes)
 | 
					LOCAL_C_INCLUDES := $(libc_common_c_includes)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .fpu    neon
 | 
					    .fpu    neon
 | 
				
			||||||
 | 
					    .syntax unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(__memset_chk)
 | 
					ENTRY(__memset_chk)
 | 
				
			||||||
        cmp         r2, r3
 | 
					        cmp         r2, r3
 | 
				
			||||||
@@ -100,9 +101,9 @@ ENTRY(memset)
 | 
				
			|||||||
1:      bge         2f
 | 
					1:      bge         2f
 | 
				
			||||||
        vst1.32     {d0[0]}, [r0]!
 | 
					        vst1.32     {d0[0]}, [r0]!
 | 
				
			||||||
2:      movs        ip, r2, lsl #31
 | 
					2:      movs        ip, r2, lsl #31
 | 
				
			||||||
        strmib      r1, [r0], #1
 | 
					        strbmi      r1, [r0], #1
 | 
				
			||||||
        strcsb      r1, [r0], #1
 | 
					        strbcs      r1, [r0], #1
 | 
				
			||||||
        strcsb      r1, [r0], #1
 | 
					        strbcs      r1, [r0], #1
 | 
				
			||||||
        ldmfd       sp!, {r0}
 | 
					        ldmfd       sp!, {r0}
 | 
				
			||||||
        bx          lr
 | 
					        bx          lr
 | 
				
			||||||
END(memset)
 | 
					END(memset)
 | 
				
			||||||
@@ -131,11 +132,11 @@ ENTRY_PRIVATE(__memset_large_copy)
 | 
				
			|||||||
        orr         r1, r1, r1, lsr #16
 | 
					        orr         r1, r1, r1, lsr #16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        movs        r12, r3, lsl #31
 | 
					        movs        r12, r3, lsl #31
 | 
				
			||||||
        strcsb      r1, [r0], #1    /* can't use strh (alignment unknown) */
 | 
					        strbcs      r1, [r0], #1    /* can't use strh (alignment unknown) */
 | 
				
			||||||
        strcsb      r1, [r0], #1
 | 
					        strbcs      r1, [r0], #1
 | 
				
			||||||
        strmib      r1, [r0], #1
 | 
					        strbmi      r1, [r0], #1
 | 
				
			||||||
        subs        r2, r2, r3
 | 
					        subs        r2, r2, r3
 | 
				
			||||||
        ldmlsfd     sp!, {r0, r4-r7, lr}   /* return */
 | 
					        popls       {r0, r4-r7, lr}   /* return */
 | 
				
			||||||
        bxls        lr
 | 
					        bxls        lr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* align the destination to a cache-line */
 | 
					        /* align the destination to a cache-line */
 | 
				
			||||||
@@ -155,9 +156,9 @@ ENTRY_PRIVATE(__memset_large_copy)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /* conditionally writes 0 to 7 words (length in r3) */
 | 
					        /* conditionally writes 0 to 7 words (length in r3) */
 | 
				
			||||||
        movs        r3, r3, lsl #28
 | 
					        movs        r3, r3, lsl #28
 | 
				
			||||||
        stmcsia     r0!, {r1, lr}
 | 
					        stmcs       r0!, {r1, lr}
 | 
				
			||||||
        stmcsia     r0!, {r1, lr}
 | 
					        stmcs       r0!, {r1, lr}
 | 
				
			||||||
        stmmiia     r0!, {r1, lr}
 | 
					        stmmi       r0!, {r1, lr}
 | 
				
			||||||
        movs        r3, r3, lsl #2
 | 
					        movs        r3, r3, lsl #2
 | 
				
			||||||
        strcs       r1, [r0], #4
 | 
					        strcs       r1, [r0], #4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -172,13 +173,13 @@ ENTRY_PRIVATE(__memset_large_copy)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /* conditionally stores 0 to 31 bytes */
 | 
					        /* conditionally stores 0 to 31 bytes */
 | 
				
			||||||
        movs        r2, r2, lsl #28
 | 
					        movs        r2, r2, lsl #28
 | 
				
			||||||
        stmcsia     r0!, {r1,r3,r12,lr}
 | 
					        stmcs       r0!, {r1,r3,r12,lr}
 | 
				
			||||||
        stmmiia     r0!, {r1, lr}
 | 
					        stmmi       r0!, {r1, lr}
 | 
				
			||||||
        movs        r2, r2, lsl #2
 | 
					        movs        r2, r2, lsl #2
 | 
				
			||||||
        strcs       r1, [r0], #4
 | 
					        strcs       r1, [r0], #4
 | 
				
			||||||
        strmih      r1, [r0], #2
 | 
					        strhmi      r1, [r0], #2
 | 
				
			||||||
        movs        r2, r2, lsl #2
 | 
					        movs        r2, r2, lsl #2
 | 
				
			||||||
        strcsb      r1, [r0]
 | 
					        strbcs      r1, [r0]
 | 
				
			||||||
        ldmfd       sp!, {r0, r4-r7, lr}
 | 
					        ldmfd       sp!, {r0, r4-r7, lr}
 | 
				
			||||||
        bx          lr
 | 
					        bx          lr
 | 
				
			||||||
END(__memset_large_copy)
 | 
					END(__memset_large_copy)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,8 @@
 | 
				
			|||||||
 * Optimized memcmp() for Cortex-A9.
 | 
					 * Optimized memcmp() for Cortex-A9.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.syntax unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(memcmp)
 | 
					ENTRY(memcmp)
 | 
				
			||||||
        pld         [r0, #(CACHE_LINE_SIZE * 0)]
 | 
					        pld         [r0, #(CACHE_LINE_SIZE * 0)]
 | 
				
			||||||
        pld         [r0, #(CACHE_LINE_SIZE * 1)]
 | 
					        pld         [r0, #(CACHE_LINE_SIZE * 1)]
 | 
				
			||||||
@@ -161,25 +163,25 @@ ENTRY(memcmp)
 | 
				
			|||||||
        eors        r0, r0, ip
 | 
					        eors        r0, r0, ip
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        ldreq       ip, [r1, #4]!
 | 
					        ldreq       ip, [r1, #4]!
 | 
				
			||||||
        eoreqs      r0, r0, lr
 | 
					        eorseq      r0, r0, lr
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        ldreq       lr, [r1, #4]!
 | 
					        ldreq       lr, [r1, #4]!
 | 
				
			||||||
        eoreqs      r0, r0, ip
 | 
					        eorseq      r0, r0, ip
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        ldreq       ip, [r1, #4]!
 | 
					        ldreq       ip, [r1, #4]!
 | 
				
			||||||
        eoreqs      r0, r0, lr
 | 
					        eorseq      r0, r0, lr
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        ldreq       lr, [r1, #4]!
 | 
					        ldreq       lr, [r1, #4]!
 | 
				
			||||||
        eoreqs      r0, r0, ip
 | 
					        eorseq      r0, r0, ip
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        ldreq       ip, [r1, #4]!
 | 
					        ldreq       ip, [r1, #4]!
 | 
				
			||||||
        eoreqs      r0, r0, lr
 | 
					        eorseq      r0, r0, lr
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        ldreq       lr, [r1, #4]!
 | 
					        ldreq       lr, [r1, #4]!
 | 
				
			||||||
        eoreqs      r0, r0, ip
 | 
					        eorseq      r0, r0, ip
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        ldreq       ip, [r1, #4]!
 | 
					        ldreq       ip, [r1, #4]!
 | 
				
			||||||
        eoreqs      r0, r0, lr
 | 
					        eorseq      r0, r0, lr
 | 
				
			||||||
        bne         2f
 | 
					        bne         2f
 | 
				
			||||||
        subs        r2, r2, #32
 | 
					        subs        r2, r2, #32
 | 
				
			||||||
        bhs         0b
 | 
					        bhs         0b
 | 
				
			||||||
@@ -263,17 +265,17 @@ ENTRY(memcmp)
 | 
				
			|||||||
        ldreq       lr, [r1], #4
 | 
					        ldreq       lr, [r1], #4
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        orreq       ip, ip, lr, lsl #16
 | 
					        orreq       ip, ip, lr, lsl #16
 | 
				
			||||||
        eoreqs      r0, r0, ip
 | 
					        eorseq      r0, r0, ip
 | 
				
			||||||
        moveq       ip, lr, lsr #16
 | 
					        moveq       ip, lr, lsr #16
 | 
				
			||||||
        ldreq       lr, [r1], #4
 | 
					        ldreq       lr, [r1], #4
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        orreq       ip, ip, lr, lsl #16
 | 
					        orreq       ip, ip, lr, lsl #16
 | 
				
			||||||
        eoreqs      r0, r0, ip
 | 
					        eorseq      r0, r0, ip
 | 
				
			||||||
        moveq       ip, lr, lsr #16
 | 
					        moveq       ip, lr, lsr #16
 | 
				
			||||||
        ldreq       lr, [r1], #4
 | 
					        ldreq       lr, [r1], #4
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        orreq       ip, ip, lr, lsl #16
 | 
					        orreq       ip, ip, lr, lsl #16
 | 
				
			||||||
        eoreqs      r0, r0, ip
 | 
					        eorseq      r0, r0, ip
 | 
				
			||||||
        bne         7f
 | 
					        bne         7f
 | 
				
			||||||
        subs        r2, r2, #16
 | 
					        subs        r2, r2, #16
 | 
				
			||||||
        bhs         6b
 | 
					        bhs         6b
 | 
				
			||||||
@@ -317,7 +319,7 @@ ENTRY(memcmp)
 | 
				
			|||||||
        ldreq       r7, [r1], #4
 | 
					        ldreq       r7, [r1], #4
 | 
				
			||||||
        ldreq       r0, [r4], #4
 | 
					        ldreq       r0, [r4], #4
 | 
				
			||||||
        orreq       ip, ip, r7, lsl r6
 | 
					        orreq       ip, ip, r7, lsl r6
 | 
				
			||||||
        eoreqs      r0, r0, ip
 | 
					        eorseq      r0, r0, ip
 | 
				
			||||||
        bne         7f
 | 
					        bne         7f
 | 
				
			||||||
        subs        r2, r2, #8
 | 
					        subs        r2, r2, #8
 | 
				
			||||||
        bhs         6b
 | 
					        bhs         6b
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,8 @@
 | 
				
			|||||||
         * so we have to preserve R0.
 | 
					         * so we have to preserve R0.
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .syntax unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(__memcpy_chk)
 | 
					ENTRY(__memcpy_chk)
 | 
				
			||||||
        cmp         r2, r3
 | 
					        cmp         r2, r3
 | 
				
			||||||
        bhi         __memcpy_chk_fail
 | 
					        bhi         __memcpy_chk_fail
 | 
				
			||||||
@@ -81,12 +83,12 @@ ENTRY(memcpy)
 | 
				
			|||||||
         */
 | 
					         */
 | 
				
			||||||
        movs        r12, r3, lsl #31
 | 
					        movs        r12, r3, lsl #31
 | 
				
			||||||
        sub         r2, r2, r3      /* we know that r3 <= r2 because r2 >= 4 */
 | 
					        sub         r2, r2, r3      /* we know that r3 <= r2 because r2 >= 4 */
 | 
				
			||||||
        ldrmib      r3, [r1], #1
 | 
					        ldrbmi      r3, [r1], #1
 | 
				
			||||||
        ldrcsb      r4, [r1], #1
 | 
					        ldrbcs      r4, [r1], #1
 | 
				
			||||||
        ldrcsb      r12,[r1], #1
 | 
					        ldrbcs      r12,[r1], #1
 | 
				
			||||||
        strmib      r3, [r0], #1
 | 
					        strbmi      r3, [r0], #1
 | 
				
			||||||
        strcsb      r4, [r0], #1
 | 
					        strbcs      r4, [r0], #1
 | 
				
			||||||
        strcsb      r12,[r0], #1
 | 
					        strbcs      r12,[r0], #1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.Lsrc_aligned:
 | 
					.Lsrc_aligned:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -109,10 +111,10 @@ ENTRY(memcpy)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /* conditionally copies 0 to 7 words (length in r3) */
 | 
					        /* conditionally copies 0 to 7 words (length in r3) */
 | 
				
			||||||
        movs        r12, r3, lsl #28
 | 
					        movs        r12, r3, lsl #28
 | 
				
			||||||
        ldmcsia     r1!, {r4, r5, r6, r7}   /* 16 bytes */
 | 
					        ldmcs       r1!, {r4, r5, r6, r7}   /* 16 bytes */
 | 
				
			||||||
        ldmmiia     r1!, {r8, r9}           /*  8 bytes */
 | 
					        ldmmi       r1!, {r8, r9}           /*  8 bytes */
 | 
				
			||||||
        stmcsia     r0!, {r4, r5, r6, r7}
 | 
					        stmcs       r0!, {r4, r5, r6, r7}
 | 
				
			||||||
        stmmiia     r0!, {r8, r9}
 | 
					        stmmi       r0!, {r8, r9}
 | 
				
			||||||
        tst         r3, #0x4
 | 
					        tst         r3, #0x4
 | 
				
			||||||
        ldrne       r10,[r1], #4            /*  4 bytes */
 | 
					        ldrne       r10,[r1], #4            /*  4 bytes */
 | 
				
			||||||
        strne       r10,[r0], #4
 | 
					        strne       r10,[r0], #4
 | 
				
			||||||
@@ -177,18 +179,18 @@ ENTRY(memcpy)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /* conditionnaly copies 0 to 31 bytes */
 | 
					        /* conditionnaly copies 0 to 31 bytes */
 | 
				
			||||||
        movs        r12, r2, lsl #28
 | 
					        movs        r12, r2, lsl #28
 | 
				
			||||||
        ldmcsia     r1!, {r4, r5, r6, r7}   /* 16 bytes */
 | 
					        ldmcs       r1!, {r4, r5, r6, r7}   /* 16 bytes */
 | 
				
			||||||
        ldmmiia     r1!, {r8, r9}           /*  8 bytes */
 | 
					        ldmmi       r1!, {r8, r9}           /*  8 bytes */
 | 
				
			||||||
        stmcsia     r0!, {r4, r5, r6, r7}
 | 
					        stmcs       r0!, {r4, r5, r6, r7}
 | 
				
			||||||
        stmmiia     r0!, {r8, r9}
 | 
					        stmmi       r0!, {r8, r9}
 | 
				
			||||||
        movs        r12, r2, lsl #30
 | 
					        movs        r12, r2, lsl #30
 | 
				
			||||||
        ldrcs       r3, [r1], #4            /*  4 bytes */
 | 
					        ldrcs       r3, [r1], #4            /*  4 bytes */
 | 
				
			||||||
        ldrmih      r4, [r1], #2            /*  2 bytes */
 | 
					        ldrhmi      r4, [r1], #2            /*  2 bytes */
 | 
				
			||||||
        strcs       r3, [r0], #4
 | 
					        strcs       r3, [r0], #4
 | 
				
			||||||
        strmih      r4, [r0], #2
 | 
					        strhmi      r4, [r0], #2
 | 
				
			||||||
        tst         r2, #0x1
 | 
					        tst         r2, #0x1
 | 
				
			||||||
        ldrneb      r3, [r1]                /*  last byte  */
 | 
					        ldrbne      r3, [r1]                /*  last byte  */
 | 
				
			||||||
        strneb      r3, [r0]
 | 
					        strbne      r3, [r0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* we're done! restore everything and return */
 | 
					        /* we're done! restore everything and return */
 | 
				
			||||||
1:      ldmfd       sp!, {r5-r11}
 | 
					1:      ldmfd       sp!, {r5-r11}
 | 
				
			||||||
@@ -228,11 +230,11 @@ ENTRY(memcpy)
 | 
				
			|||||||
         * becomes aligned to 32 bits (r5 = nb of words to copy for alignment)
 | 
					         * becomes aligned to 32 bits (r5 = nb of words to copy for alignment)
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        movs        r5, r5, lsl #31
 | 
					        movs        r5, r5, lsl #31
 | 
				
			||||||
        strmib      r3, [r0], #1
 | 
					        strbmi      r3, [r0], #1
 | 
				
			||||||
        movmi       r3, r3, lsr #8
 | 
					        movmi       r3, r3, lsr #8
 | 
				
			||||||
        strcsb      r3, [r0], #1
 | 
					        strbcs      r3, [r0], #1
 | 
				
			||||||
        movcs       r3, r3, lsr #8
 | 
					        movcs       r3, r3, lsr #8
 | 
				
			||||||
        strcsb      r3, [r0], #1
 | 
					        strbcs      r3, [r0], #1
 | 
				
			||||||
        movcs       r3, r3, lsr #8
 | 
					        movcs       r3, r3, lsr #8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cmp         r2, #4
 | 
					        cmp         r2, #4
 | 
				
			||||||
@@ -363,23 +365,23 @@ ENTRY(memcpy)
 | 
				
			|||||||
.Lpartial_word_tail:
 | 
					.Lpartial_word_tail:
 | 
				
			||||||
        /* we have a partial word in the input buffer */
 | 
					        /* we have a partial word in the input buffer */
 | 
				
			||||||
        movs        r5, lr, lsl #(31-3)
 | 
					        movs        r5, lr, lsl #(31-3)
 | 
				
			||||||
        strmib      r3, [r0], #1
 | 
					        strbmi      r3, [r0], #1
 | 
				
			||||||
        movmi       r3, r3, lsr #8
 | 
					        movmi       r3, r3, lsr #8
 | 
				
			||||||
        strcsb      r3, [r0], #1
 | 
					        strbcs      r3, [r0], #1
 | 
				
			||||||
        movcs       r3, r3, lsr #8
 | 
					        movcs       r3, r3, lsr #8
 | 
				
			||||||
        strcsb      r3, [r0], #1
 | 
					        strbcs      r3, [r0], #1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Refill spilled registers from the stack. Don't update sp. */
 | 
					        /* Refill spilled registers from the stack. Don't update sp. */
 | 
				
			||||||
        ldmfd       sp, {r5-r11}
 | 
					        ldmfd       sp, {r5-r11}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.Lcopy_last_3_and_return:
 | 
					.Lcopy_last_3_and_return:
 | 
				
			||||||
        movs        r2, r2, lsl #31 /* copy remaining 0, 1, 2 or 3 bytes */
 | 
					        movs        r2, r2, lsl #31 /* copy remaining 0, 1, 2 or 3 bytes */
 | 
				
			||||||
        ldrmib      r2, [r1], #1
 | 
					        ldrbmi      r2, [r1], #1
 | 
				
			||||||
        ldrcsb      r3, [r1], #1
 | 
					        ldrbcs      r3, [r1], #1
 | 
				
			||||||
        ldrcsb      r12,[r1]
 | 
					        ldrbcs      r12,[r1]
 | 
				
			||||||
        strmib      r2, [r0], #1
 | 
					        strbmi      r2, [r0], #1
 | 
				
			||||||
        strcsb      r3, [r0], #1
 | 
					        strbcs      r3, [r0], #1
 | 
				
			||||||
        strcsb      r12,[r0]
 | 
					        strbcs      r12,[r0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* we're done! restore sp and spilled registers and return */
 | 
					        /* we're done! restore sp and spilled registers and return */
 | 
				
			||||||
        add         sp,  sp, #28
 | 
					        add         sp,  sp, #28
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,8 @@
 | 
				
			|||||||
         * memset() returns its first argument.
 | 
					         * memset() returns its first argument.
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         .syntax unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(__memset_chk)
 | 
					ENTRY(__memset_chk)
 | 
				
			||||||
        cmp         r2, r3
 | 
					        cmp         r2, r3
 | 
				
			||||||
        bls         done
 | 
					        bls         done
 | 
				
			||||||
@@ -76,11 +78,11 @@ ENTRY(memset)
 | 
				
			|||||||
        orr         r1, r1, r1, lsr #16
 | 
					        orr         r1, r1, r1, lsr #16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        movs        r12, r3, lsl #31
 | 
					        movs        r12, r3, lsl #31
 | 
				
			||||||
        strcsb      r1, [r0], #1    /* can't use strh (alignment unknown) */
 | 
					        strbcs      r1, [r0], #1    /* can't use strh (alignment unknown) */
 | 
				
			||||||
        strcsb      r1, [r0], #1
 | 
					        strbcs      r1, [r0], #1
 | 
				
			||||||
        strmib      r1, [r0], #1
 | 
					        strbmi      r1, [r0], #1
 | 
				
			||||||
        subs        r2, r2, r3
 | 
					        subs        r2, r2, r3
 | 
				
			||||||
        ldmlsfd     sp!, {r0, r4-r7, lr}    /* return */
 | 
					        popls       {r0, r4-r7, lr}    /* return */
 | 
				
			||||||
        bxls        lr
 | 
					        bxls        lr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* align the destination to a cache-line */
 | 
					        /* align the destination to a cache-line */
 | 
				
			||||||
@@ -100,9 +102,9 @@ ENTRY(memset)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /* conditionally writes 0 to 7 words (length in r3) */
 | 
					        /* conditionally writes 0 to 7 words (length in r3) */
 | 
				
			||||||
        movs        r3, r3, lsl #28
 | 
					        movs        r3, r3, lsl #28
 | 
				
			||||||
        stmcsia     r0!, {r1, lr}
 | 
					        stmcs       r0!, {r1, lr}
 | 
				
			||||||
        stmcsia     r0!, {r1, lr}
 | 
					        stmcs       r0!, {r1, lr}
 | 
				
			||||||
        stmmiia     r0!, {r1, lr}
 | 
					        stmmi       r0!, {r1, lr}
 | 
				
			||||||
        movs        r3, r3, lsl #2
 | 
					        movs        r3, r3, lsl #2
 | 
				
			||||||
        strcs       r1, [r0], #4
 | 
					        strcs       r1, [r0], #4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -117,13 +119,13 @@ ENTRY(memset)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        /* conditionally stores 0 to 31 bytes */
 | 
					        /* conditionally stores 0 to 31 bytes */
 | 
				
			||||||
        movs        r2, r2, lsl #28
 | 
					        movs        r2, r2, lsl #28
 | 
				
			||||||
        stmcsia     r0!, {r1,r3,r12,lr}
 | 
					        stmcs       r0!, {r1,r3,r12,lr}
 | 
				
			||||||
        stmmiia     r0!, {r1, lr}
 | 
					        stmmi       r0!, {r1, lr}
 | 
				
			||||||
        movs        r2, r2, lsl #2
 | 
					        movs        r2, r2, lsl #2
 | 
				
			||||||
        strcs       r1, [r0], #4
 | 
					        strcs       r1, [r0], #4
 | 
				
			||||||
        strmih      r1, [r0], #2
 | 
					        strhmi      r1, [r0], #2
 | 
				
			||||||
        movs        r2, r2, lsl #2
 | 
					        movs        r2, r2, lsl #2
 | 
				
			||||||
        strcsb      r1, [r0]
 | 
					        strbcs      r1, [r0]
 | 
				
			||||||
        ldmfd       sp!, {r0, r4-r7, lr}
 | 
					        ldmfd       sp!, {r0, r4-r7, lr}
 | 
				
			||||||
        bx          lr
 | 
					        bx          lr
 | 
				
			||||||
END(memset)
 | 
					END(memset)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,6 +32,8 @@
 | 
				
			|||||||
#include <machine/cpu-features.h>
 | 
					#include <machine/cpu-features.h>
 | 
				
			||||||
#include <private/bionic_asm.h>
 | 
					#include <private/bionic_asm.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.syntax unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(strcpy)
 | 
					ENTRY(strcpy)
 | 
				
			||||||
	pld	[r1, #0]
 | 
						pld	[r1, #0]
 | 
				
			||||||
	eor	r2, r0, r1
 | 
						eor	r2, r0, r1
 | 
				
			||||||
@@ -108,15 +110,15 @@ ENTRY(strcpy)
 | 
				
			|||||||
#ifdef __ARMEB__
 | 
					#ifdef __ARMEB__
 | 
				
			||||||
	tst	r2, #0xff00
 | 
						tst	r2, #0xff00
 | 
				
			||||||
	iteet	ne
 | 
						iteet	ne
 | 
				
			||||||
	strneh	r2, [ip], #2
 | 
						strhne	r2, [ip], #2
 | 
				
			||||||
	lsreq	r2, r2, #8
 | 
						lsreq	r2, r2, #8
 | 
				
			||||||
	streqb	r2, [ip]
 | 
						strbeq	r2, [ip]
 | 
				
			||||||
	tstne	r2, #0xff
 | 
						tstne	r2, #0xff
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	tst	r2, #0xff
 | 
						tst	r2, #0xff
 | 
				
			||||||
	itet	ne
 | 
						itet	ne
 | 
				
			||||||
	strneh	r2, [ip], #2
 | 
						strhne	r2, [ip], #2
 | 
				
			||||||
	streqb	r2, [ip]
 | 
						strbeq	r2, [ip]
 | 
				
			||||||
	tstne	r2, #0xff00
 | 
						tstne	r2, #0xff00
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	bne	5b
 | 
						bne	5b
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -37,6 +37,7 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .fpu    neon
 | 
					    .fpu    neon
 | 
				
			||||||
 | 
					    .syntax unified
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ENTRY(__memset_chk)
 | 
					ENTRY(__memset_chk)
 | 
				
			||||||
        cmp         r2, r3
 | 
					        cmp         r2, r3
 | 
				
			||||||
@@ -98,9 +99,9 @@ ENTRY(memset)
 | 
				
			|||||||
1:      bge         2f
 | 
					1:      bge         2f
 | 
				
			||||||
        vst1.32     {d0[0]}, [r0]!
 | 
					        vst1.32     {d0[0]}, [r0]!
 | 
				
			||||||
2:      movs        ip, r2, lsl #31
 | 
					2:      movs        ip, r2, lsl #31
 | 
				
			||||||
        strmib      r1, [r0], #1
 | 
					        strbmi      r1, [r0], #1
 | 
				
			||||||
        strcsb      r1, [r0], #1
 | 
					        strbcs      r1, [r0], #1
 | 
				
			||||||
        strcsb      r1, [r0], #1
 | 
					        strbcs      r1, [r0], #1
 | 
				
			||||||
        ldmfd       sp!, {r0}
 | 
					        ldmfd       sp!, {r0}
 | 
				
			||||||
        bx          lr
 | 
					        bx          lr
 | 
				
			||||||
END(memset)
 | 
					END(memset)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -101,7 +101,7 @@ ENTRY(memchr)
 | 
				
			|||||||
	and	vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b
 | 
						and	vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b
 | 
				
			||||||
	addp	vend.16b, vhas_chr1.16b, vhas_chr2.16b		/* 256->128 */
 | 
						addp	vend.16b, vhas_chr1.16b, vhas_chr2.16b		/* 256->128 */
 | 
				
			||||||
	addp	vend.16b, vend.16b, vend.16b			/* 128->64 */
 | 
						addp	vend.16b, vend.16b, vend.16b			/* 128->64 */
 | 
				
			||||||
	mov	synd, vend.2d[0]
 | 
						mov	synd, vend.d[0]
 | 
				
			||||||
	/* Clear the soff*2 lower bits */
 | 
						/* Clear the soff*2 lower bits */
 | 
				
			||||||
	lsl	tmp, soff, #1
 | 
						lsl	tmp, soff, #1
 | 
				
			||||||
	lsr	synd, synd, tmp
 | 
						lsr	synd, synd, tmp
 | 
				
			||||||
@@ -121,7 +121,7 @@ ENTRY(memchr)
 | 
				
			|||||||
	/* Use a fast check for the termination condition */
 | 
						/* Use a fast check for the termination condition */
 | 
				
			||||||
	orr	vend.16b, vhas_chr1.16b, vhas_chr2.16b
 | 
						orr	vend.16b, vhas_chr1.16b, vhas_chr2.16b
 | 
				
			||||||
	addp	vend.2d, vend.2d, vend.2d
 | 
						addp	vend.2d, vend.2d, vend.2d
 | 
				
			||||||
	mov	synd, vend.2d[0]
 | 
						mov	synd, vend.d[0]
 | 
				
			||||||
	/* We're not out of data, loop if we haven't found the character */
 | 
						/* We're not out of data, loop if we haven't found the character */
 | 
				
			||||||
	cbz	synd, .Lloop
 | 
						cbz	synd, .Lloop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -131,7 +131,7 @@ ENTRY(memchr)
 | 
				
			|||||||
	and	vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b
 | 
						and	vhas_chr2.16b, vhas_chr2.16b, vrepmask.16b
 | 
				
			||||||
	addp	vend.16b, vhas_chr1.16b, vhas_chr2.16b		/* 256->128 */
 | 
						addp	vend.16b, vhas_chr1.16b, vhas_chr2.16b		/* 256->128 */
 | 
				
			||||||
	addp	vend.16b, vend.16b, vend.16b			/* 128->64 */
 | 
						addp	vend.16b, vend.16b, vend.16b			/* 128->64 */
 | 
				
			||||||
	mov	synd, vend.2d[0]
 | 
						mov	synd, vend.d[0]
 | 
				
			||||||
	/* Only do the clear for the last possible block */
 | 
						/* Only do the clear for the last possible block */
 | 
				
			||||||
	b.hi	.Ltail
 | 
						b.hi	.Ltail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -109,7 +109,7 @@ ENTRY(strchr)
 | 
				
			|||||||
	addp	vend1.16b, vend1.16b, vend2.16b		// 128->64
 | 
						addp	vend1.16b, vend1.16b, vend2.16b		// 128->64
 | 
				
			||||||
	lsr	tmp1, tmp3, tmp1
 | 
						lsr	tmp1, tmp3, tmp1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mov	tmp3, vend1.2d[0]
 | 
						mov	tmp3, vend1.d[0]
 | 
				
			||||||
	bic	tmp1, tmp3, tmp1	// Mask padding bits.
 | 
						bic	tmp1, tmp3, tmp1	// Mask padding bits.
 | 
				
			||||||
	cbnz	tmp1, .Ltail
 | 
						cbnz	tmp1, .Ltail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -124,7 +124,7 @@ ENTRY(strchr)
 | 
				
			|||||||
	orr	vend2.16b, vhas_nul2.16b, vhas_chr2.16b
 | 
						orr	vend2.16b, vhas_nul2.16b, vhas_chr2.16b
 | 
				
			||||||
	orr	vend1.16b, vend1.16b, vend2.16b
 | 
						orr	vend1.16b, vend1.16b, vend2.16b
 | 
				
			||||||
	addp	vend1.2d, vend1.2d, vend1.2d
 | 
						addp	vend1.2d, vend1.2d, vend1.2d
 | 
				
			||||||
	mov	tmp1, vend1.2d[0]
 | 
						mov	tmp1, vend1.d[0]
 | 
				
			||||||
	cbz	tmp1, .Lloop
 | 
						cbz	tmp1, .Lloop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Termination condition found.  Now need to establish exactly why
 | 
						/* Termination condition found.  Now need to establish exactly why
 | 
				
			||||||
@@ -138,7 +138,7 @@ ENTRY(strchr)
 | 
				
			|||||||
	addp	vend1.16b, vend1.16b, vend2.16b		// 256->128
 | 
						addp	vend1.16b, vend1.16b, vend2.16b		// 256->128
 | 
				
			||||||
	addp	vend1.16b, vend1.16b, vend2.16b		// 128->64
 | 
						addp	vend1.16b, vend1.16b, vend2.16b		// 128->64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mov	tmp1, vend1.2d[0]
 | 
						mov	tmp1, vend1.d[0]
 | 
				
			||||||
.Ltail:
 | 
					.Ltail:
 | 
				
			||||||
	/* Count the trailing zeros, by bit reversing...  */
 | 
						/* Count the trailing zeros, by bit reversing...  */
 | 
				
			||||||
	rbit	tmp1, tmp1
 | 
						rbit	tmp1, tmp1
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user