From patchwork Sun Oct 11 23:24:47 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Oliva X-Patchwork-Id: 1380568 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=adacore.com Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4C8dFc274Nz9sTc for ; Mon, 12 Oct 2020 10:25:03 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 211263857C6D; Sun, 11 Oct 2020 23:25:00 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from rock.gnat.com (rock.gnat.com [205.232.38.15]) by sourceware.org (Postfix) with ESMTP id 88F2E3857C4E for ; Sun, 11 Oct 2020 23:24:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 88F2E3857C4E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=oliva@adacore.com Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 2FE2611765B; Sun, 11 Oct 2020 19:24:56 -0400 (EDT) X-Virus-Scanned: Debian amavisd-new at gnat.com Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id Ykyl0rXQuixe; Sun, 11 Oct 2020 19:24:56 -0400 (EDT) Received: from free.home (tron.gnat.com [IPv6:2620:20:4000:0:46a8:42ff:fe0e:e294]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by rock.gnat.com (Postfix) with ESMTPS id E18E611746F; Sun, 11 Oct 2020 19:24:55 -0400 (EDT) Received: from livre.home (livre.home [172.31.160.2]) by free.home (8.15.2/8.15.2) with ESMTPS id 09BNOl4g213722 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Sun, 11 Oct 2020 20:24:47 -0300 From: Alexandre Oliva To: gcc-patches@gcc.gnu.org Subject: import elementary functions as intrinsics Organization: Free thinker, does not speak for AdaCore Date: Sun, 11 Oct 2020 20:24:47 -0300 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Importing them as intrinsics enables GCC to treat them as builtins whose behavior is known by GCC. Specifically, if they aren't intrinsics, calls to Sin and Cos won't be combined into sincos. We still need to make Sin and Cos wrappers inline in user-exposed interfaces to get users the benefit of this transformation. That is forthcoming in a separate patch. Regstrapped on x86_64-linux-gnu, build-tested for various other targets, approved by Arno. I'm checking this in. for gcc/ada/ChangeLog * libgnat/a-numaux.ads: Make all imports Intrinsic. * libgnat/a-numaux__darwin.ads: Likewise. * libgnat/a-numaux__libc-x86.ads: Likewise. * libgnat/a-numaux__vxworks.ads: Likewise. --- gcc/ada/libgnat/a-numaux.ads | 26 +++++++++++++------------- gcc/ada/libgnat/a-numaux__darwin.ads | 22 +++++++++++----------- gcc/ada/libgnat/a-numaux__libc-x86.ads | 26 +++++++++++++------------- gcc/ada/libgnat/a-numaux__vxworks.ads | 26 +++++++++++++------------- 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/gcc/ada/libgnat/a-numaux.ads b/gcc/ada/libgnat/a-numaux.ads index 3ad7067..4154e1a 100644 --- a/gcc/ada/libgnat/a-numaux.ads +++ b/gcc/ada/libgnat/a-numaux.ads @@ -58,55 +58,55 @@ package Ada.Numerics.Aux is -- all as pure functions, because indeed all of them are in fact pure. function Sin (X : Double) return Double; - pragma Import (C, Sin, "sin"); + pragma Import (Intrinsic, Sin, "sin"); pragma Pure_Function (Sin); function Cos (X : Double) return Double; - pragma Import (C, Cos, "cos"); + pragma Import (Intrinsic, Cos, "cos"); pragma Pure_Function (Cos); function Tan (X : Double) return Double; - pragma Import (C, Tan, "tan"); + pragma Import (Intrinsic, Tan, "tan"); pragma Pure_Function (Tan); function Exp (X : Double) return Double; - pragma Import (C, Exp, "exp"); + pragma Import (Intrinsic, Exp, "exp"); pragma Pure_Function (Exp); function Sqrt (X : Double) return Double; - pragma Import (C, Sqrt, "sqrt"); + pragma Import (Intrinsic, Sqrt, "sqrt"); pragma Pure_Function (Sqrt); function Log (X : Double) return Double; - pragma Import (C, Log, "log"); + pragma Import (Intrinsic, Log, "log"); pragma Pure_Function (Log); function Acos (X : Double) return Double; - pragma Import (C, Acos, "acos"); + pragma Import (Intrinsic, Acos, "acos"); pragma Pure_Function (Acos); function Asin (X : Double) return Double; - pragma Import (C, Asin, "asin"); + pragma Import (Intrinsic, Asin, "asin"); pragma Pure_Function (Asin); function Atan (X : Double) return Double; - pragma Import (C, Atan, "atan"); + pragma Import (Intrinsic, Atan, "atan"); pragma Pure_Function (Atan); function Sinh (X : Double) return Double; - pragma Import (C, Sinh, "sinh"); + pragma Import (Intrinsic, Sinh, "sinh"); pragma Pure_Function (Sinh); function Cosh (X : Double) return Double; - pragma Import (C, Cosh, "cosh"); + pragma Import (Intrinsic, Cosh, "cosh"); pragma Pure_Function (Cosh); function Tanh (X : Double) return Double; - pragma Import (C, Tanh, "tanh"); + pragma Import (Intrinsic, Tanh, "tanh"); pragma Pure_Function (Tanh); function Pow (X, Y : Double) return Double; - pragma Import (C, Pow, "pow"); + pragma Import (Intrinsic, Pow, "pow"); pragma Pure_Function (Pow); end Ada.Numerics.Aux; diff --git a/gcc/ada/libgnat/a-numaux__darwin.ads b/gcc/ada/libgnat/a-numaux__darwin.ads index f2a4428..add87a4 100644 --- a/gcc/ada/libgnat/a-numaux__darwin.ads +++ b/gcc/ada/libgnat/a-numaux__darwin.ads @@ -57,47 +57,47 @@ package Ada.Numerics.Aux is -- all as pure functions, because indeed all of them are in fact pure. function Tan (X : Double) return Double; - pragma Import (C, Tan, "tan"); + pragma Import (Intrinsic, Tan, "tan"); pragma Pure_Function (Tan); function Exp (X : Double) return Double; - pragma Import (C, Exp, "exp"); + pragma Import (Intrinsic, Exp, "exp"); pragma Pure_Function (Exp); function Sqrt (X : Double) return Double; - pragma Import (C, Sqrt, "sqrt"); + pragma Import (Intrinsic, Sqrt, "sqrt"); pragma Pure_Function (Sqrt); function Log (X : Double) return Double; - pragma Import (C, Log, "log"); + pragma Import (Intrinsic, Log, "log"); pragma Pure_Function (Log); function Acos (X : Double) return Double; - pragma Import (C, Acos, "acos"); + pragma Import (Intrinsic, Acos, "acos"); pragma Pure_Function (Acos); function Asin (X : Double) return Double; - pragma Import (C, Asin, "asin"); + pragma Import (Intrinsic, Asin, "asin"); pragma Pure_Function (Asin); function Atan (X : Double) return Double; - pragma Import (C, Atan, "atan"); + pragma Import (Intrinsic, Atan, "atan"); pragma Pure_Function (Atan); function Sinh (X : Double) return Double; - pragma Import (C, Sinh, "sinh"); + pragma Import (Intrinsic, Sinh, "sinh"); pragma Pure_Function (Sinh); function Cosh (X : Double) return Double; - pragma Import (C, Cosh, "cosh"); + pragma Import (Intrinsic, Cosh, "cosh"); pragma Pure_Function (Cosh); function Tanh (X : Double) return Double; - pragma Import (C, Tanh, "tanh"); + pragma Import (Intrinsic, Tanh, "tanh"); pragma Pure_Function (Tanh); function Pow (X, Y : Double) return Double; - pragma Import (C, Pow, "pow"); + pragma Import (Intrinsic, Pow, "pow"); pragma Pure_Function (Pow); end Ada.Numerics.Aux; diff --git a/gcc/ada/libgnat/a-numaux__libc-x86.ads b/gcc/ada/libgnat/a-numaux__libc-x86.ads index c4647fd..f6deebe 100644 --- a/gcc/ada/libgnat/a-numaux__libc-x86.ads +++ b/gcc/ada/libgnat/a-numaux__libc-x86.ads @@ -43,55 +43,55 @@ package Ada.Numerics.Aux is -- all as pure functions, because indeed all of them are in fact pure. function Sin (X : Double) return Double; - pragma Import (C, Sin, "sinl"); + pragma Import (Intrinsic, Sin, "sinl"); pragma Pure_Function (Sin); function Cos (X : Double) return Double; - pragma Import (C, Cos, "cosl"); + pragma Import (Intrinsic, Cos, "cosl"); pragma Pure_Function (Cos); function Tan (X : Double) return Double; - pragma Import (C, Tan, "tanl"); + pragma Import (Intrinsic, Tan, "tanl"); pragma Pure_Function (Tan); function Exp (X : Double) return Double; - pragma Import (C, Exp, "expl"); + pragma Import (Intrinsic, Exp, "expl"); pragma Pure_Function (Exp); function Sqrt (X : Double) return Double; - pragma Import (C, Sqrt, "sqrtl"); + pragma Import (Intrinsic, Sqrt, "sqrtl"); pragma Pure_Function (Sqrt); function Log (X : Double) return Double; - pragma Import (C, Log, "logl"); + pragma Import (Intrinsic, Log, "logl"); pragma Pure_Function (Log); function Acos (X : Double) return Double; - pragma Import (C, Acos, "acosl"); + pragma Import (Intrinsic, Acos, "acosl"); pragma Pure_Function (Acos); function Asin (X : Double) return Double; - pragma Import (C, Asin, "asinl"); + pragma Import (Intrinsic, Asin, "asinl"); pragma Pure_Function (Asin); function Atan (X : Double) return Double; - pragma Import (C, Atan, "atanl"); + pragma Import (Intrinsic, Atan, "atanl"); pragma Pure_Function (Atan); function Sinh (X : Double) return Double; - pragma Import (C, Sinh, "sinhl"); + pragma Import (Intrinsic, Sinh, "sinhl"); pragma Pure_Function (Sinh); function Cosh (X : Double) return Double; - pragma Import (C, Cosh, "coshl"); + pragma Import (Intrinsic, Cosh, "coshl"); pragma Pure_Function (Cosh); function Tanh (X : Double) return Double; - pragma Import (C, Tanh, "tanhl"); + pragma Import (Intrinsic, Tanh, "tanhl"); pragma Pure_Function (Tanh); function Pow (X, Y : Double) return Double; - pragma Import (C, Pow, "powl"); + pragma Import (Intrinsic, Pow, "powl"); pragma Pure_Function (Pow); end Ada.Numerics.Aux; diff --git a/gcc/ada/libgnat/a-numaux__vxworks.ads b/gcc/ada/libgnat/a-numaux__vxworks.ads index c291334..410655d 100644 --- a/gcc/ada/libgnat/a-numaux__vxworks.ads +++ b/gcc/ada/libgnat/a-numaux__vxworks.ads @@ -43,55 +43,55 @@ package Ada.Numerics.Aux is -- all as pure functions, because indeed all of them are in fact pure. function Sin (X : Double) return Double; - pragma Import (C, Sin, "sin"); + pragma Import (Intrinsic, Sin, "sin"); pragma Pure_Function (Sin); function Cos (X : Double) return Double; - pragma Import (C, Cos, "cos"); + pragma Import (Intrinsic, Cos, "cos"); pragma Pure_Function (Cos); function Tan (X : Double) return Double; - pragma Import (C, Tan, "tan"); + pragma Import (Intrinsic, Tan, "tan"); pragma Pure_Function (Tan); function Exp (X : Double) return Double; - pragma Import (C, Exp, "exp"); + pragma Import (Intrinsic, Exp, "exp"); pragma Pure_Function (Exp); function Sqrt (X : Double) return Double; - pragma Import (C, Sqrt, "sqrt"); + pragma Import (Intrinsic, Sqrt, "sqrt"); pragma Pure_Function (Sqrt); function Log (X : Double) return Double; - pragma Import (C, Log, "log"); + pragma Import (Intrinsic, Log, "log"); pragma Pure_Function (Log); function Acos (X : Double) return Double; - pragma Import (C, Acos, "acos"); + pragma Import (Intrinsic, Acos, "acos"); pragma Pure_Function (Acos); function Asin (X : Double) return Double; - pragma Import (C, Asin, "asin"); + pragma Import (Intrinsic, Asin, "asin"); pragma Pure_Function (Asin); function Atan (X : Double) return Double; - pragma Import (C, Atan, "atan"); + pragma Import (Intrinsic, Atan, "atan"); pragma Pure_Function (Atan); function Sinh (X : Double) return Double; - pragma Import (C, Sinh, "sinh"); + pragma Import (Intrinsic, Sinh, "sinh"); pragma Pure_Function (Sinh); function Cosh (X : Double) return Double; - pragma Import (C, Cosh, "cosh"); + pragma Import (Intrinsic, Cosh, "cosh"); pragma Pure_Function (Cosh); function Tanh (X : Double) return Double; - pragma Import (C, Tanh, "tanh"); + pragma Import (Intrinsic, Tanh, "tanh"); pragma Pure_Function (Tanh); function Pow (X, Y : Double) return Double; - pragma Import (C, Pow, "pow"); + pragma Import (Intrinsic, Pow, "pow"); pragma Pure_Function (Pow); end Ada.Numerics.Aux;