[ARM] Factor out the thumb2 -Os implementation.
The patch moves the inline ASM thumb2 -Os implementation out into its
own .S file.
Tested by building newlib and comparing libc.a binaries before and
after for all permutations of:
      Architectures:
        armv4 armv4t armv5 armv5t armv5te armv6 armv6j armv6k
        armv6z armv6kz armv6t2 armv6-m armv6s-m armv7 armv7-a
        armv7ve armv7-r armv7-m armv7e-m armv8-a iwmmxt iwmmxt2
      ISAs:
        thumb arm
      Optimization Levels:
        Os O2
      Excluding:
        armv6s-m -mthumb
        armv6-m -mthumb
        armv6zk -mthumb
        armv6z -mthumb
        armv6k -mthumb
        armv6j -mthumb
			
			
This commit is contained in:
		| @@ -1,3 +1,9 @@ | ||||
| 2015-11-23  Marcus Shawcroft  <marcus.shawcroft@arm.com> | ||||
|  | ||||
| 	* libc/machine/arm/strlen-stub.c: Move T2 -O2 implementation to... | ||||
| 	* libc/machine/arm/strlen-thumb2-Os.S: New file. | ||||
| 	* libc/machine/arm/strlen.S: Include strlen-thumb2-Os.S. | ||||
|  | ||||
| 2015-11-21  Corinna Vinschen  <corinna@vinschen.de> | ||||
|  | ||||
| 	* libc/stdlib/strtodg.c: Define USE_LOCALE. | ||||
|   | ||||
| @@ -36,18 +36,8 @@ | ||||
| /* Implemented in strlen.S.  */ | ||||
|  | ||||
| #else | ||||
| size_t | ||||
| strlen (const char* str) | ||||
| { | ||||
|   int scratch; | ||||
|   const char* end; | ||||
|   asm ("1:\n\t" | ||||
|        "ldrb	%1, [%0], #1\n\t" | ||||
|        "cmp	%1, #0\n\t" | ||||
|        "bne	1b" | ||||
|        : "=&r" (end), "=&r" (scratch) : "0" (str) : "memory", "cc"); | ||||
|   return end - str - 1; | ||||
| } | ||||
| /* Implemented in strlen.S.  */ | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #else /* defined __OPTIMIZE_SIZE__ || defined PREFER_SIZE_OVER_SPEED */ | ||||
|   | ||||
							
								
								
									
										54
									
								
								newlib/libc/machine/arm/strlen-thumb2-Os.S
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								newlib/libc/machine/arm/strlen-thumb2-Os.S
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | ||||
| /* Copyright (c) 2015 ARM Ltd. | ||||
|    All rights reserved. | ||||
|  | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|        * Redistributions of source code must retain the above copyright | ||||
| 	 notice, this list of conditions and the following disclaimer. | ||||
|        * Redistributions in binary form must reproduce the above copyright | ||||
| 	 notice, this list of conditions and the following disclaimer in the | ||||
| 	 documentation and/or other materials provided with the distribution. | ||||
|        * Neither the name of the Linaro nor the | ||||
| 	 names of its contributors may be used to endorse or promote products | ||||
| 	 derived from this software without specific prior written permission. | ||||
|  | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
|    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
|    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
|    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT | ||||
|    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
|    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */ | ||||
|  | ||||
| #include "acle-compat.h" | ||||
|  | ||||
| 	.macro def_fn f p2align=0 | ||||
| 	.text | ||||
| 	.p2align \p2align | ||||
| 	.global \f | ||||
| 	.type \f, %function | ||||
| \f: | ||||
| 	.endm | ||||
|  | ||||
| #if __ARM_ARCH_ISA_THUMB >= 2 && __ARM_ARCH >= 7 | ||||
| 	.arch   armv7 | ||||
| #else | ||||
| 	.arch	armv6t2 | ||||
| #endif | ||||
| 	.eabi_attribute Tag_ARM_ISA_use, 0 | ||||
| 	.thumb | ||||
| 	.syntax unified | ||||
|  | ||||
| def_fn	strlen p2align=1 | ||||
| 	mov     r3, r0 | ||||
| 1:	ldrb.w  r2, [r3], #1 | ||||
| 	cmp     r2, #0 | ||||
| 	bne	1b | ||||
| 	subs    r0, r3, r0 | ||||
| 	subs    r0, #1 | ||||
| 	bx      lr | ||||
| 	.size	strlen, . - strlen | ||||
| @@ -31,7 +31,7 @@ | ||||
| #include "strlen-thumb1-Os.S" | ||||
|  | ||||
| #else | ||||
|   /* Implemented in strlen-stub.c.  */ | ||||
| #include "strlen-thumb2-Os.S" | ||||
|  | ||||
| #endif | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user