From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by sourceware.org (Postfix) with ESMTPS id AF4E93858011 for ; Tue, 6 Sep 2022 07:15:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org AF4E93858011 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=adacore.com Received: by mail-wm1-x332.google.com with SMTP id bd26-20020a05600c1f1a00b003a5e82a6474so6876175wmb.4 for ; Tue, 06 Sep 2022 00:15:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=adacore.com; s=google; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :from:to:cc:subject:date; bh=efrpWi1O78YvEaaSo5mwWIRAGDJ3SQoYlMc2KMxFvto=; b=AvAYtHv4HnDWlX8ZtBa7hXvu3AF05FUG3GEvdfJiFQ1EsTVdAb3IoeNEqrVy4zAk9G f4FzVWkyEPAEXXmFPHb2zyKRzGhiLq7n8PZL5RTBlfti2xrRtStn6N4s1p61a/Sqbjku YY4eGboxhMlJaW6EMwCjly85aBQ0Y2kADXOjA+s+MkklfnxIS4t+jV1BU6sIcuueZS5I v9/wbgC9fSlbAMrhqKzQbQ1GD3HkpauNSFvQuGa+jxb4FLz3cTY8gzoi2p9xVKNX6F9x 0K48iSuKaVE5EsX1lvfF6uiQkD4q19oFckCoE/gDMRClCwlgXxA2Cp1yq/QvmZbE5epo QArA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-disposition:mime-version:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date; bh=efrpWi1O78YvEaaSo5mwWIRAGDJ3SQoYlMc2KMxFvto=; b=hYd9eluAn1JoWHtG+003/WFb1jo8YdlqRzI2SeCBlX/Lcp8M8tLQ33BJBzoTJzo/7F NWJBd8zF2VKk3GWUNygAzvpn52Sa1xMnjcqmZPr/II0FXS6po0ucw6+qEnFQwOY6W55s p2Cwg6r5XuVdNOYJLJsMlvcDR086a4WOQeqa/gamI5g7JfCYOPVfmSTwgtxMGw7ayODg o+CsDMgQSvTuAi6zR3I6YVYSPKgG+wLMiW5YIZd6QaZQmKCzsgXhdMNVY2ycsdCfuvm+ FADuFJ+vG1+yFStevxsO95xAY21mjzVjmtMVxU8w6c18HO2doK1vaRXpaaHZXfDzu6SQ wvsw== X-Gm-Message-State: ACgBeo1QxZdkI1/6sjj+coai70khbi+HFA46cY0nbnsYse2JnKsb/fnw uqNOwTBXsZJ70MxmSzibeiKmpOjnF1cysQ== X-Google-Smtp-Source: AA6agR6GDnCPOttzP59xRL0fud+2SRODSmouZev5/IO5KbSkixPIFwjVBMWDnjzPxNaCBiAKyagIEQ== X-Received: by 2002:a05:600c:600b:b0:3a5:b811:e7fc with SMTP id az11-20020a05600c600b00b003a5b811e7fcmr13410724wmb.190.1662448540211; Tue, 06 Sep 2022 00:15:40 -0700 (PDT) Received: from poulhies-Precision-5550 (static-176-191-105-132.ftth.abo.bbox.fr. [176.191.105.132]) by smtp.gmail.com with ESMTPSA id n15-20020a05600c4f8f00b003adf0ae0048sm10006772wmq.45.2022.09.06.00.15.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Sep 2022 00:15:39 -0700 (PDT) Date: Tue, 6 Sep 2022 09:15:39 +0200 From: Marc =?iso-8859-1?Q?Poulhi=E8s?= To: gcc-patches@gcc.gnu.org Cc: Eric Botcazou Subject: [Ada] Correctly round Value attribute for floating point in more cases Message-ID: <20220906071539.GA1280171@poulhies-Precision-5550> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="tKW2IUtsqtDRztdT" Content-Disposition: inline X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --tKW2IUtsqtDRztdT Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This provides correct rounding in the IEEE 754 sense for the Value attribute of floating-point types in more cases, by bumping the number of significant bits used in the initial integer mantissa obtained from parsing. Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * libgnat/s-valuer.ads (System.Value_R): Add Parts formal parameter as well as Data_Index, Scale_Array and Value_Array types. (Scan_Raw_Real): Change type of Scale and return type. (Value_Raw_Real): Likewise. * libgnat/s-valuer.adb (Round_Extra): Reorder parameters and adjust recursive call. (Scan_Decimal_Digits): Reorder parameters, add N parameter and deal with multi-part scale and value. (Scan_Integral_Digits): Likewise. (Scan_Raw_Real): Change type of Scale and return type and deal with multi-part scale and value. (Value_Raw_Real): Change type of Scale and return type and tidy up. * libgnat/s-valued.adb (Impl): Pass 1 as Parts actual parameter. (Scan_Decimal): Adjust to type changes. (Value_Decimal): Likewise. * libgnat/s-valuef.adb (Impl): Pass 1 as Parts actual parameter. (Scan_Fixed): Adjust to type changes. (Value_Fixed): Likewise. * libgnat/s-valrea.adb (Need_Extra): Delete. (Precision_Limit): Always use the precision of the mantissa. (Impl): Pass 2 as Parts actual parameter. (Exact_Log2): New expression function. (Integer_to_Real): Change type of Scale and Val and deal with a 2-part integer mantissa. (Scan_Real): Adjust to type changes. (Value_Real): Likewise. --tKW2IUtsqtDRztdT Content-Type: application/gzip Content-Disposition: attachment; filename="patch.diff.gz" Content-Transfer-Encoding: base64 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 kVV+AAA= --tKW2IUtsqtDRztdT--