From patchwork Fri Nov 11 15:42:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Greenhalgh X-Patchwork-Id: 81870 Delivered-To: patch@linaro.org Received: by 10.140.97.165 with SMTP id m34csp1331286qge; Fri, 11 Nov 2016 07:44:22 -0800 (PST) X-Received: by 10.98.130.1 with SMTP id w1mr7972990pfd.35.1478879062206; Fri, 11 Nov 2016 07:44:22 -0800 (PST) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id kf2si9021822pad.130.2016.11.11.07.44.21 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 11 Nov 2016 07:44:22 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-return-441136-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org; spf=pass (google.com: domain of gcc-patches-return-441136-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-441136-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; q=dns; s=default; b=BkLaI5ZYaAHCn9F/ 6fgQO62SAEvx/tKv/W8F0Y3fijUrOO0EBq2b6vC8WNTq7cTPDPClJ5dJEl8IBkTT ZmGAkWekyiPmvf0m8r/tgXK/g6i64s07Fj9iNI6DpJPv900AMVclH9aG4GZFx4n2 8QkGhUSJdjuglJ0CAIvl6eVKAR0= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type; s=default; bh=2t5GwSRwn8nX0xMchxr5hN 0IMEY=; b=Sm2wR6GwERWs7vt5v5wKXF9UrcGPC/hE1iNfW8ny5aqDlLoLYngebP 34q14QQR3gmgFToJg1Oy2HiiFuFebCW75o5kqBP1NolsjLTcPtuEKOcFyGL0Pxr4 b30GE0+r81aFHwKQ7lsqotGuVnwcVyFB9bNaNIkD6aKaLU7LGtqJs= Received: (qmail 60000 invoked by alias); 11 Nov 2016 15:43:30 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 59896 invoked by uid 89); 11 Nov 2016 15:43:29 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=REAL_TYPE, real_type, ENTRY X-HELO: EUR01-DB5-obe.outbound.protection.outlook.com Received: from mail-db5eur01on0040.outbound.protection.outlook.com (HELO EUR01-DB5-obe.outbound.protection.outlook.com) (104.47.2.40) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 11 Nov 2016 15:43:18 +0000 Received: from DB6PR0802CA0035.eurprd08.prod.outlook.com (10.172.252.149) by HE1PR08MB1225.eurprd08.prod.outlook.com (10.166.96.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.707.6; Fri, 11 Nov 2016 15:43:14 +0000 Received: from DB3FFO11FD038.protection.gbl (2a01:111:f400:7e04::142) by DB6PR0802CA0035.outlook.office365.com (2603:10a6:4:a3::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.721.10 via Frontend Transport; Fri, 11 Nov 2016 15:43:14 +0000 Authentication-Results: spf=pass (sender IP is 217.140.96.140) smtp.mailfrom=arm.com; codesourcery.com; dkim=none (message not signed) header.d=none; codesourcery.com; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 217.140.96.140 as permitted sender) receiver=protection.outlook.com; client-ip=217.140.96.140; helo=nebula.arm.com; Received: from nebula.arm.com (217.140.96.140) by DB3FFO11FD038.mail.protection.outlook.com (10.47.217.69) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.707.3 via Frontend Transport; Fri, 11 Nov 2016 15:43:13 +0000 X-IncomingTopHeaderMarker: OriginalChecksum:; UpperCasedChecksum:; SizeAsReceived:928; Count:13 Received: from e107456-lin.cambridge.arm.com (10.1.2.79) by mail.arm.com (10.1.106.66) with Microsoft SMTP Server id 14.3.294.0; Fri, 11 Nov 2016 15:42:52 +0000 From: James Greenhalgh To: CC: , , , , Subject: [Patch ARM 17/17] Enable _Float16 for ARM. Date: Fri, 11 Nov 2016 15:42:26 +0000 Message-ID: <1478878946-22725-4-git-send-email-james.greenhalgh@arm.com> In-Reply-To: <1478878946-22725-1-git-send-email-james.greenhalgh@arm.com> References: <1478878647-22547-1-git-send-email-james.greenhalgh@arm.com> <1478878946-22725-1-git-send-email-james.greenhalgh@arm.com> MIME-Version: 1.0 X-IncomingHeaderCount: 13 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:217.140.96.140; IPV:CAL; SCL:-1; CTRY:GB; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(438002)(189002)(199003)(377424004)(5890100001)(626004)(6916009)(4326007)(2476003)(33646002)(50226002)(586003)(50986999)(110136003)(76176999)(8936002)(189998001)(77096005)(2351001)(5660300001)(8676002)(6666003)(92566002)(106466001)(2950100002)(356003)(246002)(86362001)(26826002)(104016004)(512874002)(87936001)(4610100001)(568964002)(305945005)(2906002)(84326002)(7846002)(36756003); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR08MB1225; H:nebula.arm.com; FPR:; SPF:Pass; PTR:fw-tnat.cambridge.arm.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB3FFO11FD038; 1:VhnwsPjsJyg4hnT5RDY9yNFntw4kwcVQFifnMVnNdfOXAxVgolbhVFjDF6pW4UbNdoTd1lm0mBn8Y0NbVpnSEDI8qZd0Scmk2y3ytAUHd6feWVQ8HG/F45oJ5iPEQaowvVTzsgX+1Hp8ZFDF3l9BHNCfceNQ/VCOUjsG8TZ5SPF4gNilMCciphPtSFhG7IsaauKzFwQM0g9qONuM2M3wDNwTUk31+RVRU91DmyuvGAqUIWoYpUuE4qQ7TZfAZjPrUATKqjx0o2HecSB9iqivbZSlcpBfhcJvKN2LJqb24EFLiveG33pO3et7+5u2A77cd+n6BGZXuaMvVpD8XSBWTv2bRpfBY3beUX7F+q/QKdlvhYCDvq9K5mNimX8y4BgQ81M+gfeV6NGhrb+fznCoKUHxnIXp1MXJxCUZ6UdkPH0qTsQtC8+YxAQ0jHbefgf8DyzMHNw+Su1t4m/eNBsjn/4CSH2PSxpwFVNWnt6wFGrBx/0SvQIOIraiAmPboTCz7JjTPfABoDYERyxtViSV0ZJFERMjdHlZRH6sdTArPnq+HnR+ThBJxL2F1OWf62xpdgSWCEih/zc5L/Q/ugsv91gdvtC/NPnZS1xiDGKVbSY= X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB1225; 2:fImi8/kW9CbjjvU99V/ibAqM/Nah9zZ6anwMIwr9Ge6t6GyBnCBZRjAKOTg8jxosHX6an5YKIGDLcO9sRiNLOwv03nk8VPUcRXSVkj729T2bkdGdxubKWKc2KiRNTk69jp4+CoHQz2frrFjHIm3NKGJWjUMQRA9hd3ATR+BKjbM=; 3:uSk0RXiZKXjiwDnIjdAMJCPzfPS3IemcEEZX9hvZwNq9WZCwUu4tnDWbLxGdmtuTFyPbss64IjrnfNLsULEmH5817p3RM3fqaIsXpCWzFcpAmxykthFvHj4oB75qiA5yMusJ2mQRMoaSDYms9nMVJT/er8sjdGyJQkpFCo6wOvipOLK0kguP2/Dbnf1oMnQK/YRJT9DN0mC+wZiPQSIXCKPGtLW9lLhcFDUfFeeNRe6TcHJm9m6pQ37T1N8E4Ogq49Hsq/tc5tBbr/fOQPRJhlQLRviE1BnCWJzuqJkhVFo= X-MS-Office365-Filtering-Correlation-Id: d23a5cad-fba4-4d4c-c4f3-08d40a4972d2 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(8251501002); SRVR:HE1PR08MB1225; X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB1225; 25:Yd4jaqlmA9biLe4GmepEUfEUO57gaGNVcD4lIZJuvherV68523tUerifVJ2xHAHJElODnYrNopNswfSxjJNpT0+wBVqHUXwbjulUH5jEl0fDaQJzazFrp+Koqss0VANbu9PvWqsePMs2M/hHanxfZzahAC6c/KPY8wpUWnbSUMGfRjJ/NemEsjGX9V8aO42Ugc23ncH98g2Ynl8cmqQrgwVyfpQaaOIs5NihI61jzF2JYz1B7Uc7R63bRs+rw0jPM3hti6D0zvG7f2oVxCcGEn44lQFjxpu1pRo/uziZ8IUYA/uSKL32z3veWQ1mvnFPKELx+J989PzPx9yRfKt6S+A7LiY/RKQeGi1YNWTA8aHYkF+8n6eHqu51NEYAGFHDJBiYOMeR1wgOHc6TYmArOCcBRLL3Ah1Jr6JXNh2ljhKvsQ4XXAibAkxb4jN6B1t3DTgqXZsVTqbBc2KiFq7Us6pyCtfmGKrN1iOwATM9urmlCXVVc3dxJm8Q14Tpx2+T; 31:roxc9BnxkoKJLT/HEl2s0htiIpQzJR+yaSm3dkX+MTUVfRRIaYhqlSoawJem5W///OnxxLRmUb75AKLqbxZY0ROpnFaClxBXXy7cSS46hHsnhvBJPITm2uJvOTfJyIsNgiW9kXezDtIYJLeWOv7YYUOmucF977MEhk1Pmfsi/+Ih3+R6hM7T7suPwa677WqjSdrnkOAkLj8pxsvj2LD9mxcvSMnv9z0JIJccsshVgQHcU1TLYnVIqTsJKKWJinChDHoLabStHIwvurDc9UfmuYSYrUJYGUyHE8liB+ectl8= NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB1225; 20:8uJUh5N/5dwvDhwosRArsJ7QN0Ut5wYn34Y9IQ12nGYAMxjNXkG/Mkw+b6sqg6mve3qtpBWMnpJ2R1vlhjRxGkR2J5ighIgHRs/uk4cZvi3nVprMdsoFjaKSV2q5k1vd847ctsXIF+uD60RzmVx17xCli6Cpj2kZ2TfFLQwcKVmCgwgWEShcK64V1q1MjgIddqBsJ1UU5Mc5u2NfswGgP5g2i5hX1vXcNrbIM1KA13Y7Z9J5ekNnEE/CUdS4+rQr; 4:Qryoss4HHFJJh9DQrnUdPq+CfI88/eYXqpVMxgPQF3xsbxHc9Tzp+e+HEgc3ztPa4vY/SAUEENuiPF4c2YGOPEzL5+498NvcSWtWa6usO/AikwJA1EM2uGorGjiJuLKCcYMsI3IkvNBf83Xzx/ykMHqBhjYwsLzeCog7ewj1Jp55Vu7CH4N4V9OrwgG/PRhD0p/J7KAcH5djk6wuuZ3HUBGJLOOO1O0WhaX7lwG6d1Bpca+Ol+1Cebv+C2DDPyIoYNwdQJadC8jVJVUry2ccu8WJR6/k0sHPCQec5d7pLgnweUSIp1msvakTu6hDZueX/sssI6RTjN2ljng30NTsUuL0Sbdx+DtjbyTG+fSaWAnJJiqHVUtpdCP95d1IPto0IABcCxWMR6shWzl4bg/mmNogngnOQR8wTzRjDxZNvdhX9N5xM+rd2fF1aeX7EjOmXotG+tLfMpn7KL+VpCIvlZ4cwAKKyExn7c7odLuXLggPTF/YWlDB8KYqpKFaITCsVynp8TrxFF2XmQ1GQnKs/BpSLldlxFyUFvrv8K+72x5rSbAfKz7WeVpaVmMh8EkD X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(102415395)(6040176)(601004)(2401047)(8121501046)(13013025)(13020025)(13024025)(5005006)(13023025)(3002001)(10201501046)(6055026); SRVR:HE1PR08MB1225; BCL:0; PCL:0; RULEID:; SRVR:HE1PR08MB1225; X-Forefront-PRVS: 012349AD1C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR08MB1225; 23:iyXoo6zBl2PheQQS8bGhKT9O0LGpl5iosrQeiPTV0?= =?us-ascii?Q?KrDslXFttxweu1sOHBKmIChQ23dIOPEdzWIZh9ijmX9YhSsN/JGeX53P02eH?= =?us-ascii?Q?M9n3cRegSyxi0CttzPIRO6ecRiqgnE0ZlB6dPS6eBSnWqr4X2wLleBp+kZhg?= =?us-ascii?Q?UiTzvgAjhYqdJBnL8btuR5M9BYFkTOhFGLDEytR0yoCU8o5pbyKHFtdKJ9Lb?= =?us-ascii?Q?xjC2dLNwXFbRBMeG6xvD4vZspt+Y+GMeJy2w02S73nzvTFNqecSuKYICpZsp?= =?us-ascii?Q?il3dOOVcl7G3jELZmmhPuHcsCtdRcKZ65BlwFSE4TgmOXBSUUM0wNEMilCGP?= =?us-ascii?Q?GkzW2QwbNKFaa6GZSxK2aN+o8+kL1Wwf6ijOJ5kS2SMTCxtxh8Jc4Ha/LsAi?= =?us-ascii?Q?eYQlbn5ftY7URuuJnLxQSsDy4ldsvg4005n6tkMkCKU1ja3K060qWp0bPgbI?= =?us-ascii?Q?+01d63bJaCha3knNCfo/giyjyPHkkjq0bIUFtJof/Czph9FeTGgbwGZnMOYW?= =?us-ascii?Q?9CKCjyzPQCB+vyX/7P/ZuloghBQGqfieXQUQofT+SapUSrSavBW0tZiWwcJ0?= =?us-ascii?Q?oRAb1AqjOKLdJT475CQJBWKBUXmNFQ3OMLLvLHtC1uwtOSuIVnFgKL8eZcj8?= =?us-ascii?Q?IDKShNf7xAl6Ise5ZT2lWpTB57vkOm4jorrGhH5p7eEz7Wfq9/9fA68yNN2T?= =?us-ascii?Q?1Vg8wh7TOPjGLNGyThJNdUGHmPxVXKBGaX84FkE8yz4v8Mz0tUHWxQMYH8Oy?= =?us-ascii?Q?qtgXX3pJWD2+kZTD4YjOtEjDzzZNcJQrBACf/s6bVp8qC5cpVmbkK0k8f329?= =?us-ascii?Q?3kcGjgdbl/CBPhEIhnlE0AhU7m9AkdbXGZ5Ox7GiuZpxPFLqnZ+f4cA8bp0o?= =?us-ascii?Q?Q1yiosSVNjOtko0CwDIQsHVJ18o+qjVBDZ8I8oppDs7H93T5ITFQQn275vd0?= =?us-ascii?Q?oZxkU3HjoMTvHH1Z1C++9pOO1Lj850DKgXMGd8k9nSMn6T8/9jwL7w/XIPUE?= =?us-ascii?Q?CCw1LV3qJilk0Jy8EYqrcosCkpJfX+7Tw3A5BhsFk8in8848wLcHJGde/HVi?= =?us-ascii?Q?j+Kz5I=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB1225; 6:yTIqkNpNKiuQmLPUwhzqdukYtXvF1x0GxyVKEOXBJIPIoe6MPNxuFdCL9Kt9zfcOnC7K4u4qtUDX5blVtnE45YHI1LiMzftu6X7s/vDjIDJ3v+MkckfOoq+aD5/FroPiqMBvs42OYGp9iC5BUB64yfmafGZfRWE/Whk7DAUOSXO56MsBOCNEpWrbp1JUoyqkT32BzlKCiVuyDlIQPKLv6GV0wGKEWrEmEyDYxeQyE4sarP9u1V3ieR6twzlZmmjfba4mudG1RJu3mKvO5Aau8SUClkes3Y/UQyxETXm0MWWR+vw/ewGTTzb3YPM92+OamjsaHreJ30Y0Wp/OzNAhiw==; 5:G8PXof6Y9xzTKIGb3zGhPnwSwxpxVR9TxH4e7vhbp/SKTlWYm7o/x5Okrp4q8E+LW4icUG4a26TzvQXJxjvdH8XEVRBvITv3iLHkVuXHWupDfWHIPk2L+AJ+DjVk5CqxjldL6kv2icf1+J/Lx3vi0QUWt6l5fTBjf22AsuEILrU=; 24:NfkCSUFBE4MxSxktOXg/UGEjoG+HscSYPcOCbu0HzLUGhYOshd37ROkPoDG4ylbPTORvo3wXji70YX5OmyT5Q4rS7X0spe2ewWnclJJsAA4= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR08MB1225; 7:GO1V9jNOo58rPah/MZry9fjBmaaTu7qvoSkC03v+xgleeDNsowk5iMpmR/h65KbtCIFdSDGfyaNd21VpQp96vyBY3b78sptvhvttuadvhPSupDR28UfH34265DlnBz+gk8zzYMEXBYrKXq88vs1BsrB6D9oRGCrlGcLxIGyu4jjq0/jjlef+PUwQxeDtbTVSmub1spW6A3jBhvi0rbeTnc6mpoEVYBvXpMx0Lh3cx3RwuCWATRn3DCh9NpxCIYJVwWM640f4EkKtu8Oru6Z/F7HmaGGCBtS/7hf5JJh3BUea0kfQ+QDWv8sxBbOSagjhknZbI4JrewO7w03HSt9T7nkopFGlf6lieDpgAQSodm0= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Nov 2016 15:43:13.9048 (UTC) X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[217.140.96.140]; Helo=[nebula.arm.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR08MB1225 X-IsSubscribed: yes Hi, Finally, having added support for single-step DFmode to HFmode conversions, this patch adds support for _Float16 to the ARM back-end. That means making sure that only __fp16 promotes and adding similar hooks to those used in the AArch64 port giving the excess precision rules, and marking HFmode as supported in libgcc. Bootstrapped on an ARMv8-A machine, and crosstested with no issues. OK? Thanks, James --- gcc/ 2016-11-09 James Greenhalgh PR target/63250 * config/arm/arm-builtins.c (arm_simd_floatHF_type_node): Rename to... (arm_fp16_type_node): ...This, make visibile. (arm_simd_builtin_std_type): Rename arm_simd_floatHF_type_node to arm_fp16_type_node. (arm_init_simd_builtin_types): Likewise. (arm_init_fp16_builtins): Likewise. * config/arm/arm.c (arm_excess_precision): New. (arm_floatn_mode): Likewise. (TARGET_C_EXCESS_PRECISION): Likewise. (TARGET_FLOATN_MODE): Likewise. (arm_promoted_type): Only promote arm_fp16_type_node. * config/arm/arm.h (arm_fp16_type_node): Declare. gcc/testsuite/ 2016-11-09 James Greenhalgh * lib/target-supports.exp (add_options_for_float16): Add -mfp16-format=ieee when testign arm*-*-*. diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c index e73043d..5ed38d1 100644 --- a/gcc/config/arm/arm-builtins.c +++ b/gcc/config/arm/arm-builtins.c @@ -652,7 +652,8 @@ static struct arm_simd_type_info arm_simd_types [] = { }; #undef ENTRY -static tree arm_simd_floatHF_type_node = NULL_TREE; +/* The user-visible __fp16 type. */ +tree arm_fp16_type_node = NULL_TREE; static tree arm_simd_intOI_type_node = NULL_TREE; static tree arm_simd_intEI_type_node = NULL_TREE; static tree arm_simd_intCI_type_node = NULL_TREE; @@ -739,7 +740,7 @@ arm_simd_builtin_std_type (enum machine_mode mode, case XImode: return arm_simd_intXI_type_node; case HFmode: - return arm_simd_floatHF_type_node; + return arm_fp16_type_node; case SFmode: return float_type_node; case DFmode: @@ -840,8 +841,8 @@ arm_init_simd_builtin_types (void) /* Continue with standard types. */ /* The __builtin_simd{64,128}_float16 types are kept private unless we have a scalar __fp16 type. */ - arm_simd_types[Float16x4_t].eltype = arm_simd_floatHF_type_node; - arm_simd_types[Float16x8_t].eltype = arm_simd_floatHF_type_node; + arm_simd_types[Float16x4_t].eltype = arm_fp16_type_node; + arm_simd_types[Float16x8_t].eltype = arm_fp16_type_node; arm_simd_types[Float32x2_t].eltype = float_type_node; arm_simd_types[Float32x4_t].eltype = float_type_node; @@ -1754,11 +1755,11 @@ arm_init_iwmmxt_builtins (void) static void arm_init_fp16_builtins (void) { - arm_simd_floatHF_type_node = make_node (REAL_TYPE); - TYPE_PRECISION (arm_simd_floatHF_type_node) = GET_MODE_PRECISION (HFmode); - layout_type (arm_simd_floatHF_type_node); + arm_fp16_type_node = make_node (REAL_TYPE); + TYPE_PRECISION (arm_fp16_type_node) = GET_MODE_PRECISION (HFmode); + layout_type (arm_fp16_type_node); if (arm_fp16_format) - (*lang_hooks.types.register_builtin_type) (arm_simd_floatHF_type_node, + (*lang_hooks.types.register_builtin_type) (arm_fp16_type_node, "__fp16"); } diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index b9097c5..4e1d47b 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -266,6 +266,7 @@ static bool arm_builtin_support_vector_misalignment (machine_mode mode, int misalignment, bool is_packed); static void arm_conditional_register_usage (void); +static enum flt_eval_method arm_excess_precision (enum excess_precision_type); static reg_class_t arm_preferred_rename_class (reg_class_t rclass); static unsigned int arm_autovectorize_vector_sizes (void); static int arm_default_branch_cost (bool, bool); @@ -299,6 +300,7 @@ static bool arm_asm_elf_flags_numeric (unsigned int flags, unsigned int *num); static unsigned int arm_elf_section_type_flags (tree decl, const char *name, int reloc); static void arm_expand_divmod_libfunc (rtx, machine_mode, rtx, rtx, rtx *, rtx *); +static machine_mode arm_floatn_mode (int, bool); /* Table of machine attributes. */ static const struct attribute_spec arm_attribute_table[] = @@ -444,6 +446,9 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_ASM_INTERNAL_LABEL #define TARGET_ASM_INTERNAL_LABEL arm_internal_label +#undef TARGET_FLOATN_MODE +#define TARGET_FLOATN_MODE arm_floatn_mode + #undef TARGET_FUNCTION_OK_FOR_SIBCALL #define TARGET_FUNCTION_OK_FOR_SIBCALL arm_function_ok_for_sibcall @@ -734,6 +739,9 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_EXPAND_DIVMOD_LIBFUNC #define TARGET_EXPAND_DIVMOD_LIBFUNC arm_expand_divmod_libfunc +#undef TARGET_C_EXCESS_PRECISION +#define TARGET_C_EXCESS_PRECISION arm_excess_precision + struct gcc_target targetm = TARGET_INITIALIZER; /* Obstack for minipool constant handling. */ @@ -22515,7 +22523,9 @@ arm_debugger_arg_offset (int value, rtx addr) static tree arm_promoted_type (const_tree t) { - if (SCALAR_FLOAT_TYPE_P (t) && TYPE_PRECISION (t) == 16) + if (SCALAR_FLOAT_TYPE_P (t) + && TYPE_PRECISION (t) == 16 + && TYPE_MAIN_VARIANT (t) == arm_fp16_type_node) return float_type_node; return NULL_TREE; } @@ -22537,6 +22547,61 @@ arm_scalar_mode_supported_p (machine_mode mode) return default_scalar_mode_supported_p (mode); } +/* Set the value of FLT_EVAL_METHOD. + ISO/IEC TS 18661-3 defines two values that we'd like to make use of: + + 0: evaluate all operations and constants, whose semantic type has at + most the range and precision of type float, to the range and + precision of float; evaluate all other operations and constants to + the range and precision of the semantic type; + + N, where _FloatN is a supported interchange floating type + evaluate all operations and constants, whose semantic type has at + most the range and precision of _FloatN type, to the range and + precision of the _FloatN type; evaluate all other operations and + constants to the range and precision of the semantic type; + + If we have the ARMv8.2-A extensions then we support _Float16 in native + precision, so we should set this to 16. Otherwise, we support the type, + but want to evaluate expressions in float precision, so set this to + 0. */ + +static enum flt_eval_method +arm_excess_precision (enum excess_precision_type type) +{ + switch (type) + { + case EXCESS_PRECISION_TYPE_FAST: + case EXCESS_PRECISION_TYPE_STANDARD: + /* We can calculate either in 16-bit range and precision or + 32-bit range and precision. Make that decision based on whether + we have native support for the ARMv8.2-A 16-bit floating-point + instructions or not. */ + return (TARGET_VFP_FP16INST + ? FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16 + : FLT_EVAL_METHOD_PROMOTE_TO_FLOAT); + case EXCESS_PRECISION_TYPE_IMPLICIT: + return FLT_EVAL_METHOD_PROMOTE_TO_FLOAT16; + default: + gcc_unreachable (); + } + return FLT_EVAL_METHOD_UNPREDICTABLE; +} + + +/* Implement TARGET_FLOATN_MODE. Make very sure that we don't provide + _Float16 if we are using anything other than ieee format for 16-bit + floating point. Otherwise, punt to the default implementation. */ +static machine_mode +arm_floatn_mode (int n, bool extended) +{ + if (!extended && n == 16) + return arm_fp16_format == ARM_FP16_FORMAT_IEEE ? HFmode : VOIDmode; + + return default_floatn_mode (n, extended); +} + + /* Set up OPERANDS for a register copy from SRC to DEST, taking care not to early-clobber SRC registers in the process. diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index e759720..744e91d 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -73,6 +73,11 @@ extern int arm_ccfsm_state; extern GTY(()) rtx arm_target_insn; /* Callback to output language specific object attributes. */ extern void (*arm_lang_output_object_attributes_hook)(void); + +/* This type is the user-visible __fp16. We need it in a few places in + the backend. Defined in arm-builtins.c. */ +extern tree arm_fp16_type_node; + #undef CPP_SPEC #define CPP_SPEC "%(subtarget_cpp_spec) \ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index b917250..e5f033c 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -2582,6 +2582,9 @@ proc check_effective_target_floatn_nx_runtime {} { # the function name. proc add_options_for_float16 { flags } { + if { [istarget arm*-*-*] } { + return "$flags -mfp16-format=ieee" + } return "$flags" }