From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 103251 invoked by alias); 29 Aug 2018 14:07:23 -0000 Mailing-List: contact newlib-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-cvs-owner@sourceware.org Received: (qmail 103130 invoked by uid 9078); 29 Aug 2018 14:07:22 -0000 Date: Wed, 29 Aug 2018 14:07:00 -0000 Message-ID: <20180829140722.103124.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] Use __inhibit_loop_to_libcall in all memset/memcpy implementations X-Act-Checkin: newlib-cygwin X-Git-Author: Keith Packard X-Git-Refname: refs/heads/master X-Git-Oldrev: 088a45cdf6a01059b5c4a7565e83c2bca83c8da5 X-Git-Newrev: 82dfae9ab0734b9946321590162dc6021057fec1 X-SW-Source: 2018-q3/txt/msg00104.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=82dfae9ab0734b9946321590162dc6021057fec1 commit 82dfae9ab0734b9946321590162dc6021057fec1 Author: Keith Packard Date: Mon Aug 27 11:32:31 2018 -0700 Use __inhibit_loop_to_libcall in all memset/memcpy implementations This macro selects a compiler option that disables recognition of common memset/memcpy patterns and converting those to direct memset/memcpy calls. Signed-off-by: Keith Packard Diff: --- newlib/libc/machine/cris/memcpy.c | 2 ++ newlib/libc/machine/riscv/memcpy.c | 2 ++ newlib/libc/machine/spu/memcpy.c | 5 ++++- newlib/libc/machine/spu/memcpy_ea.c | 2 ++ newlib/libc/machine/spu/memset_ea.c | 2 ++ newlib/libc/machine/visium/memcpy.c | 5 +++++ newlib/libc/machine/visium/memset.c | 6 +++++- newlib/libc/machine/xscale/memcpy.c | 2 ++ newlib/libc/machine/xscale/memset.c | 2 ++ newlib/libc/string/memcpy.c | 2 ++ 10 files changed, 28 insertions(+), 2 deletions(-) diff --git a/newlib/libc/machine/cris/memcpy.c b/newlib/libc/machine/cris/memcpy.c index c7a1af9..c314ede 100644 --- a/newlib/libc/machine/cris/memcpy.c +++ b/newlib/libc/machine/cris/memcpy.c @@ -31,6 +31,7 @@ than what we describe. An assembly file should be used instead. */ #include +#include "../../string/local.h" /* Break even between movem and move16 is really at 38.7 * 2, but modulo 44, so up to the next multiple of 44, we use ordinary code. */ @@ -40,6 +41,7 @@ __asm__ (".syntax no_register_prefix"); void * +__inhibit_loop_to_libcall memcpy(void *__restrict pdst, const void *__restrict psrc, size_t pn) { /* Now we want the parameters put in special registers. diff --git a/newlib/libc/machine/riscv/memcpy.c b/newlib/libc/machine/riscv/memcpy.c index c717f9f..a0ab78a 100644 --- a/newlib/libc/machine/riscv/memcpy.c +++ b/newlib/libc/machine/riscv/memcpy.c @@ -11,10 +11,12 @@ #include #include +#include "../../string/local.h" #define unlikely(X) __builtin_expect (!!(X), 0) void * +__inhibit_loop_to_libcall memcpy(void *__restrict aa, const void *__restrict bb, size_t n) { #define BODY(a, b, t) { \ diff --git a/newlib/libc/machine/spu/memcpy.c b/newlib/libc/machine/spu/memcpy.c index dbbce8c..0483cd2 100644 --- a/newlib/libc/machine/spu/memcpy.c +++ b/newlib/libc/machine/spu/memcpy.c @@ -33,6 +33,7 @@ #include #include #include +#include "../../string/local.h" /* Copy n bytes from memory area src to memory area dest. * The memory areas may not overlap. The memcpy subroutine @@ -42,7 +43,9 @@ * either with prior knowledge of the alignment or special * casing specific optimal alignments. */ -void * memcpy(void * __restrict__ dest, const void * __restrict__ src, size_t n) +void * +__inhibit_loop_to_libcall +memcpy(void * __restrict__ dest, const void * __restrict__ src, size_t n) { int adjust, delta; unsigned int soffset1, doffset1, doffset2; diff --git a/newlib/libc/machine/spu/memcpy_ea.c b/newlib/libc/machine/spu/memcpy_ea.c index 6dfea7a..ae67f86 100644 --- a/newlib/libc/machine/spu/memcpy_ea.c +++ b/newlib/libc/machine/spu/memcpy_ea.c @@ -34,10 +34,12 @@ POSSIBILITY OF SUCH DAMAGE. #include "ea_internal.h" #include #include +#include "../../string/local.h" COMPAT_EA_ALIAS (memcpy_ea); __ea void * +__inhibit_loop_to_libcall memcpy_ea (__ea void *dest, __ea const void *src, size_ea_t n) { __ea void *curr_dest = dest; diff --git a/newlib/libc/machine/spu/memset_ea.c b/newlib/libc/machine/spu/memset_ea.c index a18baf2..1d60273 100644 --- a/newlib/libc/machine/spu/memset_ea.c +++ b/newlib/libc/machine/spu/memset_ea.c @@ -34,10 +34,12 @@ POSSIBILITY OF SUCH DAMAGE. #include #include "ea_internal.h" #include +#include "../../string/local.h" COMPAT_EA_ALIAS (memset_ea); __ea void * +__inhibit_loop_to_libcall memset_ea (__ea void *dest, int c, size_ea_t n) { __ea void *curr_dest = dest; diff --git a/newlib/libc/machine/visium/memcpy.c b/newlib/libc/machine/visium/memcpy.c index c511006..e644031 100644 --- a/newlib/libc/machine/visium/memcpy.c +++ b/newlib/libc/machine/visium/memcpy.c @@ -31,6 +31,7 @@ #include #include "memcpy.h" +#include "../../string/local.h" #define INST_BARRIER __asm__ __volatile__ ("":::"memory"); @@ -422,6 +423,7 @@ do { \ static inline void +__inhibit_loop_to_libcall __int_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) { int value = n; @@ -562,6 +564,7 @@ __int_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) } static inline void +__inhibit_loop_to_libcall __shrt_int_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) { int value = n; @@ -703,6 +706,7 @@ __shrt_int_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) static inline void +__inhibit_loop_to_libcall __byte_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) { int value = n; @@ -846,6 +850,7 @@ __byte_memcpy (void *__restrict s1, const void *__restrict s2, size_t n) /* Exposed interface. */ void * +__inhibit_loop_to_libcall memcpy (void *__restrict s1, const void *__restrict s2, size_t n) { void *result = s1; diff --git a/newlib/libc/machine/visium/memset.c b/newlib/libc/machine/visium/memset.c index bad64a9..5c3906a 100644 --- a/newlib/libc/machine/visium/memset.c +++ b/newlib/libc/machine/visium/memset.c @@ -31,6 +31,7 @@ #include #include "memset.h" +#include "../../string/local.h" #define SET_32_OBJECTS(out) \ do { \ @@ -228,8 +229,8 @@ do { \ out += 1; \ } while(0) - static inline void +__inhibit_loop_to_libcall __int_memset (void *__restrict s1, int val, size_t n) { int value = n; @@ -369,6 +370,7 @@ __int_memset (void *__restrict s1, int val, size_t n) } static inline void +__inhibit_loop_to_libcall __short_int_memset (void *__restrict s1, int val, size_t n) { int value = n; @@ -508,6 +510,7 @@ __short_int_memset (void *__restrict s1, int val, size_t n) } static inline void +__inhibit_loop_to_libcall __byte_memset (void *__restrict s1, int val, size_t n) { int value = n; @@ -650,6 +653,7 @@ __byte_memset (void *__restrict s1, int val, size_t n) /* Exposed interface. */ void * +__inhibit_loop_to_libcall memset (void *s, int c, size_t n) { void *result = s; diff --git a/newlib/libc/machine/xscale/memcpy.c b/newlib/libc/machine/xscale/memcpy.c index 7de967f..20758e1 100644 --- a/newlib/libc/machine/xscale/memcpy.c +++ b/newlib/libc/machine/xscale/memcpy.c @@ -6,8 +6,10 @@ #include #include "xscale.h" +#include "../../string/local.h" void * +__inhibit_loop_to_libcall memcpy (void *__restrict dst0, const void *__restrict src0, size_t len) { int dummy; diff --git a/newlib/libc/machine/xscale/memset.c b/newlib/libc/machine/xscale/memset.c index 4ff8d01..8fab2a7 100644 --- a/newlib/libc/machine/xscale/memset.c +++ b/newlib/libc/machine/xscale/memset.c @@ -6,8 +6,10 @@ #include #include "xscale.h" +#include "../../string/local.h" void * +__inhibit_loop_to_libcall memset (void *dst, int c, size_t len) { int dummy; diff --git a/newlib/libc/string/memcpy.c b/newlib/libc/string/memcpy.c index a1cff12..52f716b 100644 --- a/newlib/libc/string/memcpy.c +++ b/newlib/libc/string/memcpy.c @@ -29,6 +29,7 @@ QUICKREF #include <_ansi.h> #include +#include "local.h" /* Nonzero if either X or Y is not aligned on a "long" boundary. */ #define UNALIGNED(X, Y) \ @@ -44,6 +45,7 @@ QUICKREF #define TOO_SMALL(LEN) ((LEN) < BIGBLOCKSIZE) void * +__inhibit_loop_to_libcall memcpy (void *__restrict dst0, const void *__restrict src0, size_t len0)