From patchwork Wed Sep 5 17:11:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Myers X-Patchwork-Id: 29209 Received: (qmail 89635 invoked by alias); 5 Sep 2018 17:11:51 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 89614 invoked by uid 89); 5 Sep 2018 17:11:50 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=evidence, advised X-HELO: relay1.mentorg.com Date: Wed, 5 Sep 2018 17:11:43 +0000 From: Joseph Myers To: Subject: Remove x86_64 math_private.h asms Message-ID: User-Agent: Alpine 2.21 (DEB 202 2017-01-01) MIME-Version: 1.0 The x86_64 math_private.h has asm versions of the macros to reinterpret between floating-point and integer types. This is the sort of thing we now strongly discourage; the expectation in such cases, where the generic C code gives the compiler all the information needed about the required semantics, is that you should get the compiler to do the right thing for the generic C code rather than writing an asm version. Trivial tests showed GCC generates the expected single instructions for reinterpretation from floating point to integer. In the other direction, it goes via memory when the asms don't; I asked about this in GCC bug 87236 and was advised this was deliberate for generic tuning because it was faster that way on some AMD processors (but -mtune=intel, and -Os with the latest GCC, avoid going via memory). The asms don't and can't know about those tuning details, so that's evidence that they are actually making the code worse. This patch removes the asms accordingly. Tested for x86_64. Does anyone see a reason not to make this change? 2018-09-05 Joseph Myers * sysdeps/x86_64/fpu/math_private.h (MOVD): Remove macro. (MOVQ): Likewise. (EXTRACT_WORDS64): Likewise. (INSERT_WORDS64): Likewise. (GET_FLOAT_WORD): Likewise. (SET_FLOAT_WORD): Likewise. diff --git a/sysdeps/x86_64/fpu/math_private.h b/sysdeps/x86_64/fpu/math_private.h index fcc8537d40..306875f92b 100644 --- a/sysdeps/x86_64/fpu/math_private.h +++ b/sysdeps/x86_64/fpu/math_private.h @@ -1,50 +1,6 @@ #ifndef X86_64_MATH_PRIVATE_H #define X86_64_MATH_PRIVATE_H 1 -/* We can do a few things better on x86-64. */ - -#if defined __AVX__ || defined SSE2AVX -# define MOVD "vmovd" -# define MOVQ "vmovq" -#else -# define MOVD "movd" -# define MOVQ "movq" -#endif - -/* Direct movement of float into integer register. */ -#define EXTRACT_WORDS64(i, d) \ - do { \ - int64_t i_; \ - asm (MOVQ " %1, %0" : "=rm" (i_) : "x" ((double) (d))); \ - (i) = i_; \ - } while (0) - -/* And the reverse. */ -#define INSERT_WORDS64(d, i) \ - do { \ - int64_t i_ = i; \ - double d__; \ - asm (MOVQ " %1, %0" : "=x" (d__) : "rm" (i_)); \ - d = d__; \ - } while (0) - -/* Direct movement of float into integer register. */ -#define GET_FLOAT_WORD(i, d) \ - do { \ - int i_; \ - asm (MOVD " %1, %0" : "=rm" (i_) : "x" ((float) (d))); \ - (i) = i_; \ - } while (0) - -/* And the reverse. */ -#define SET_FLOAT_WORD(f, i) \ - do { \ - int i_ = i; \ - float f__; \ - asm (MOVD " %1, %0" : "=x" (f__) : "rm" (i_)); \ - f = f__; \ - } while (0) - #include_next #ifdef __SSE4_1__