From patchwork Tue Aug 29 21:16:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Steve Ellcey X-Patchwork-Id: 22414 Received: (qmail 8397 invoked by alias); 29 Aug 2017 21:16:46 -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 8388 invoked by uid 89); 29 Aug 2017 21:16:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=U*rth, HX-ClientProxiedBy:sk:MWHPR04 X-HELO: NAM01-BY2-obe.outbound.protection.outlook.com Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Steve.Ellcey@cavium.com; Message-ID: <1504041387.5204.20.camel@cavium.com> Subject: [PATCH] [AArch64] ILP32 math changes From: Steve Ellcey Reply-To: sellcey@cavium.com To: libc-alpha Cc: Szabolcs Nagy , rth@twiddle.net, Joseph Myers , Wilco Dijkstra , nd Date: Tue, 29 Aug 2017 14:16:27 -0700 Mime-Version: 1.0 X-ClientProxiedBy: MWHPR04CA0037.namprd04.prod.outlook.com (10.172.163.23) To MWHPR07MB3549.namprd07.prod.outlook.com (10.164.192.138) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 209627fe-4024-47ca-40aa-08d4ef233788 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(49563074)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:MWHPR07MB3549; X-Microsoft-Exchange-Diagnostics: 1; MWHPR07MB3549; 3:mr/zpdym9ETpiz9zyX4H45dIMSYQYbgNPoPOex25bJe+LszDABTZ+sjMlZUxzqMIyMff1iU2YyE1Ge6pSB90SvVcifoRcK0h9o0x0s88ObhK2psdUDbEmCTfnGLukkVOcG6dQn+KFTw62mCIqgq+o7EvYz8Q5/u+RhgRfQLXqTBoepkejb0h9ijyLAgrU4h4wrm7jgWw6tmGmOMmTpgaj7gTiOCdscRrJgFsFNSLVSN2P6xAIXfrdLjrEh7hiWJ/; 25:mlZgxQ44GH6Af20BCpycenZz/VCEcHhJq8fwQR5dYJdKIvsynPfZJMpYN4P/R4y0U03sFMeNLJ1g3WT15kKas1uEQTnw8fzNSpUJrlo3XeAJT7rdU8lySOwTEyNRgItVU0SLlBw7Xm6CAIO/U8LCzGqoEeEUSU+EKaQi+5B57sWFm4LQT8Ij/xlnVx3FTlyOXswlmserz0FZRKTMKi+n+8o+jdtX3PqWvu1zz7uU0xgx/VDXkbWNVo01gTH2+dlcJi5kOfyqGRbNUFp6SpK+641LKdlOUH4o6l3dXYze3sXcW7dR9EwpnfaXlFnGO29Xv6QEIXMdpJ6OY6/K30FbBg==; 31:PWHobFEqEQRavwUyt/J2HJr2nrBuVa/ZuOIjLsk+t1ZAgSu+27yzL4PxKf8c20Q2lURkRenwNu7wf2e5TJDsNdIZlrnZrE6eiuzp+8tHvW/bSBFqROoC7ptBPpIh2Wr0ZxpmARJY1epdbMqzkRDmC/CWe7t/iRKZObWuU4MQOR2wLUEuS/UvpGSzXc02iLuA3ntO7NBE0opAXngLdHo+nPTWa5hnW7WlhnKXsmYWCvA= X-MS-TrafficTypeDiagnostic: MWHPR07MB3549: X-Microsoft-Exchange-Diagnostics: 1; MWHPR07MB3549; 20:pqDfqMS+YdA3HULSAnFhYOsopstawC1vBeG/vX6bZFr2oBtVZueqbdcOD84qMMaZzEgp4J7/4FzUQQbfxh8lhTEh6ZZe1hzYd22cshovBKxomKryFVvJb2B1ktTF8QxXtvCOU1PF/Syrwt7CO/K5H1xjXSWXrbTzESpcrduvBAGHSrTNE1T+4ZTH6hoh5lJKFo3V5U7LDUzrFoS9Pxhb5NgOuPCXLbJGoPCXid/bWmsAkLymjQ2LnuqYz5cIgmi9tv0uXZ+NfZgNgVN727FLirJz0yauV5s4c+s9ovnaTxHhxvH0qhhUc3/teGqVdcp3sSYqlIIuSJtrmkJ6qYMY9jJ1AVkp1PCXXIJSdNSQ4e5HPe098dvY09WuC65j0wg+oTzs1eTtSdY2BKIhti4YMwDtfWCdckjvt0Q85eCIgs1OYM85VS9Bv7asKxgWDEnKa7lSm3OX4a5jdwpi+jInVO6lMfRaNh71DnfEGiyXKYVDzti3DDdg/rLkLu8cj8xx; 4:AEjI4h1fkNinn1V9XVZcspUkTzrPRN9MHGPmPdXwtofXfORZMrjfwfLbO1Fj5opzx2SRjzUB9zIfUGE56BGTwXJHIB1uz/rd9lSaVfQBYNxbrQVGoS+cn7PTJv87YGze8o30uorlw6R6seFFUDSKmZzxyUX42DcVw+DVOnonjt4pvSCVROWgzrY0yenkVhsI8ifLTqyy1cgJsJZmOYmQtdpaq2yJRbYRAICeGam62JroMDorP8y1QKopG9wQoUlE X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(102415395)(6040450)(601004)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(93006095)(93001095)(10201501046)(3002001)(6041248)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123564025)(20161123562025)(20161123555025)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:MWHPR07MB3549; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:MWHPR07MB3549; X-Forefront-PRVS: 0414DF926F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(7370300001)(6009001)(199003)(377424004)(189002)(54906002)(8676002)(3846002)(103116003)(81166006)(68736007)(6506006)(7350300001)(81156014)(4326008)(84326002)(69596002)(5660300001)(305945005)(6916009)(36756003)(512874002)(50226002)(6486002)(6116002)(7736002)(5890100001)(6512007)(25786009)(106356001)(105586002)(72206003)(110136004)(66066001)(53936002)(50986999)(2476003)(2906002)(4610100001)(478600001)(568964002)(42186005)(33646002)(101416001)(189998001)(97736004)(53416004)(43066003)(3450700001)(99106002); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR07MB3549; H:sellcey-dt.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR07MB3549; 23:w9mZCt2DPpfPtPPt2ap7CEz7I0gZLJP96jM919Z7R?= =?us-ascii?Q?o5Dmn3oBVYLruEjS2o8F3gBOg9z4wV/qpvTvSzC5ZdiZOqB5N4zMq6s3xEDa?= =?us-ascii?Q?xsWfIaXU7E9y2us3GIbjXlSEQapiAbOrlJEoxdnut3dQ5O+CxtM5Um1N0Uhu?= =?us-ascii?Q?K5UusSB6JYZ10mIUhLslPfwq6rZ1/kq0PZsTBAGy93tbgmWPEZN/OA5qWwFq?= =?us-ascii?Q?ie6fTqdHEi1egtxGsiJYJcJZ6zhTTh9GYBYRbv97GBCJF6PWHx4IYdr6RMrJ?= =?us-ascii?Q?dowgGx4u/MQDhcHtbAqUqN2qDT4KrWF3dor/khhTHwlidnVh92KDfhv6m5kC?= =?us-ascii?Q?LcZ/Ql51Hl6uom87AJzPylRaxmI4D8/wJNpuHKfdzMVBWEM5Jd9zo+kEZG07?= =?us-ascii?Q?DhVBLEMd2uGjBXrjwD4u0TMn8ob5P2M4uEP4vbbdbtILAIFBF2/7moSijT9w?= =?us-ascii?Q?vlUV7pQvtMF+oLbFsmGR6AvwHBk+G+S9MCbEzibJ9L+/0G09Yjsot5lbPpXK?= =?us-ascii?Q?HCVYzM0n+vG71WOlpTcXXj95CJqJ3vQI7v7cqGTUUVJIJllwFSP9iCOtKS8P?= =?us-ascii?Q?q406CrdDmOUgj8vP/bsq6ztl560QejltKXfoWY/nXifRrsPpfOcCGRHBkS0N?= =?us-ascii?Q?oRvWTncqQSyBol7NDVw2ph+egvZuM/T2IhwMjZ1apavHHI4PZvaUVJ/7SJP5?= =?us-ascii?Q?tAlSBdWdEVztCQVJ57u91mLgwZRu6tPf5vxEJF/zd1e2LxLymrlhxZx3gTVe?= =?us-ascii?Q?424k8J50M0cDeg5faMNv+2DO7JAJ+nE/s59SaRAsUFRtHtYbUtqYVz0gpTB0?= =?us-ascii?Q?C/Llym6yIdFH+CPU0G4qFI7dPlI+8nxgPOiozpRC/1nOfkKlH7z+aIqUcOI2?= =?us-ascii?Q?Uq8lZl+7zuqB5IrqXjVb0h2kn+7wIKHYAxkWW8wUVWIoA4o9Z9a2KydaI/Bk?= =?us-ascii?Q?4NpMUme9A9Yu3LREJX6MYrb151uyCAANQD0C35enXxNLQSlopKsPV2aJeud6?= =?us-ascii?Q?JIo/wnRey33xAYJzYxT/IatMx+kQ+NsX9OpEXS3+R2C5V2nUZh/2I+/3BFkR?= =?us-ascii?Q?p/XKt19PigMpSn/cd5XM2lHb1c9PMBLwj9GnVtCS6C0YvNtf74w+OV6QRpdL?= =?us-ascii?Q?Xczuh1FHmybJrBeJZpV6+atdrMWV6BvgwzaKzsEzUcbd7+AELvn8aNQTot3g?= =?us-ascii?Q?p/p5Y2QiRSXP9e2M1NzhphIKXOwa7JPxAQ2HW93MHxCJE9L7FA7z2hL+N2//?= =?us-ascii?Q?HpJnR498EdbBuKgyGA=3D?= X-Microsoft-Exchange-Diagnostics: 1; MWHPR07MB3549; 6:EuHq+ItyWMxhfRQce5KMdpk7ujxXlb4pOUv2OIGpAKozUjlw3MZ9fcI3PrcXMshDV2I+Pb42WIj9MyIWuaL6tTPDEPL4w1cCX1+tRXmDYer1UYC93EDg9OQBys9wsmkQ3QnggkNHisaPGb2MLvSq1nLA+Ie66sHqdl1bTcZiPxEh0IoophgNh0m1PjMGwWWQaig3L+qdmhVCZR1JZ0jjNFnN8rTdyV6n9dRHe/QPIxZ+YXPNe6xwosUmahjMzckfNvFZOSMoRhSFKjKz47VEKNpFU2aEoKf231QcGu4uq/ZrEyV24BiTh762FXy747vsoDkuXftnwSblWEe40X8Vzg==; 5:SUpexMR7RItC9CArxFXlDzy2xc9oyeGWDSBD+Ad9kE16f59o8zxxhv5Okfc/1ZiWZ0omJ0NdsUfuQAsB89eCeCCa1iQzSsGb5oYr9TNSeTDFJGvftso3BpLDULCwMWtztim+VYxKuFUVsMyomvS2JA==; 24:sIuW+0tN/I13AgEg+QGwsCiRN+Shj7DNW6gSMF8rcOOE7GPYf+dMkE5gHkpckiXQjv2svp5bqfjT3QKxvQjNN2R3IltL95P10OybXxKBlSs=; 7:dezWKO/aF6b8VwChua7+BsNf4rVX9oa4gJrtfOXU42otCptn1NeKzWRpk85VfQyrGL5AdDXpgmKTkEc+Nv2Pa7js0t/NjaBnZf/SgHQLHPj00mreDeAFUZfJoTrYw6yAqqlFO/X55moKvCFZsZucp4t8FQWzh0MvlOZBB7jwlpXxyDKk+O0ZctZOpvvigrpGszBl1GEBa6tu46jrMmMXQAXF20QIs5pl0+DTXliIqQw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Aug 2017 21:16:29.8308 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR07MB3549 Since Szabolcs has expressed interest in getting some aarch64 ILP32 changes into glibc mainline (if they don't affect the kernel or glibc ABI) I am resubmitting this patch for approval in advance of the main ILP32 support patches.  I updated it with Richard Henderson's code (but only doing it when the incoming argument is large).  I tested it on aarch64 ILP32 and LP64 with no regressions. Is this something that can be checked in now withnout waiting for the kernel ILP32 support? Steve Ellcey sellcey@cavium.com 2017-08-29  Steve Ellcey       Richard Henderson * sysdeps/aarch64/fpu/s_llrint.c (OREG_SIZE): New macro. * sysdeps/aarch64/fpu/s_llround.c (OREG_SIZE): Likewise. * sysdeps/aarch64/fpu/s_llrintf.c (OREGS, IREGS): Remove. (IREG_SIZE, OREG_SIZE): New macros. * sysdeps/aarch64/fpu/s_llroundf.c: (OREGS, IREGS): Remove. (IREG_SIZE, OREG_SIZE): New macros. * sysdeps/aarch64/fpu/s_lrintf.c (IREGS): Remove. (IREG_SIZE): New macro. * sysdeps/aarch64/fpu/s_lroundf.c (IREGS): Remove. (IREG_SIZE): New macro. * sysdeps/aarch64/fpu/s_lrint.c (get-rounding-mode.h, stdint.h): New includes. (IREG_SIZE, OREG_SIZE): Initialize if not already set. (OREGS, IREGS): Set based on IREG_SIZE and OREG_SIZE. (__CONCATX): Handle exceptions correctly on large values that may set FE_INVALID. * sysdeps/aarch64/fpu/s_lround.c (IREG_SIZE, OREG_SIZE): Initialize if not already set.         (OREGS, IREGS): Set based on IREG_SIZE and OREG_SIZE. diff --git a/sysdeps/aarch64/fpu/s_llrint.c b/sysdeps/aarch64/fpu/s_llrint.c index c0d0d0e..57821c0 100644 --- a/sysdeps/aarch64/fpu/s_llrint.c +++ b/sysdeps/aarch64/fpu/s_llrint.c @@ -18,4 +18,5 @@ #define FUNC llrint #define OTYPE long long int +#define OREG_SIZE 64 #include diff --git a/sysdeps/aarch64/fpu/s_llrintf.c b/sysdeps/aarch64/fpu/s_llrintf.c index 67724c6..98ed4f8 100644 --- a/sysdeps/aarch64/fpu/s_llrintf.c +++ b/sysdeps/aarch64/fpu/s_llrintf.c @@ -18,6 +18,7 @@ #define FUNC llrintf #define ITYPE float -#define IREGS "s" +#define IREG_SIZE 32 #define OTYPE long long int +#define OREG_SIZE 64 #include diff --git a/sysdeps/aarch64/fpu/s_llround.c b/sysdeps/aarch64/fpu/s_llround.c index ed4b192..ef7aedf 100644 --- a/sysdeps/aarch64/fpu/s_llround.c +++ b/sysdeps/aarch64/fpu/s_llround.c @@ -18,4 +18,5 @@ #define FUNC llround #define OTYPE long long int +#define OREG_SIZE 64 #include diff --git a/sysdeps/aarch64/fpu/s_llroundf.c b/sysdeps/aarch64/fpu/s_llroundf.c index 360ce8b..294f0f4 100644 --- a/sysdeps/aarch64/fpu/s_llroundf.c +++ b/sysdeps/aarch64/fpu/s_llroundf.c @@ -18,6 +18,7 @@ #define FUNC llroundf #define ITYPE float -#define IREGS "s" +#define IREG_SIZE 32 #define OTYPE long long int +#define OREG_SIZE 64 #include diff --git a/sysdeps/aarch64/fpu/s_lrint.c b/sysdeps/aarch64/fpu/s_lrint.c index 8c61a03..6ef64e2 100644 --- a/sysdeps/aarch64/fpu/s_lrint.c +++ b/sysdeps/aarch64/fpu/s_lrint.c @@ -17,6 +17,8 @@ . */ #include +#include +#include #ifndef FUNC # define FUNC lrint @@ -24,18 +26,37 @@ #ifndef ITYPE # define ITYPE double -# define IREGS "d" +# define IREG_SIZE 64 #else -# ifndef IREGS -# error IREGS not defined +# ifndef IREG_SIZE +# error IREG_SIZE not defined # endif #endif #ifndef OTYPE # define OTYPE long int +# ifdef __ILP32__ +# define OREG_SIZE 32 +# else +# define OREG_SIZE 64 +# endif +#else +# ifndef OREG_SIZE +# error OREG_SIZE not defined +# endif #endif -#define OREGS "x" +#if IREG_SIZE == 32 +# define IREGS "s" +#else +# define IREGS "d" +#endif + +#if OREG_SIZE == 32 +# define OREGS "w" +#else +# define OREGS "x" +#endif #define __CONCATX(a,b) __CONCAT(a,b) @@ -44,6 +65,37 @@ __CONCATX(__,FUNC) (ITYPE x) { OTYPE result; ITYPE temp; + +#if IREG_SIZE == 64 && OREG_SIZE == 32 + if (__builtin_fabs (x) > INT32_MAX) + { + /* Converting large values to a 32 bit int may cause the frintx/fcvtza + sequence to set both FE_INVALID and FE_INEXACT. To avoid this + check the rounding mode and do a single instruction with the + appropriate rounding mode. */ + + switch (get_rounding_mode ()) + { + case FE_TONEAREST: + asm volatile ("fcvtns" "\t%" OREGS "0, %" IREGS "1" + : "=r" (result) : "w" (x)); + break; + case FE_UPWARD: + asm volatile ("fcvtps" "\t%" OREGS "0, %" IREGS "1" + : "=r" (result) : "w" (x)); + break; + case FE_DOWNWARD: + asm volatile ("fcvtms" "\t%" OREGS "0, %" IREGS "1" + : "=r" (result) : "w" (x)); + break; + case FE_TOWARDZERO: + default: + asm volatile ("fcvtzs" "\t%" OREGS "0, %" IREGS "1" + : "=r" (result) : "w" (x)); + } + return result; + } +#endif asm ( "frintx" "\t%" IREGS "1, %" IREGS "2\n\t" "fcvtzs" "\t%" OREGS "0, %" IREGS "1" : "=r" (result), "=w" (temp) : "w" (x) ); diff --git a/sysdeps/aarch64/fpu/s_lrintf.c b/sysdeps/aarch64/fpu/s_lrintf.c index a995e4b..2e73271 100644 --- a/sysdeps/aarch64/fpu/s_lrintf.c +++ b/sysdeps/aarch64/fpu/s_lrintf.c @@ -18,5 +18,5 @@ #define FUNC lrintf #define ITYPE float -#define IREGS "s" +#define IREG_SIZE 32 #include diff --git a/sysdeps/aarch64/fpu/s_lround.c b/sysdeps/aarch64/fpu/s_lround.c index 9be9e7f..1f77d82 100644 --- a/sysdeps/aarch64/fpu/s_lround.c +++ b/sysdeps/aarch64/fpu/s_lround.c @@ -24,18 +24,37 @@ #ifndef ITYPE # define ITYPE double -# define IREGS "d" +# define IREG_SIZE 64 #else -# ifndef IREGS -# error IREGS not defined +# ifndef IREG_SIZE +# error IREG_SIZE not defined # endif #endif #ifndef OTYPE # define OTYPE long int +# ifdef __ILP32__ +# define OREG_SIZE 32 +# else +# define OREG_SIZE 64 +# endif +#else +# ifndef OREG_SIZE +# error OREG_SIZE not defined +# endif +#endif + +#if IREG_SIZE == 32 +# define IREGS "s" +#else +# define IREGS "d" #endif -#define OREGS "x" +#if OREG_SIZE == 32 +# define OREGS "w" +#else +# define OREGS "x" +#endif #define __CONCATX(a,b) __CONCAT(a,b) diff --git a/sysdeps/aarch64/fpu/s_lroundf.c b/sysdeps/aarch64/fpu/s_lroundf.c index 4a066d4..b30ddb6 100644 --- a/sysdeps/aarch64/fpu/s_lroundf.c +++ b/sysdeps/aarch64/fpu/s_lroundf.c @@ -18,5 +18,5 @@ #define FUNC lroundf #define ITYPE float -#define IREGS "s" +#define IREG_SIZE 32 #include