From patchwork Wed Jan 3 18:03:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 123332 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp10466798qgn; Wed, 3 Jan 2018 10:04:08 -0800 (PST) X-Google-Smtp-Source: ACJfBouwkeMWjNh1jqOaN8PkQTWy86yfEN8qlco4x+XXwMPaBLF7hpf/4czEvqHsZbKq0O1zbPGF X-Received: by 10.84.178.129 with SMTP id z1mr2135813plb.365.1515002648702; Wed, 03 Jan 2018 10:04:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1515002648; cv=none; d=google.com; s=arc-20160816; b=KDZ0KooBaL9/5VnIwD9ltpFto9qctm01Phg/bzNi21Sy4uAjnibO9jdguiVo3Vycr8 W3X2S8G4+kuvWqL+zZ7cqNVtVFt2C1VuGg2seAvuCk1tweCviO/VrtCFyuEXZQqOLqno tU/96XXzjc5IQ1bdxh/v3RiCOaHV2XIOWeeFUEGeOfIwwvfy/w3fwNN+lqwOWlwqESJR I7VzNJtrQ+ZwKgE2T2alpQ/DiBjBxcSi8S/Fl00MUP5w7KNpHu9huQd6L500zRhpymJr 4nVUX7+CWksRW03hHr5HV1WkiOYtF3sd7NSxUbccW8GmC4s4l8S0/BAZj7c1o87ggUZW Tfbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:to:from:delivered-to:sender:list-help :list-post:list-archive:list-subscribe:list-unsubscribe:list-id :precedence:mailing-list:dkim-signature:domainkey-signature :arc-authentication-results; bh=XHYY4uIalCteEIDVtRsHstwaqSRcn5elrEYSeTLn7N0=; b=AGeyeRpjs5stn6EXez0ZUhWl5dIaV0b7OzM71dRpuOrNvNKIQ/ptFtMRYsxWYDr2/g 88g4+FRVuOu2BDiMDokOTCABaPZX0FnWRTisSdH86QuE0unibVW2vnAOn8GzyJL5oqWN o7YSqa9RDx7wJJeRBVQ8HPVwFVgnBff7VoykJ5oTb/SXXXFjI2vP9gE4IrjvUfFOy6v+ C+jVWXn+wGUonDBkDegWvPjEnpI/50SJkaVbOeFNdxyEzqH7CGJKgWKye1zdGF4usTLq BxKl/QIqpz7X79NLvsFbmQ/7vMt/QI2aTCJNdyRIAmre/OwjJohh512TFbSkkIJAL2/Y dD4Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=aHQs64Kp; spf=pass (google.com: domain of libc-alpha-return-88808-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88808-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id q1si1016910pfb.74.2018.01.03.10.04.08 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 03 Jan 2018 10:04:08 -0800 (PST) Received-SPF: pass (google.com: domain of libc-alpha-return-88808-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=aHQs64Kp; spf=pass (google.com: domain of libc-alpha-return-88808-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-88808-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.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:from:to:subject:date:message-id; q=dns; s= default; b=vJZHdh+g6qSJbVsgomHIv8ILReHm9WfwHmvjsOh1UBDm7vZ8BKkD/ AKq1JQwfJOvYvV6J52b0BvxlfGIAUjDnKnsUsr9Y6S0F6obU5CMKcwV/jY+1OuQb CWWJ5v5nr9t3KDHttldjpzU2/bGV0NGkjIJpffzIPoH/e82jtz54mo= 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:from:to:subject:date:message-id; s=default; bh=xS/so5Rw9TAGbP1KLL+ak8e9YRo=; b=aHQs64Kp2+0ipRnBRVMhGYx5dnVB 8LKqz1ZWvGGl7X+I60fZWu2zaCSwhuqWh8Bgjr+6k5JHUdlCtz5jDMVJpJbGSarU ctDBB+UDfQZSw1M1PKSGWMYi4PzZFQwnbIYqXC7wuJ+JN9wdLTsT3V7xusZbwNNh 0TnnaD1qwF3Xh2I= Received: (qmail 97661 invoked by alias); 3 Jan 2018 18:03:58 -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 97631 invoked by uid 89); 3 Jan 2018 18:03:58 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_ASCII_DIVIDERS, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qk0-f171.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=XHYY4uIalCteEIDVtRsHstwaqSRcn5elrEYSeTLn7N0=; b=aqQVMokeOie0wTdpMMfptk2Al5o17pl8grk00kw8KzJfBQKOGS8fPApO2NLwVXBCY0 uN7+Bs+ERkYdP4/2lSZ5RcVH8mZeyUB3dI5EbIIPGl5/Vt3VijxG64JGQeTTCyJqF9Wz zDeaIqn6SUp3QCVC/BuKLF4gdDi9uf5DshHGEQNerN6taIojh+JitIAMx2auNHKhg+ih g00U5+322ZJFBxfZhnu9r6qaZ6FVDxzMuu8YBQlQEB0jherNGXyst+orpNiydT5+gEvO kXPHBMnHfKBH4VYwD2OjU/TnB017eEeBtR6YIG6ifDxVgu6z09LOcTzRfnDr1u/ehsZT JMqQ== X-Gm-Message-State: AKGB3mI7qrZDlf/2T60xR9o+8ntRp7NsQZvho5JEiBA3lKf2lWTtIh2y d+opqH5tK14Ehxk95NJxN/loniavFg8= X-Received: by 10.55.81.4 with SMTP id f4mr2617481qkb.162.1515002633351; Wed, 03 Jan 2018 10:03:53 -0800 (PST) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH] alpha: Remove s_ceil{f} and s_floor{f} implementation (BZ#22665) Date: Wed, 3 Jan 2018 16:03:44 -0200 Message-Id: <1515002624-26820-1-git-send-email-adhemerval.zanella@linaro.org> As discussed in libc-alpha [1], alpha ceil{f} and floor{f} implementation uses cvttq/svm and although the Alpha Architecture Handbook version 3 states that that CVTfi OUTPUT Exceptions (B.3 Mapping to IEEE Standard) should not generate Inexact if INE bit is set on fpcr, the Alpha 21264 [1] chip manual (A.8 IEEE Floating-Point Conformance) states that CVTfi and CVTif OUTPUT does generate inexact exception for inexact result regardless. As Joseph noted [2] to correctly fix it on alpha we need to either avoid the instruction or avoid any inexact bit from it being set on return from the function (while preserving the inexact bit that might be set on the entry to the function). The later will result mf_fpcr followed by a mt_fpcr to get and set the fpcr which will defeat the optimization itself. So the patch just remove the alpha optimized and rely on generic implementation. It fixes the math/test-*-{ceil,floor} on alpha. [BZ #15479] [BZ #22665] * sysdeps/alpha/fpu/s_ceil.c: Remove file. * sysdeps/alpha/fpu/s_ceilf.c: Likewise. * sysdeps/alpha/fpu/s_floor.c: Likewise. * sysdeps/alpha/fpu/s_floorf.c: Likewise. [1] https://www.star.bnl.gov/public/daq/HARDWARE/21264_data_sheet.pdf [2] https://sourceware.org/ml/libc-alpha/2018-01/msg00086.html --- ChangeLog | 9 ++++++++ sysdeps/alpha/fpu/s_ceil.c | 50 ---------------------------------------- sysdeps/alpha/fpu/s_ceilf.c | 54 ------------------------------------------- sysdeps/alpha/fpu/s_floor.c | 51 ---------------------------------------- sysdeps/alpha/fpu/s_floorf.c | 55 -------------------------------------------- 5 files changed, 9 insertions(+), 210 deletions(-) delete mode 100644 sysdeps/alpha/fpu/s_ceil.c delete mode 100644 sysdeps/alpha/fpu/s_ceilf.c delete mode 100644 sysdeps/alpha/fpu/s_floor.c delete mode 100644 sysdeps/alpha/fpu/s_floorf.c -- 2.7.4 diff --git a/sysdeps/alpha/fpu/s_ceil.c b/sysdeps/alpha/fpu/s_ceil.c deleted file mode 100644 index 16c8f99..0000000 --- a/sysdeps/alpha/fpu/s_ceil.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 1998-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - -/* Use the -inf rounding mode conversion instructions to implement - ceil, via something akin to -floor(-x). This is much faster than - playing with the fpcr to achieve +inf rounding mode. */ - -double -__ceil (double x) -{ - if (isnan (x)) - return x + x; - - if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */ - { - double tmp1, new_x; - - new_x = -x; - __asm ( - "cvttq/svm %2,%1\n\t" - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1) - : "f"(new_x)); - - /* Fix up the negation we did above, as well as handling -0 properly. */ - x = copysign(new_x, x); - } - return x; -} - -libm_alias_double (__ceil, ceil) diff --git a/sysdeps/alpha/fpu/s_ceilf.c b/sysdeps/alpha/fpu/s_ceilf.c deleted file mode 100644 index 8561232..0000000 --- a/sysdeps/alpha/fpu/s_ceilf.c +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 1998-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include - -/* Use the -inf rounding mode conversion instructions to implement - ceil, via something akin to -floor(-x). This is much faster than - playing with the fpcr to achieve +inf rounding mode. */ - -float -__ceilf (float x) -{ - if (isnanf (x)) - return x + x; - - if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */ - { - /* Note that Alpha S_Floating is stored in registers in a - restricted T_Floating format, so we don't even need to - convert back to S_Floating in the end. The initial - conversion to T_Floating is needed to handle denormals. */ - - float tmp1, tmp2, new_x; - - new_x = -x; - __asm ("cvtst/s %3,%2\n\t" - "cvttq/svm %2,%1\n\t" - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2) - : "f"(new_x)); - - /* Fix up the negation we did above, as well as handling -0 properly. */ - x = copysignf(new_x, x); - } - return x; -} - -libm_alias_float (__ceil, ceil) diff --git a/sysdeps/alpha/fpu/s_floor.c b/sysdeps/alpha/fpu/s_floor.c deleted file mode 100644 index 285ad36..0000000 --- a/sysdeps/alpha/fpu/s_floor.c +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 1998-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include -#include - - -/* Use the -inf rounding mode conversion instructions to implement - floor. We note when the exponent is large enough that the value - must be integral, as this avoids unpleasant integer overflows. */ - -double -__floor (double x) -{ - if (isnan (x)) - return x + x; - - if (isless (fabs (x), 9007199254740992.0)) /* 1 << DBL_MANT_DIG */ - { - double tmp1, new_x; - - __asm ( - "cvttq/svm %2,%1\n\t" - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1) - : "f"(x)); - - /* floor(-0) == -0, and in general we'll always have the same - sign as our input. */ - x = copysign(new_x, x); - } - return x; -} - -libm_alias_double (__floor, floor) diff --git a/sysdeps/alpha/fpu/s_floorf.c b/sysdeps/alpha/fpu/s_floorf.c deleted file mode 100644 index a73b3fd..0000000 --- a/sysdeps/alpha/fpu/s_floorf.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 1998-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#include -#include - - -/* Use the -inf rounding mode conversion instructions to implement - floor. We note when the exponent is large enough that the value - must be integral, as this avoids unpleasant integer overflows. */ - -float -__floorf (float x) -{ - if (isnanf (x)) - return x + x; - - if (isless (fabsf (x), 16777216.0f)) /* 1 << FLT_MANT_DIG */ - { - /* Note that Alpha S_Floating is stored in registers in a - restricted T_Floating format, so we don't even need to - convert back to S_Floating in the end. The initial - conversion to T_Floating is needed to handle denormals. */ - - float tmp1, tmp2, new_x; - - __asm ("cvtst/s %3,%2\n\t" - "cvttq/svm %2,%1\n\t" - "cvtqt/m %1,%0\n\t" - : "=f"(new_x), "=&f"(tmp1), "=&f"(tmp2) - : "f"(x)); - - /* floor(-0) == -0, and in general we'll always have the same - sign as our input. */ - x = copysignf(new_x, x); - } - return x; -} - -libm_alias_float (__floor, floor)