From 49889fb256a7f9b894b2d16fea23de1ac25b65e2 Mon Sep 17 00:00:00 2001 From: Noah Goldstein Date: Wed, 13 Jul 2022 16:33:01 -0700 Subject: x86: Add support to build st{p|r}{n}{cpy|cat} with explicit ISA level 1. Add default ISA level selection in non-multiarch/rtld implementations. 2. Add ISA level build guards to different implementations. - I.e strcpy-avx2.S which is ISA level 3 will only build if compiled ISA level <= 3. Otherwise there is no reason to include it as we will always use one of the ISA level 4 implementations (strcpy-evex.S). 3. Refactor the ifunc selector and ifunc implementation list to use the ISA level aware wrapper macros that allow functions below the compiled ISA level (with a guranteed replacement) to be skipped. Tested with and without multiarch on x86_64 for ISA levels: {generic, x86-64-v2, x86-64-v3, x86-64-v4} And m32 with and without multiarch. --- sysdeps/x86_64/multiarch/strcpy-sse2.S | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'sysdeps/x86_64/multiarch/strcpy-sse2.S') diff --git a/sysdeps/x86_64/multiarch/strcpy-sse2.S b/sysdeps/x86_64/multiarch/strcpy-sse2.S index 8b5db8b13d..e29b411314 100644 --- a/sysdeps/x86_64/multiarch/strcpy-sse2.S +++ b/sysdeps/x86_64/multiarch/strcpy-sse2.S @@ -1,5 +1,5 @@ -/* strcpy optimized with SSE2. - Copyright (C) 2017-2022 Free Software Foundation, Inc. +/* strcpy/stpcpy implementation for x86-64. + Copyright (C) 2002-2022 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -16,13 +16,15 @@ License along with the GNU C Library; if not, see . */ -#if IS_IN (libc) -# ifndef STRCPY +#include + +#if ISA_SHOULD_BUILD (1) + +# include + +# ifndef STPCPY # define STRCPY __strcpy_sse2 # endif -#endif - -#include .text ENTRY (STRCPY) @@ -144,10 +146,11 @@ ENTRY (STRCPY) jmp 3b /* and look at next two bytes in %rax. */ 4: -#ifdef USE_AS_STPCPY +# ifdef USE_AS_STPCPY movq %rdx, %rax /* Destination is return value. */ -#else +# else movq %rdi, %rax /* Source is return value. */ -#endif +# endif retq END (STRCPY) +#endif -- cgit 1.4.1