From patchwork Mon Oct 24 13:44:39 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Greenhalgh X-Patchwork-Id: 78958 Delivered-To: patch@linaro.org Received: by 10.140.97.247 with SMTP id m110csp2586208qge; Mon, 24 Oct 2016 06:46:17 -0700 (PDT) X-Received: by 10.98.91.198 with SMTP id p189mr29245136pfb.22.1477316776869; Mon, 24 Oct 2016 06:46:16 -0700 (PDT) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id d5si15500536pgh.128.2016.10.24.06.46.16 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 24 Oct 2016 06:46:16 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-439397-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-439397-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-439397-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=QIpqVoAr+MA5J5uS gRbTcyR6oHCbwSquW+K1uOr3DrYtNSDyzlOQ1Mqx3iugB4SbsXWdkHGu4zjczdof 8ktX+968+pJUQl9VKd8EX/aqGDnrHSH2aY3S9seBQdH46DR/oi3fPcHXGDRiN0lG Woe/FS7nM8TcPLRbw1u5hFex8rY= 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=Wb4/02XL/m7m1jhuVkLQHD ZZY8w=; b=prNbCMrxSxNUynos1d08HqQ7/orgAbcu+0OV4hdq38xBFwpGuOgLTa NXIXv/UqY+exAKfAyz+8tunlgh0Z4xTmhH6a2U14E4FtLgY6xfZYgDlqX2vvbKU6 dry1S6a+JRsDSJarYdgcdyDuuohDL7alTp7UzIMG7apeBcCwCwT3I= Received: (qmail 62003 invoked by alias); 24 Oct 2016 13:45:44 -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 61930 invoked by uid 89); 24 Oct 2016 13:45:43 -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, SPF_PASS autolearn=ham version=3.3.2 spammy=Arithmetic, sk:scalar, 250, 6, 2506 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (207.82.80.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 24 Oct 2016 13:45:32 +0000 Received: from EUR02-VE1-obe.outbound.protection.outlook.com (mail-ve1eur02lp0054.outbound.protection.outlook.com [213.199.154.54]) (Using TLS) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-80-bd8JbMCGPa2OWPA3kSAtoQ-1; Mon, 24 Oct 2016 14:45:28 +0100 Received: from DB6PR0801CA0041.eurprd08.prod.outlook.com (2603:10a6:4:2::51) by AM3PR08MB0609.eurprd08.prod.outlook.com (2a01:111:e400:c408::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.669.16; Mon, 24 Oct 2016 13:45:27 +0000 Received: from DB3FFO11FD022.protection.gbl (2a01:111:f400:7e04::174) by DB6PR0801CA0041.outlook.office365.com (2603:10a6:4:2::51) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.679.12 via Frontend Transport; Mon, 24 Oct 2016 13:45:27 +0000 Received: from nebula.arm.com (217.140.96.140) by DB3FFO11FD022.mail.protection.outlook.com (10.47.217.53) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.669.7 via Frontend Transport; Mon, 24 Oct 2016 13:45:26 +0000 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; Mon, 24 Oct 2016 14:45:08 +0100 From: James Greenhalgh To: CC: , , , , Subject: [Patch 3/4] Half to double precision conversions Date: Mon, 24 Oct 2016 14:44:39 +0100 Message-ID: <1477316680-5094-4-git-send-email-james.greenhalgh@arm.com> In-Reply-To: <1477316680-5094-1-git-send-email-james.greenhalgh@arm.com> References: <1475254617-10825-1-git-send-email-james.greenhalgh@arm.com> <1477316680-5094-1-git-send-email-james.greenhalgh@arm.com> MIME-Version: 1.0 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)(377424004)(199003)(19580395003)(86362001)(5890100001)(87936001)(512874002)(19580405001)(50986999)(76176999)(4001150100001)(6666003)(33646002)(2950100002)(568964002)(4326007)(26826002)(11100500001)(50226002)(2906002)(84326002)(104016004)(189998001)(92566002)(110136003)(77096005)(6916009)(305945005)(8676002)(356003)(4610100001)(7846002)(246002)(106466001)(2476003)(2351001)(8936002)(229853001)(36756003)(5660300001)(586003)(626004); DIR:OUT; SFP:1101; SCL:1; SRVR:AM3PR08MB0609; H:nebula.arm.com; FPR:; SPF:Pass; PTR:fw-tnat.cambridge.arm.com; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB3FFO11FD022; 1:FOJrqoVSNQYk2W7/gMzSH2MzuTBxs7lQywpvcfbMlIJvp46VgS42xAO5wrA3fYHXoxyorECMIE4kk/HwHMROIuVelarLwWIPEXeX6ufBo1Nd9ex8AEAppKm8j62WEBj5lLLkMUjMHC+acY1Nq5d4jf6BrLtzePUIP8ir1a6oPs/dQTuJYU2tkPxugdxsMPPY9Z9WyKESFj5F85tZeUqheludjGFBTQs6XqXhj3YMYE6PGQ8XvnOkCn329nraZL693aKf1shLo5X7wdD53dJhwSIx+ULWdKHHQZ1v5wCZKWsoMBqRGeGbWTX2iMDZpNs4ReUafv/casS52C4cbct8c6pPBV6UVUOyDuLNeFZr4QU0MfQ7V0xYHDXBsW+vh+g9B/6FB7f60lDmA3an+QbisBMXONu5BBXx7TYPCH4OyGbu4ZTOoabfiZQqFjy6GpKJGNTsYYlvYIbWaVI7CERxja8ZNvthuY/Cxt/pQXm8VAlI7H6H7H3b67MRw//7jGp/X+ubsk/R6L3n66tWfqcncZHbKUCM+U0NwwfvOME24ZHPf0a/OkkBTZxwHAUMucCAKNHzz6Fn6O6NYnUMqOoGKiHBYmRax/DmdONfbzywZhk= X-MS-Office365-Filtering-Correlation-Id: 955f7d6d-827f-4744-046b-08d3fc140320 X-Microsoft-Exchange-Diagnostics: 1; AM3PR08MB0609; 2:oppmb9EatdHFt3oH09kqxrLfDEy2cPxpHbLM7lLP2XaMglMqVEo3SndP5NUX7WW1L90GOUzpOh2RHNoV03ZouZLFyUVV3YvooM1Yip/5oNL8y/+lTSqshpaiJvPnv+Z3MTIttnL6WNfoY/PMGRbUvrcG+SqndIbxTnyTdqwXQT5Y4VMKpmsU8LDJjuq50AFCY2Zgvk1Vzndcyb1+9ptCZg==; 3:jYaF/TCMGBdyZF0/j+ZlQUWH9GbYb4PxGG6w0TcCBU2x2bZiZ6wGlubYiJdkPgyGgzEJCdm1PEE0Fl2xdjvNvbNsBOw/gAE+jfsDQyrokw8W9RR6P4AatZuu128yBouKUTa5QITindYvUelwDyocHmshjKbnzDWtc8l6u+34lEeL6uXcATR+omh2OVyabMZT7r/cEOai1nsRwtpvaETeD2vlhNsq0SK8nWpGMGwrg9OzV6+nhOnrU3FMFiVNDKmXImfXnulCxgPgsjZECkF9A2iQ7B+uXK4Bl9cdcI9qfXo= X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(8251501002); SRVR:AM3PR08MB0609; X-Microsoft-Exchange-Diagnostics: 1; AM3PR08MB0609; 25:rValrrEp4CfIj1AXwB/rNQvVbwlFBfSWTE6XBMsN+dK7JDXaw9IhLoRIyA0bTW5eBPQnhVkwlK2Xx99f0uBRYVWw17Sm+Jtj69QHZyvbDgtZHyCmIOqVO6/qqxYTOluISkw+aPUa13XhOvnUA7IhZ0pGVxap/NIepBHRpRqC6uocVfHVxoFajP/ItKmH7pOnP5yYw1a9kcGdAtt0fHSbfsnyMwEzRnAh0DGaH1/BbZppTIlcHza7h8kLsUsaE4Mk1RYcHfT5hyAwerw6Cb4v4l92ieFUmmmu4N8G0YcJ1AqREdFVDK00DHXf0pAWfa7QXtahzV1RW/UI+QPq/4cR7SgMVkxoeFSJhsOwT74yw0MGeOELPvNN4xbeMGGusUEUq7WCSTc+xhyql5Hl8q1KU/hk5Q7QolEbJNmPgEOw+SltEfoKw3c+Sa5uRE09pxbQTDQ6J/oeA5N0xD8GpPrzlWTHzGLiHzjRiYQbgwKvix0G6vKZL+okZy0a3GhN2IBwcLBFBps8BpImBLDK5QKTzAXy4efAft9650TzovhAtKmhG30fEAS5Ayy9ndKQ3UNr4Z4/4Zlrsb/uS8eti4MkFLQ+7KOvSAkW+Kg2oPM5ZqVtq6DMlfUFzN1kU5qFZnH/uCw6fichOqMLTQSlpatAmlQjvM7VlUhbU+aXlout/RojgDoBBorrqI635FWLrMlLJKSIQB6/vix+KmdsKBmnQtNzQ6/YeBtV1CrOyIFDcO4nHCAi7V2DJLkukbY6M6gqJnzjrCL7DXnlnlQjnvH0ui23q2tP1KeM3GAu8kX6WkMixMjwa7RDMsJiVj3Q5lwFEYlhLiV1e3/tpmluuCkMp8WxKwy37P2SGR8DXTBGAbIKH53kZM8iaHK6GJVf1NChzwcNL7zhE2/SdR07fSOsOD98Fq7Xqv4aOUojBIcx1Zu8HBl/CEptKMQMyQ49LnhS X-Microsoft-Exchange-Diagnostics: 1; AM3PR08MB0609; 31:q77pAEAJgrU+Fur+Pn4N0FcwqLRJKnrrSdHlULYc9L+fGnECmrfe62/6KPKy3wb76a06doVxQ4xRDo2Ua1KVexcfXr02kJloYjlimD11qlpIwYewactsh3Jte7A5mUIW6Q0VeYKnpCVi5zcp8dhsXlDUJ4f/VQkUajsIgx0rmlD3zI+7H/pRH6j5oF0MOkB+mAg6ts7a9W9GDw/T1jADrWmGmulaBNOUILFGoZjD1DU+agjwMycXyWwpf5tCjRAknDGlhszzB8mZMjc1UVoj3g==; 20:52oVsKdfsIKRzM5AyPPZ2zPc7tOFXqVeaNaUVp5/7nc0N1KywZ24xASR0bqO+Cv7pDCKRHmpZ2uXTwV6MQJuEHU404cyCEUwEpzSGbY1t9dHe6Px+JQcKVf34WDcq8ikFRiS/T9E0p62G37N1p8iIQqYM5kPvKoPUNeWh1xk4WnxWWV59ypHIXcLjMqa/G6LXWpwqEusG6rerb4yJpt65/yJA/PLFu4v793cDItlFki0oOv1sE73zuuCxYOPVXgN NoDisclaimer: True X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(180628864354917); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(102415321)(6040176)(601004)(2401047)(13023025)(13020025)(13024025)(13013025)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:AM3PR08MB0609; BCL:0; PCL:0; RULEID:; SRVR:AM3PR08MB0609; X-Microsoft-Exchange-Diagnostics: 1; AM3PR08MB0609; 4:4J/w/kqKMvzDaZgjBkaJRb1CAdint2zi4E4fPR8Hn0SiN9I5T3Do6v5Z/9AbtgaL2ZF5iHnh+W+QzTvV7OGOdKpFT2+dmTkWpOCxHKOr3Y02arSBH/Rq5qG+7n3at2GykMOwKMR9N3zKJEyZj0S1BBrNsI4IuPE4uYUru/KjE+YDjDUheF+H6QbVKRvi3ipC6Ro1CDdTkA7J28FsnNbU6AofAGpl82YJ/nH1kS/Nga0OHVXGuuOIigde6CaBQRlCNAJyxEPj8NqbJv4GvMGGgQG+tR3HCtCrMLvvH52sI2UM1+8NUrVPvuoo30srexd7A8pkCvGUR3G5TFOJoGx01eODuFlmdrrTYkvdh1AThq248ZVnr5Dc6KAcJgoFGG1sbSQ9E+5Bn87HPdQCyaTvXh5DHACDwl0LDwMNW9uNKFJPPe5NTsMy3ARzghf7fBJSOnaoKIL7JAWJSWf7VASCYdjAPWf4n4QeOYnyGVPgzojpZVt+PvpzV2STIjn3LCc3iypfcEg1tjOz5uMf2JaEfsBZDgJ6Y7BrDCZs19mcUVdXeguxPQRNen7V4sOrrgel X-Forefront-PRVS: 0105DAA385 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM3PR08MB0609; 23:/JVLVf5arh2RCJmlDOSJIrFP81JMY6tG/pef8plTL?= =?us-ascii?Q?h4Qo6lwRBZvfFLVzJvc4TW4lR/sm61lqw8RQct2R0VkBcsF7n9v0oPuK/0Hx?= =?us-ascii?Q?FYBm2btbsZe2spOX7KhPkZBrwRmz5HZdbkKDX6tYTL8L1p9moz4ReTwI0rMZ?= =?us-ascii?Q?lxv3g9pZO5QWekIdGRJAFnh3O7f9+em1/07D0pJkHgHrgXFPTKdllGIstL67?= =?us-ascii?Q?ksWfUa0ev93gpL5Tx88+uoNOrJRz4R/wFXAzOsBQ0g0bkD5lmQL93hCPfsfC?= =?us-ascii?Q?BWvstXZcX92xsrc6474U8g+SxZaK71JMlA2nJN/mm+Q/VMgmnlzRe+y1L2bY?= =?us-ascii?Q?zKvgIroVmeYPf6ZQBjUBqXT5O2BE0uYfC9RyHRO0rqUgRv/MG/w5D2Ee+sKC?= =?us-ascii?Q?7o+bDqPoXZufSZgO+yCRKYGMnq3StP6ehw50dgHy9dkGiX6J/XETC9t6+Y9E?= =?us-ascii?Q?yByzzi/qz6Dubo538cizzfVy7FS+ZBXf7jbp83zs2sUWmhvb76QU1YeAiaPB?= =?us-ascii?Q?w1iSBmn8cG3vcG2/hOnIJtpIWpvIqJpQr4OfTFVQnUDazxmrqaf4RMhEiCH7?= =?us-ascii?Q?WznWJUJP2c8PsvgIqEqgixNKehuK1hUGKXkbEBVhWSBu4YGyoo3ZEFyaTzV5?= =?us-ascii?Q?PBQJRDlNVmco3/4Y3eV7qggkQG2Hn8MEtUdSBOhOEP6EsafF5NQn7h6ce4Ll?= =?us-ascii?Q?eXBnFBhKR+tkiUmao12QiMX/lf0nqAdACRORZm27oYts738KtjpnGuRv76Hi?= =?us-ascii?Q?mnEnBo8sdGIPNgM0v/1JsA8uG2Nz5VshnodNEfZeTYJDMFzNT+Ht6QCW/mIm?= =?us-ascii?Q?iInok26Ky0NDlemV0z8s6wcr/llhXP7iWSDjnA/+faBXPlxUBkWU462fIMev?= =?us-ascii?Q?g95NSWQOyJfPf53S9Y7Wtmg5yXVHReMFB3b1zKWy6ftNV6aijPwBqQR/vdik?= =?us-ascii?Q?CrmGef5YzLCbf3x2C7VFFBa4XleZ8EuuVBhIuOfJXNnziLHlaoSgPqlsASQ7?= =?us-ascii?Q?nlwBsbtflcJNn1shlkyFxDWB/tvWpME2L1Hj9nUUB9cOL5OWLLrypMhACn/0?= =?us-ascii?Q?hx4/IYghqfWI68kC3DEjn8zeNOWf6SGAO1h/MBZwYG1xAKyy++46jTUSNnCm?= =?us-ascii?Q?PPVNahu7WqlQGxWAelrvjzwC20qy8WFHxnn1ti4f6YObGGWU6KwrbvOpz9S6?= =?us-ascii?Q?OQBwT2BvQcjbGg=3D?= X-Microsoft-Exchange-Diagnostics: 1; AM3PR08MB0609; 6:KJaZez0gw/7LOAhNe9bQwGGe/oUv57BMTo6PvxePkMIHPUFSUQwnsleLLkF3CUl7WSeOifGRR3SheiauLQhYfftgJfivlHCEC73LTYX7nKB3V57gogqpibtZOZXUDIqnZ2bVJhOqM/gRiguzaiDhFjpVyHo1jJijKz/BtmC5ox4TAbJOE9JJHtuuq0MjdOI2LulfLdmkFQu/eL+GG6lC7StwwsWutOK/QF0unTs1tKiPtaaPhq3M5PSOu3k9CHSAwUvE9OXrdsCFOxDs97/YDtmZOXqqrqpKoTBrEKy2D1ma7YvV/9ZLJXm5KfLvcZ+jMzP77N7d3/ry8yIcetO/QItaNwnB+1j5mfw2IN5NpJY=; 5:IlnhmVyhMyPXEkHAJWzruXLWB7erAwzeFymzl8unYcbalcJjnZuHK73KTgU7mKrEUsb07X/r1pK8E/9aItPD2lNxVce1n4PYE9sXb7qYN7lUg1b4Rdp8FDtrSqJqaPf7f1Iu8XsVzlVJfO35Hi6yZA==; 24:bkPpznF54DzYO8KnzzDQ93wKEV5xMzAKuO5aySXzd5JAIEpBgseYrv08O13FoyQAkfbOW8bmpR8Jsp+slIRR50kDuccJ6rwoY4IkJnHnRCA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM3PR08MB0609; 7:AlAOq9QiSTpzWAK3lLXu4YeDf26DNXocTujj+P+5Ik5hJplND5fSV2VJa6+q/GxbqID+nFUUJtxNteqOFYK8ERUV//a68ngZqXseLl4ubbYe3GK6IFoS7YQBobFI+j4qRy6FQFSubkLK4edJPnjw5ybxfNVK5pyG2lMEItB2r7QnSJBZNm6PGTE8VtK7nA71DBI55fVUTaVhgeTNZmrLEgroPFTrmtZlSeT6CfEY1CZIQMUWNIy41IQXt9kdNN1puGJYr+Rm/DjTkvvivQdK0jk1+GotYcUlnZwo4iZgYpPbue5leAEC2QawkURjckkQHcBJ/S2/WD6LPdFWMYAgOqreizV4ERWhPYNJEjlerZ8= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Oct 2016 13:45:26.8851 (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: AM3PR08MB0609 X-MC-Unique: bd8JbMCGPa2OWPA3kSAtoQ-1 X-IsSubscribed: yes Hi, This patch adds the half-to-double conversions, both as library functions, or when supported in hardware, using the appropriate instructions. That means adding support for the __gnu_d2h_{ieee/alternative} library calls added in patch 2/4, and providing a more aggressive truncdfhf2 where we can. This also lets us remove the implementation of TARGET_CONVERT_TO_TYPE. Bootstrapped on an ARMv8-A machine,and crosstested with no issues. OK? Thanks, James --- 2016-10-24 James Greenhalgh * config/arm/arm.c (arm_convert_to_type): Delete. (TARGET_CONVERT_TO_TYPE): Delete. (arm_init_libfuncs): Enable trunc_optab from DFmode to HFmode. (arm_libcall_uses_aapcs_base): Add trunc_optab from DF- to HFmode. * config/arm/arm.h (TARGET_FP16_TO_DOUBLE): New. * config/arm/arm.md (truncdfhf2): Only convert through SFmode if we are in fast math mode, and have no single step hardware instruction. (extendhfdf2): Only expand through SFmode if we don't have a single-step hardware instruction. * config/arm/vfp.md (*truncdfhf2): New. (extendhfdf2): Likewise. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index c1a5627..1822cd6 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -250,7 +250,6 @@ static bool arm_output_addr_const_extra (FILE *, rtx); static bool arm_allocate_stack_slots_for_args (void); static bool arm_warn_func_return (tree); static tree arm_promoted_type (const_tree t); -static tree arm_convert_to_type (tree type, tree expr); static bool arm_scalar_mode_supported_p (machine_mode); static bool arm_frame_pointer_required (void); static bool arm_can_eliminate (const int, const int); @@ -658,9 +657,6 @@ static const struct attribute_spec arm_attribute_table[] = #undef TARGET_PROMOTED_TYPE #define TARGET_PROMOTED_TYPE arm_promoted_type -#undef TARGET_CONVERT_TO_TYPE -#define TARGET_CONVERT_TO_TYPE arm_convert_to_type - #undef TARGET_SCALAR_MODE_SUPPORTED_P #define TARGET_SCALAR_MODE_SUPPORTED_P arm_scalar_mode_supported_p @@ -2560,6 +2556,11 @@ arm_init_libfuncs (void) ? "__gnu_h2f_ieee" : "__gnu_h2f_alternative")); + set_conv_libfunc (trunc_optab, HFmode, DFmode, + (arm_fp16_format == ARM_FP16_FORMAT_IEEE + ? "__gnu_d2h_ieee" + : "__gnu_d2h_alternative")); + /* Arithmetic. */ set_optab_libfunc (add_optab, HFmode, NULL); set_optab_libfunc (sdiv_optab, HFmode, NULL); @@ -5309,6 +5310,8 @@ arm_libcall_uses_aapcs_base (const_rtx libcall) SFmode)); add_libcall (libcall_htab, convert_optab_libfunc (trunc_optab, SFmode, DFmode)); + add_libcall (libcall_htab, + convert_optab_libfunc (trunc_optab, HFmode, DFmode)); } return libcall && libcall_htab->find (libcall) != NULL; @@ -23737,23 +23740,6 @@ arm_promoted_type (const_tree t) return NULL_TREE; } -/* Implement TARGET_CONVERT_TO_TYPE. - Specifically, this hook implements the peculiarity of the ARM - half-precision floating-point C semantics that requires conversions between - __fp16 to or from double to do an intermediate conversion to float. */ - -static tree -arm_convert_to_type (tree type, tree expr) -{ - tree fromtype = TREE_TYPE (expr); - if (!SCALAR_FLOAT_TYPE_P (fromtype) || !SCALAR_FLOAT_TYPE_P (type)) - return NULL_TREE; - if ((TYPE_PRECISION (fromtype) == 16 && TYPE_PRECISION (type) > 32) - || (TYPE_PRECISION (type) == 16 && TYPE_PRECISION (fromtype) > 32)) - return convert (type, convert (float_type_node, expr)); - return NULL_TREE; -} - /* Implement TARGET_SCALAR_MODE_SUPPORTED_P. This simply adds HFmode as a supported mode; even though we don't implement arithmetic on this type directly, it's supported by diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index dbb8e13..a5267c4 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -194,6 +194,11 @@ extern void (*arm_lang_output_object_attributes_hook)(void); #define TARGET_FP16 \ (ARM_FPU_FSET_HAS (TARGET_FPU_FEATURES, FPU_FL_FP16)) +/* FPU supports converting between HFmode and DFmode in a single hardware + step. */ +#define TARGET_FP16_TO_DOUBLE \ + (TARGET_HARD_FLOAT && (TARGET_FP16 && TARGET_VFP5)) + /* FPU supports fused-multiply-add operations. */ #define TARGET_FMA (TARGET_FPU_REV >= 4) diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 8393f65..4074773 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -5177,20 +5177,35 @@ "" ) -;; DFmode to HFmode conversions have to go through SFmode. +;; DFmode to HFmode conversions on targets without a single-step hardware +;; instruction for it would have to go through SFmode. This is dangerous +;; as it introduces double rounding. +;; +;; Disable this pattern unless we are in an unsafe math mode, or we have +;; a single-step instruction. + (define_expand "truncdfhf2" - [(set (match_operand:HF 0 "general_operand" "") + [(set (match_operand:HF 0 "s_register_operand" "") (float_truncate:HF - (match_operand:DF 1 "general_operand" "")))] - "TARGET_EITHER" - " - { - rtx op1; - op1 = convert_to_mode (SFmode, operands[1], 0); - op1 = convert_to_mode (HFmode, op1, 0); - emit_move_insn (operands[0], op1); - DONE; - }" + (match_operand:DF 1 "s_register_operand" "")))] + "(TARGET_EITHER && flag_unsafe_math_optimizations) + || (TARGET_32BIT && TARGET_FP16_TO_DOUBLE)" +{ + /* We don't have a direct instruction for this, so we must be in + an unsafe math mode, and going via SFmode. */ + + if (!(TARGET_32BIT && TARGET_FP16_TO_DOUBLE)) + { + rtx op1; + gcc_assert (flag_unsafe_math_optimizations); + op1 = convert_to_mode (SFmode, operands[1], 0); + op1 = convert_to_mode (HFmode, op1, 0); + emit_move_insn (operands[0], op1); + DONE; + } + /* Otherwise, we will pick this up as a single instruction with + no intermediary rounding. */ +} ) ;; Zero and sign extension instructions. @@ -5684,19 +5699,28 @@ "" ) -;; HFmode -> DFmode conversions have to go through SFmode. +;; HFmode -> DFmode conversions where we don't have an instruction for it +;; must go through SFmode. +;; +;; This is always safe for an extend. + (define_expand "extendhfdf2" - [(set (match_operand:DF 0 "general_operand" "") - (float_extend:DF (match_operand:HF 1 "general_operand" "")))] + [(set (match_operand:DF 0 "s_register_operand" "") + (float_extend:DF (match_operand:HF 1 "s_register_operand" "")))] "TARGET_EITHER" - " - { - rtx op1; - op1 = convert_to_mode (SFmode, operands[1], 0); - op1 = convert_to_mode (DFmode, op1, 0); - emit_insn (gen_movdf (operands[0], op1)); - DONE; - }" +{ + /* We don't have a direct instruction for this, so go via SFmode. */ + if (!(TARGET_32BIT && TARGET_FP16_TO_DOUBLE)) + { + rtx op1; + op1 = convert_to_mode (SFmode, operands[1], 0); + op1 = convert_to_mode (DFmode, op1, 0); + emit_insn (gen_movdf (operands[0], op1)); + DONE; + } + /* Otherwise, we're done producing RTL and will pick up the correct + pattern to do this with one rounding-step in a single instruction. */ +} ) ;; Move insns (including loads and stores) diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md index 45ce5c9..cb23c7f 100644 --- a/gcc/config/arm/vfp.md +++ b/gcc/config/arm/vfp.md @@ -1507,6 +1507,26 @@ (set_attr "type" "f_cvt")] ) +(define_insn "*truncdfhf2" + [(set (match_operand:HF 0 "s_register_operand" "=t") + (float_truncate:HF (match_operand:DF 1 "s_register_operand" "w")))] + "TARGET_32BIT && TARGET_FP16_TO_DOUBLE" + "vcvtb%?.f16.f64\\t%0, %P1" + [(set_attr "predicable" "yes") + (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] +) + +(define_insn "*extendhfdf2" + [(set (match_operand:DF 0 "s_register_operand" "=w") + (float_extend:DF (match_operand:HF 1 "s_register_operand" "t")))] + "TARGET_32BIT && TARGET_FP16_TO_DOUBLE" + "vcvtb%?.f64.f16\\t%P0, %1" + [(set_attr "predicable" "yes") + (set_attr "predicable_short_it" "no") + (set_attr "type" "f_cvt")] +) + (define_insn "truncsfhf2" [(set (match_operand:HF 0 "s_register_operand" "=t") (float_truncate:HF (match_operand:SF 1 "s_register_operand" "t")))]