From patchwork Mon Nov 16 16:28:22 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcus Shawcroft X-Patchwork-Id: 56664 Delivered-To: patch@linaro.org Received: by 10.112.155.196 with SMTP id vy4csp1414961lbb; Mon, 16 Nov 2015 08:28:17 -0800 (PST) X-Received: by 10.66.124.165 with SMTP id mj5mr54778846pab.97.1447691296470; Mon, 16 Nov 2015 08:28:16 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id ww1si51153512pab.181.2015.11.16.08.28.16 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 16 Nov 2015 08:28:16 -0800 (PST) Received-SPF: pass (google.com: domain of newlib-return-12923-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; spf=pass (google.com: domain of newlib-return-12923-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=newlib-return-12923-patch=linaro.org@sourceware.org; dkim=pass header.i=@sourceware.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:to:cc:from:subject:message-id:date :mime-version:content-type; q=dns; s=default; b=wTWn4fQFzvVfPMa1 2o5E6fFTZzJnRYuWlRvyVJ5PqXl1q3atBffYt3Wyxd7T7M1g1fFXLROygnNn1YOq 9GFJyEZvfGJ5fTjP/kjErjhHXW5i8Q5ZUvBPbGnThWd614gHmw6fPXHsUJrYQgRJ UMjyVh6nRBUQ1I8MMqWtLqDsPBg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:to:cc:from:subject:message-id:date :mime-version:content-type; s=default; bh=OpN9jsvZGXN4owBU9ZcRqi RghOM=; b=uF12a7DNXW4dEopTzFvZ3qB0MAWrxrvwWum4GJtCO0ofjMWOPpC2uS T1EZrI35aiZaKA9LB2HYR/2I5LFtPNG7szYrJhuy8flZmY3BUMSaXtEcOqQoBqHh FfXYNibwJO1yG3W7cK9UY6iEYMdEiYDYMj+wwywsKVvNDEnI/oKjI= Received: (qmail 37492 invoked by alias); 16 Nov 2015 16:28:08 -0000 Mailing-List: contact newlib-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-owner@sourceware.org Delivered-To: mailing list newlib@sourceware.org Received: (qmail 37482 invoked by uid 89); 16 Nov 2015 16:28:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, SPF_PASS autolearn=ham version=3.3.2 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (207.82.80.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 16 Nov 2015 16:28:06 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.140]) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-8-P6i71UTxQq-HofzpRWS7qw-1; Mon, 16 Nov 2015 16:27:58 +0000 Received: from [10.2.207.27] ([10.1.2.79]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Mon, 16 Nov 2015 16:27:57 +0000 To: "newlib@sourceware.org" Cc: Richard Earnshaw From: Marcus Shawcroft Subject: [ARM] Factor out the thumb2 -Os implementation. Message-ID: <564A0426.5070402@arm.com> Date: Mon, 16 Nov 2015 16:28:22 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-Version: 1.0 X-MC-Unique: P6i71UTxQq-HofzpRWS7qw-1 This 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 OK? /Marcus * 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. diff --git a/newlib/ChangeLog b/newlib/ChangeLog index f2a30a1..33d0d0a 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,5 +1,11 @@ 2015-11-13 Marcus Shawcroft + * 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-13 Marcus Shawcroft + * libc/machine/arm/strlen-stub.c: Move T1 -O2 implementation to... * libc/machine/arm/strlen-thumb1-Os.S: New file. * libc/machine/arm/strlen.S: Include strlen-thumb1-Os.S. diff --git a/newlib/libc/machine/arm/strlen-stub.c b/newlib/libc/machine/arm/strlen-stub.c index d77c7fc..97500e0 100644 --- a/newlib/libc/machine/arm/strlen-stub.c +++ b/newlib/libc/machine/arm/strlen-stub.c @@ -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 */ diff --git a/newlib/libc/machine/arm/strlen-thumb2-Os.S b/newlib/libc/machine/arm/strlen-thumb2-Os.S new file mode 100644 index 0000000..2885bcc --- /dev/null +++ b/newlib/libc/machine/arm/strlen-thumb2-Os.S @@ -0,0 +1,48 @@ +/* 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. */ + + .macro def_fn f p2align=0 + .text + .p2align \p2align + .global \f + .type \f, %function +\f: + .endm + + .arch armv6t2 + .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 diff --git a/newlib/libc/machine/arm/strlen.S b/newlib/libc/machine/arm/strlen.S index ec61ae2..e0dd122 100644 --- a/newlib/libc/machine/arm/strlen.S +++ b/newlib/libc/machine/arm/strlen.S @@ -31,7 +31,7 @@ #include "strlen-thumb1-Os.S" #else - /* Implemented in strlen-stub.c. */ +#include "strlen-thumb2-Os.S" #endif -- 1.9.1