From patchwork Thu Jan 25 20:34:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Mezentsev X-Patchwork-Id: 866019 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-472057-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="nwGC4WTG"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zSDLB4Q1qz9s8J for ; Fri, 26 Jan 2018 07:34:57 +1100 (AEDT) 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; q=dns; s=default; b=NvTmWYnUN6W7 O6sjtQQbo8xWgOSqz1xaOu10u88/cxJz+X+O+JTAaMcy1BVWP6Ld8DTB5LHr98Yh 3nrx3g8g07jFK5ZFnRcS/ZBsoGeB1A1NMedGipfz7jiMTIZGtTRywyuuZpIB+KHd B41ego9wAHiLcSgPf5zTh56aJWz63Iw= 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; s=default; bh=BVKoLs30ESaSf6AVA+ y112jxgDg=; b=nwGC4WTGUZQtT6st4fXDQgpUTYyP2I/EuRTYQ322KIBImZYNcL uKsjp6IIWOZFBG5b+2O4Pxa0+RQ+dJJOoRKFOcX8ERJ9qfWRU8B7we6Jvi3m3tga wKj6lIDyxhVzcXnEoSd8A2gIDJeQch01uxXLBv/XJvbdCk7wi4GcIQHDE= Received: (qmail 76419 invoked by alias); 25 Jan 2018 20:34:47 -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 76405 invoked by uid 89); 25 Jan 2018 20:34:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LOTSOFHASH, KAM_NUMSUBJECT, SPF_PASS, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.2 spammy=underflow, 0li X-HELO: userp2120.oracle.com Received: from userp2120.oracle.com (HELO userp2120.oracle.com) (156.151.31.85) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 25 Jan 2018 20:34:38 +0000 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w0PKVmmn125993 for ; Thu, 25 Jan 2018 20:34:37 GMT Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp2120.oracle.com with ESMTP id 2fqp5y034b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 25 Jan 2018 20:34:36 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w0PKYYRM031317 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Thu, 25 Jan 2018 20:34:36 GMT Received: from abhmp0009.oracle.com (abhmp0009.oracle.com [141.146.116.15]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id w0PKYYc1018425 for ; Thu, 25 Jan 2018 20:34:34 GMT Received: from vmezents-linux.us.oracle.com (/10.159.138.252) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 25 Jan 2018 12:34:33 -0800 From: vladimir.mezentsev@oracle.com To: gcc-patches@gcc.gnu.org Cc: vladimir.mezentsev@oracle.com Subject: [PATCH] PR libgcc/59714 complex division is surprising on aarch64 Date: Thu, 25 Jan 2018 12:34:27 -0800 Message-Id: <1516912467-13364-1-git-send-email-vladimir.mezentsev@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8785 signatures=668655 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=1 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1711220000 definitions=main-1801250272 From: Vladimir Mezentsev Tested on aarch64-linux-gnu, x86_64-pc-linux-gnu and sparc64-unknown-linux-gnu. No regression. New tests now passed. There is a performance degradation for complex double type: failed cases | time old new | old new complex-32 15 0 | 3.51 3.56 complex-64 19 0 | 1.88 2.34 complex-128 34 0 | 3.71 2.88 ChangeLog: 2018-01-25 Vladimir Mezentsev PR libgcc/59714 * libgcc/libgcc2.c: New complex division implementation * libgcc/config/sparc/sfp-machine.h: New * gcc/testsuite/gcc.c-torture/execute/pr59714_128.c: New test * gcc/testsuite/gcc.c-torture/execute/pr59714_32.c: New test * gcc/testsuite/gcc.c-torture/execute/pr59714_64.c: New test --- gcc/testsuite/gcc.c-torture/execute/pr59714_128.c | 506 ++++++++++++++++++++++ gcc/testsuite/gcc.c-torture/execute/pr59714_32.c | 506 ++++++++++++++++++++++ gcc/testsuite/gcc.c-torture/execute/pr59714_64.c | 506 ++++++++++++++++++++++ libgcc/config/sparc/sfp-machine.h | 13 + libgcc/libgcc2.c | 175 +++++++- 5 files changed, 1700 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr59714_128.c create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr59714_32.c create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr59714_64.c create mode 100644 libgcc/config/sparc/sfp-machine.h diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59714_128.c b/gcc/testsuite/gcc.c-torture/execute/pr59714_128.c new file mode 100644 index 0000000..e26f40a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr59714_128.c @@ -0,0 +1,506 @@ +#include +#include + +extern void abort (void); +#define FABS(x) ((x) >= 0 ? (x) : -(x)) +#define FTYPE long double +#define FMT "%-39.28La" + +/* + Tables of numbers for complex division testing + All values in hex format + z[i] == correctly rounded value of x[i]/y[i]; + */ + +#define NUMCNT 100 + +__complex FTYPE x[NUMCNT] = + { + 0x1.0p0L + 0x1.0p0Li, /* #1 */ + 0x1.0p0L + 0x1.0p0Li, /* #2 */ + 0x1.0p1023L + 0x1.0p-1023Li, /* #3 */ + 0x1.0p1023L + 0x1.0p1023Li, /* #4 */ + 0x1.0p1020L + 0x1.0p-844Li, /* #5 */ + 0x1.0p-71L + 0x1.0p1021Li, /* #6 */ + 0x1.0p-347L + 0x1.0p-54Li, /* #7 */ + 0x1.0p-1074L + 0x1.0p-1074Li, /* #8 */ + 0x1.0p1015L + 0x1.0p-989Li, /* #9 */ + 0x1.0p-622L + 0x1.0p-1071Li, /* #10 */ + 0x1.0p0L + 0x3.0p0Li, /* #11 */ + -0x1.0p0L + 0x3.0p0Li, /* #12 */ + 0x1.0p0L - 0x3.0p0Li, /* #13 */ + 0x3.0p0L + 0x1.0p0Li, /* #14 */ + 0x3.0p0L + 0x4.0p0Li, /* #15 */ + 0x1.0p0L - 0x3.000000001p-20Li, /* #16 */ + 0x1.0p0L + 0x3.00000000001p-20Li, /* #17 */ + 0x1.0p0L + 0x1.8000000000002p1Li, /* #18 */ + 0x1.0p0L + 0x1.8000000000004p1Li, /* #19 */ + 0x1.0p0L + 0x1.8000000000008p1Li, /* #20 */ + 0x1.0p0L + 0x1.8000000000010p1Li, /* #21 */ + 0x1.0p0L + 0x1.8000000000020p1Li, /* #22 */ + 0x1.0p0L + 0x1.8000000000040p1Li, /* #23 */ + 0x1.0p0L + 0x1.8000000000080p1Li, /* #24 */ + 0x1.0p0L + 0x1.7ffffffffff8p1Li, /* #25 */ + 0x1.0p0L + 0x1.7ffffffffff0p1Li, /* #26 */ + 0x1.0p0L + 0x1.7fffffffff80p1Li, /* #27 */ + 0x1.0p0L + 0x1.7fffffffff00p1Li, /* #28 */ + 0x5.0p0L + 0x5.0p0Li, /* #29 */ + 0x4.0p0L + 0x3.0p0Li, /* #30 */ + -0x4.0p0L + 0x3.000000001p0Li, /* #31 */ + 0x3.00000000001p-20L + 0x1.0p0Li, /* #32 */ + 0x1.00000000001p-80L + 0x1.0p0Li, /* #33 */ + 0x1.00000000001p-8000L + 0x1.0p0Li, /* #34 */ + 0x1.0p0L + 0x1.00000000001p-8000Li, /* #35 */ + -0x1.0p0L + 0x1.00000000001p-8000Li,/* #36 */ + -0x1.0p0L + 0x1.00000000001p-8000Li,/* #37 */ + -0x1.0p0L + 0x1.00000000001p-8000Li,/* #38 */ + 0x1.0p0L - 0x1.00000000001p-8000Li, /* #39 */ + 0x1.0p1000L - 0x1.00000000001p-8000Li, /* #40 */ + 0x1.97530p1000L - 0x1.00000000001p-8000Li, /* #41 */ + 0x1.97530p3000L - 0x1.00000000001p-8000Li, /* #42 */ + 0x1.97530p3770L - 0x1.00000000001p-8000Li, /* #43 */ + 0x1.97530p4770L - 0x1.00000000001p-7000Li, /* #44 */ + 0x1.97530p0L - 0x1.00000000001p-12000Li, /* #45 */ + 0x1.97530p1000L - 0x1.00000000001p-11000Li, /* #46 */ + 0x1.97530p2000L - 0x1.00000000001p-9000Li, /* #47 */ + 0x1.97530p3000L - 0x1.00000000001p-8000Li, /* #48 */ + 0x1.97530p4000L - 0x1.00000000001p-7000Li, /* #49 */ + 0x1.97530p5000L - 0x1.00000000001p-6000Li, /* #50 */ + 0x1.97530p6000L - 0x1.00000000001p-5000Li, /* #51 */ + 0x1.97530p7000L - 0x1.00000000001p-4000Li, /* #52 */ + 0x1.97530p8000L - 0x1.00000000001p-1000Li, /* #53 */ + 0x1.97530p9000L - 0x1.00000000001p-0Li, /* #54 */ + 0x1.97530p10000L + 0x1.00000000001p2000Li, /* #55 */ + 0x1.97530p10100L + 0x1.00000000000p3000Li, /* #56 */ + 0x1.97530p8000L + 0x1.00000000000p4000Li, /* #57 */ + 0x1.97530p7000L + 0x1.00000000000p5000Li, /* #58 */ + 0x1.97530p6000L + 0x1.00000000000p6000Li, /* #59 */ + 0x1.97530p5200L + 0x1.00000000000p5200Li, /* #60 */ + 0x1.0p1020L + 0x1.0p-844Li, /* #61 */ + 0x1.0p920L + 0x1.0p-844Li, /* #62 */ + 0x1.0p504L + 0x1.0p523Li, /* #63 */ + 0x1.0p1004L + 0x1.0p-512Li, /* #64 */ + 0x1.0p910L + 0x1.0p-512Li, /* #65 */ + 0x1.0p865L + 0x1.0p-512Li, /* #66 */ + 0x1.0p864L + 0x1.0p-512Li, /* #67 */ + 0x1.0p860L + 0x1.0p-512Li, /* #68 */ + 0x1.0p810L + 0x1.0p-512Li, /* #69 */ + 0x1.0p710L + 0x1.0p-512Li, /* #70 */ + 0x1.0p610L + 0x1.0p-512Li, /* #71 */ + 0x1.0p510L + 0x1.0p-512Li, /* #72 */ + 0x1.0p410L + 0x1.0p-512Li, /* #73 */ + 0x13.0p4L + 0x1.0p-4Li, /* #74 */ + 0x13.0p2L + 0x13.0p2Li, /* #75 */ + 0x13.0p4L + 0x1.0p4Li, /* #76 */ + 0x12.0p4L + 0x12.0p-4Li, /* #77 */ + 0x1.0p1L + 0x12.0p1Li, /* #78 */ + 0x1.0p2L + 0x1.0p4Li, /* #79 */ + 0x13.0p0L + 0x0.0p0Li, /* #80 */ + 0x1.01p12L - 0x1.037p-12Li, /* #81 */ + -0x1.01p12L - 0x1.037p-12Li, /* #82 */ + 0x1.01p12L - 0x1.037p-12Li, /* #83 */ + -0x1.01p12L - 0x1.037p-12Li, /* #84 */ + 0x1.01p12L - 0x1.037p-12Li, /* #85 */ + 0x1.123456p3L - 0x1.789123p4Li, /* #86 */ + 0x1.123457p3L - 0x1.789123p4Li, /* #87 */ + 0x1.123458p3L + 0x1.789123p4Li, /* #88 */ + 0x1.123456p3L + 0x1.789122p4Li, /* #89 */ + 0x1.123456p3L + 0x1.789121p4Li, /* #90 */ + 0x1.123456p3L + 0x1.789120p4Li, /* #91 */ + 0x1.123455p3L - 0x1.789123p4Li, /* #92 */ + 0x1.123454p3L - 0x1.789122p4Li, /* #93 */ + -0x1.123453p3L + 0x1.789121p4Li, /* #94 */ + 0x1.123452p3L + 0x1.789120p4Li, /* #95 */ + 0x1.123451p3L - 0x1.789127p4Li, /* #96 */ + 0x1.123459p3L - 0x1.789125p4Li, /* #97 */ + -0x1.123450p3L + 0x1.789124p4Li, /* #98 */ + 0x1.1234561p3L + 0x1.7891231p4Li, /* #99 */ + 0x1.1234561p3L - 0x1.7891231p4Li /* #100 */ + }; + +__complex FTYPE y[NUMCNT] = + { + 0x1.0p0L + 0x1.0p1023Li, /* #1 */ + 0x1.0p-1023L + 0x1.0p-1023Li, /* #2 */ + 0x1.0p677L + 0x1.0p-677Li, /* #3 */ + 0x1.0p0L + 0x1.0p0Li, /* #4 */ + 0x1.0p656L + 0x1.0p-780Li, /* #5 */ + 0x1.0p1001L + 0x1.0p-323Li, /* #6 */ + 0x1.0p-1037L + 0x1.0p-1058Li, /* #7 */ + 0x1.0p-1073L + 0x1.0p-1074Li, /* #8 */ + 0x1.0p1023L + 0x1.0p1023Li, /* #9 */ + 0x1.0p-343L + 0x1.0p-798Li, /* #10 */ + 0x1.0p0L + 0x3.0p0Li, /* #11 */ + -0x1.0p0L + 0x3.0p0Li, /* #12 */ + 0x1.0p0L - 0x3.0p0Li, /* #13 */ + 0x3.0p0L + 0x1.0p0Li, /* #14 */ + 0x3.0p0L + 0x4.0p0Li, /* #15 */ + -0x2.0p0L + 0x8.0p-10Li, /* #16 */ + 0x1.0p0L + 0x3.0p-20Li, /* #17 */ + 0x1.0p0L + 0x3.0p0Li, /* #18 */ + 0x1.0p0L + 0x3.0p0Li, /* #19 */ + 0x1.0p0L + 0x3.0p0Li, /* #20 */ + 0x1.0p0L + 0x3.0p0Li, /* #21 */ + 0x1.0p0L + 0x3.0p0Li, /* #22 */ + 0x1.0p0L + 0x3.0p0Li, /* #23 */ + 0x1.0p0L + 0x3.0p0Li, /* #24 */ + 0x1.0p0L + 0x3.0p0Li, /* #25 */ + 0x1.0p0L + 0x3.0p0Li, /* #26 */ + 0x1.0p0L + 0x3.0p0Li, /* #27 */ + 0x1.0p0L + 0x3.0p0Li, /* #28 */ + 0x3.0p0L + 0x4.0p0Li, /* #29 */ + 0x3.0p0L - 0x4.0p0Li, /* #30 */ + -0x3.0p0L - 0x4.0p0Li, /* #31 */ + 0x3.0p-20L + 0x1.0p0Li, /* #32 */ + 0x1.0p-80L + 0x1.0p0Li, /* #33 */ + 0x1.0p-80L + 0x1.0p0Li, /* #34 */ + 0x1.0p0L + 0x1.0p-8000Li, /* #35 */ + 0x1.0p0L + 0x1.0p-8000Li, /* #36 */ + -0x1.0p0L + 0x1.0p-8000Li, /* #37 */ + 0x1.0p0L - 0x1.0p-8000Li, /* #38 */ + 0x1.0p0L + 0x1.0p-8000Li, /* #39 */ + 0x1.0p100L + 0x1.0p-8000Li, /* #40 */ + 0x1.97530p100L + 0x1.0p-8000Li, /* #41 */ + 0x1.97530p300L + 0x1.0p-8000Li, /* #42 */ + 0x1.0p-6000L + 0x1.97530p3770Li, /* #43 */ + 0x1.0p-5000L + 0x1.97530p4770Li, /* #44 */ + 0x1.0p-9000L + 0x1.97530p0Li, /* #45 */ + 0x1.0p-8000L + 0x1.97530p1000Li, /* #46 */ + 0x1.0p-7000L + 0x1.97530p2000Li, /* #47 */ + 0x1.0p-6000L + 0x1.97530p3000Li, /* #48 */ + 0x1.0p-5000L + 0x1.97530p4000Li, /* #49 */ + 0x1.0p-4000L + 0x1.97530p5000Li, /* #50 */ + 0x1.0p-3000L + 0x1.97530p6000Li, /* #51 */ + 0x1.0p-2000L + 0x1.97530p7000Li, /* #52 */ + 0x1.0p-1000L + 0x1.97530p8000Li, /* #53 */ + 0x1.0p-0L + 0x1.97530p900Li, /* #54 */ + 0x1.97530p100L + 0x1.0000p100Li, /* #55 */ + 0x1.97530p50L + 0x1.0000p50Li, /* #56 */ + 0x1.97530p100L + 0x1.0000p50Li, /* #57 */ + 0x1.97530p1L + 0x1.0000p1Li, /* #58 */ + 0x1.97530p1L + 0x1.0000p1Li, /* #59 */ + 0x1.97530p1L + 0x1.0000p1Li, /* #60 */ + 0x1.0p656L + 0x1.0p-730Li, /* #61 */ + 0x1.0p656L + 0x1.0p-730Li, /* #62 */ + 0x1.0p-500L + 0x1.0p-1000Li, /* #63 */ + 0x1.0p0L + 0x1.0p-500Li, /* #64 */ + 0x1.0p-110L + 0x1.0p-500Li, /* #65 */ + 0x1.0p-155L + 0x1.0p-500Li, /* #66 */ + 0x1.0p-156L + 0x1.0p-500Li, /* #67 */ + 0x1.0p-160L + 0x1.0p-500Li, /* #68 */ + 0x1.0p-210L + 0x1.0p-500Li, /* #69 */ + 0x1.0p-310L + 0x1.0p-500Li, /* #70 */ + 0x1.0p-410L + 0x1.0p-500Li, /* #71 */ + 0x1.0p-510L + 0x1.0p-600Li, /* #72 */ + 0x1.0p-610L + 0x1.0p-700Li, /* #73 */ + 0x5.0p1L + 0x12.0p1Li, /* #74 */ + 0x5.0p1L + 0x12.0p1Li, /* #75 */ + 0x5.0p1L + 0x12.0p1Li, /* #76 */ + 0x5.0p1L + 0x12.0p1Li, /* #77 */ + 0x5.0p1L + 0x12.0p1Li, /* #78 */ + 0x5.0p1L + 0x12.0p1Li, /* #79 */ + 0x5.0p1L + 0x12.0p1Li, /* #80 */ + 0x3.1p0L + 0x1.1p0Li, /* #81 */ + -0x3.0p0L + 0x1.1p0Li, /* #82 */ + -0x3.0p0L + 0x1.1p0Li, /* #83 */ + 0x3.0p0L + 0x1.1p0Li, /* #84 */ + 0x3.0p0L + 0x1.1p0Li, /* #85 */ + 0x1.456789p2L - 0x1.789123p1Li, /* #86 */ + 0x1.124569p2L - 0x1.781239p3Li, /* #87 */ + 0x1.123457p3L - 0x1.789126p4Li, /* #88 */ + 0x1.123456p1L + 0x1.891237p4Li, /* #89 */ + 0x1.123456p2L + 0x1.357123p3Li, /* #90 */ + 0x1.123456p3L - 0x1.789123p1Li, /* #91 */ + 0x1.123456p1L - 0x1.789123p4Li, /* #92 */ + 0x1.123456p2L + 0x1.789123p1Li, /* #93 */ + 0x1.123456p3L + 0x1.789123p0Li, /* #94 */ + -0x1.123456p1L - 0x1.789153p-2Li, /* #95 */ + -0x1.123456p2L - 0x1.785123p7Li, /* #96 */ + -0x1.123456p3L + 0x1.789123p9Li, /* #97 */ + 0x1.123456p1L - 0x1.789123p20Li, /* #98 */ + 0x1.123456p2L - 0x1.337788p21Li, /* #99 */ + 0x1.123457p3L - 0x1.789991p3Li /* #100 */ + }; + +__complex FTYPE z[NUMCNT] = + { + 0x1.0p-1023L - 0x1.0p-1023Li, /* #1 */ + 0x1.0p1023L + 0x0.0p0Li, /* #2 */ + 0x1.0p346L - 0x1.0p-1008Li, /* #3 */ + 0x1.0p1023L + 0x0.0p0Li, /* #4 */ + 0x1.0p364L - 0x1.0p-1072Li, /* #5 */ + 0x1.0p-1072L + 0x1.0p20Li, /* #6 */ + 0x1.ffffffffff800000000020p+961L + 0x1.ffffffffff800000000020p+982Li,/* #7 */ + 0x1.3333333333333333333333333333p-1L + 0x1.999999999999999999999999999ap-3Li,/* #8 */ + 0.001953125L - 0.001953125Li, /* #9 */ + 0x1.000000000000000000000000000p-279L + 0x1.f800000000000000000000000000p-729Li,/* #10 */ + 0x1.0p0L + 0x0.0p0Li, /* #11 */ + 0x1.0p0L + 0x0.0p0Li, /* #12 */ + 0x1.0p0L + 0x0.0p0Li, /* #13 */ + 0x1.0p0L + 0x0.0p0Li, /* #14 */ + 0x1.0p0L + 0x0.0p0Li, /* #15 */ + -0x1.fffe0061ff9e0063ff9c0063ff9cp-2L - 0x1.ff9e0061ff9c0063ff9c0063ff9cp-10Li,/* #16 */ + 0x1.0000000000000000000030000000p+0L + 0x1.ffffffffee00000000a1fffffffap-65Li,/* #17 */ + 0x1.0000000000001333333333333333p+0L + 0x1.9999999999999999999999999999p-54Li,/* #18 */ + 0x1.0000000000002666666666666666p+0L + 0x1.9999999999999999999999999999p-53Li,/* #19 */ + 0x1.0000000000004ccccccccccccccdp+0L + 0x1.9999999999999999999999999999p-52Li,/* #20 */ + 0x1.000000000000999999999999999ap+0L + 0x1.999999999999999999999999999ap-51Li,/* #21 */ + 0x1.0000000000013333333333333333p+0L + 0x1.999999999999999999999999999ap-50Li,/* #22 */ + 0x1.0000000000026666666666666666p+0L + 0x1.999999999999999999999999999ap-49Li,/* #23 */ + 0x1.000000000004cccccccccccccccdp+0L + 0x1.999999999999999999999999999ap-48Li,/* #24 */ + 0x1.fffffffffff66666666666666666p-1L - 0x1.999999999999999999999999999ap-48Li,/* #25 */ + 0x1.ffffffffffeccccccccccccccccdp-1L - 0x1.999999999999999999999999999ap-47Li,/* #26 */ + 0x1.ffffffffff666666666666666666p-1L - 0x1.999999999999999999999999999ap-44Li,/* #27 */ + 0x1.fffffffffecccccccccccccccccdp-1L - 0x1.999999999999999999999999999ap-43Li,/* #28 */ + 0x1.6666666666666666666666666666p+0L - 0x1.999999999999999999999999999ap-3Li,/* #29 */ + 0x0.0p0L + 0x1.0p0Li, /* #30 */ + -0x1.47ae147ae147ae147ae147ae147bp-39L - 0x1.0000000001eb851eb851eb851eb8p+0Li,/* #31 */ + 0x1.0000000000000000000030000000p+0L - 0x1.ffffffffee00000000a1fffffffap-65Li,/* #32 */ + 0x1.00000000000000p0L - 0x1.0000000000000p-124Li, /* #33 */ + 0x1.00000000000000p0L + 0x1.0000000000000p-80Li, /* #34 */ + 0x1.00000000000000p0L + 0x1.0000000000000p-8044Li, /* #35 */ + -0x1.00000000000000p0L + 0x1.0000000000080p-7999Li, /* #36 */ + 0x1.00000000000000p0L - 0x1.0000000000000p-8044Li, /* #37 */ + -0x1.00000000000000p0L + 0x1.0000000000000p-8044Li, /* #38 */ + 0x1.00000000000000p0L - 0x1.0000000000080p-7999Li, /* #39 */ + 0x1.00000000000000p+900L - 0x1.0000000000000p-7200Li,/* #40 */ + 0x1.0000000000000000000000000000p+900L - 0x1.41c9b303bfbf1bb3465e771d2c5fp-7201Li,/* #41 */ + 0x1.0000000000000000000000000000p+2700L - 0x1.41c9b303bfbf1bb3465e771d2c5fp-5601Li,/* #42 */ + 0x1.41c9b303bfb510p-9771L - 0x1.0000000000000p0Li, /* #43 */ + 0x1.41c9b303bfb510p-9771L - 0x1.0000000000000p0Li, /* #44 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #45 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #46 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #47 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #48 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #49 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #50 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #51 */ + 0x1.41c9b303bfb50d65ae407974c131p-9001L - 0x1.0000000000000000000000000000p+0Li,/* #52 */ + -0x1.41c9b303bfb50d65ae407974c131p-9045L - 0x1.0000000000000000000000000000p+0Li,/* #53 */ + 0x1.41c9b303bfb50d65ae407974c131p+7199L - 0x1.0000000000000000000000000000p+8100Li,/* #54 */ + 0x1.6f0647208a31a185daaf720445b3p+9899L - 0x1.cd580bc4697c9439a5da55b27b9dp+9898Li,/* #55 */ + 0x1.6f0647208a31a185daaf720445b3p+10049L - 0x1.cd580bc4697c9439a5da55b27b9dp+10048Li,/* #56 */ + 0x1.fffffffffffffffffffffffff35cp+7899L - 0x1.41c9b303bfb50d65ae407974b940p+7849Li,/* #57 */ + 0x1.6f0647208a31a185daaf720445b3p+6998L -0x1.cd580bc4697c9439a5da55b27b9dp+6997Li,/* #58 */ + 0x1.00000000000000p5999L + 0x0.0000000000000p0Li, /* #59 */ + 0x1.00000000000000p5199L + 0x0.0000000000000p0Li, /* #60 */ + 0x1.0p364L - 0x1.0p-1022Li, /* #61 */ + 0x1.0p264L + 0x0.0p0Li, /* #62 */ + 0x1.0p1004L + 0x1.0p1023Li, /* #63 */ + 0x1.0p1004L - 0x1.0p504Li, /* #64 */ + 0x1.0p1020L - 0x1.0p630Li, /* #65 */ + 0x1.0p1020L - 0x1.0p675Li, /* #66 */ + 0x1.0p1020L - 0x1.0p676Li, /* #67 */ + 0x1.0p1020L - 0x1.0p680Li, /* #68 */ + 0x1.0p1020L - 0x1.0p730Li, /* #69 */ + 0x1.0p1020L - 0x1.0p830Li, /* #70 */ + 0x1.0p1020L - 0x1.0p930Li, /* #71 */ + 0x1.0p1020L - 0x1.0p930Li, /* #72 */ + 0x1.0p1020L - 0x1.0p930Li, /* #73 */ + 0x1.16f21023358c1a682913ce1ecedbp+1L - 0x1.f5b3b6a5c6c8fc5516bd3fd10df0p+2Li,/* #74 */ + 0x1.408cd63069a0a44f387b3b6a5c6dp+1L - 0x1.6a5c6c8fc5516bd3fd10defdcca7p+0Li,/* #75 */ + 0x1.4b8d91f8aa2d7a7fa21bdfb994e8p+1L - 0x1.ee6539f2cbeb7618f09892b4726ep+2Li,/* #76 */ + 0x1.0bc8408cd63069a0a44f387b3b6ap+1L - 0x1.daceda971b23f1545af4ff4437bfp+2Li,/* #77 */ + 0x1.e2a8b5e9fe886f7ee6539f2cbeb7p-1L + 0x1.a682913ce1eceda971b23f1545afp-3Li,/* #78 */ + 0x1.c3d9db52e3647e2a8b5e9fe886f8p-2L + 0x1.77908119ac60d341489e70f676d5p-7Li,/* #79 */ + 0x1.16bd3fd10defdcca73e597d6ec32p-3L - 0x1.f5bb0c784c495a393703aae942c0p-2Li,/* #80 */ + 0x1.2b9c43596635aca22a41182c285ap+10L - 0x1.9fc933bd0b3ad039dc99076c4ce5p+8Li,/* #81 */ + 0x1.3079a1638e441f32a5aa1b723a40p+10L + 0x1.af56ff5f5ee08187c006518c7d30p+8Li,/* #82 */ + -0x1.3079a23d4567c32f17cb15076791p+10L - 0x1.af56f5c477a85482b70a5dca7d62p+8Li,/* #83 */ + -0x1.3079a23d4567c32f17cb15076791p+10L + 0x1.af56f5c477a85482b70a5dca7d62p+8Li,/* #84 */ + 0x1.3079a1638e441f32a5aa1b723a40p+10L - 0x1.af56ff5f5ee08187c006518c7d30p+8Li,/* #85 */ + 0x1.a27419691d7845d82a1a772258e1p+1L - 0x1.5e60a434afdfd9c1419d2d842cc2p+1Li,/* #86 */ + 0x1.004a6235052b9121263d9c6bbcf4p+1L - 0x1.077970d2017e9637b3c295f86c7cp-10Li,/* #87 */ + -0x1.8825f329396f03f5c813952be304p-1L + 0x1.492fb9aef1c34c5b463f22218a07p-1Li,/* #88 */ + 0x1.f6417093502e5e03be9d91d13905p-1L - 0x1.0d936b36d23867a75c17114df9ecp-2Li,/* #89 */ + 0x1.2e6b76d3c1a73913587096f2fbbdp+1L + 0x1.4911f033da9e45b4f001b864e760p-3Li,/* #90 */ + 0x1.a1ced84e145e8f5819427f5ea14ep-5L + 0x1.61ced4d722d37f7966cd7c068306p+1Li,/* #91 */ + 0x1.064f7bc3e4833b1e0eff54a3a904p+0L + 0x1.1551c3ae74bd101253588f742243p-2Li,/* #92 */ + -0x1.344545d341aa8a2f9369a5ec3128p+0L - 0x1.2aa5da272dd3d1102e6c406cbc70p+2Li,/* #93 */ + -0x1.06d98474fe894386c4fbcde25e3bp-1L + 0x1.6ad8d7df1b0c7bd93084ecbd82ebp+1Li,/* #94 */ + -0x1.6deb5a7bec3179206289e83a4b65p+2L - 0x1.4028b8d0a2fc1a39d6eea3f8bb57p+3Li,/* #95 */ + 0x1.fbd4560086545ef1cd464e251162p-4L + 0x1.8c3278a9ca9b4301daab9f0d2131p-5Li,/* #96 */ + -0x1.0106f72f51797fe080e71a8997a9p-5L - 0x1.69200e9aa701c65e7069852801a9p-7Li,/* #97 */ + -0x1.00000929d9955dc02885e23cfb27p-16L - 0x1.74d2319d4234332ac55f42cc52d5p-18Li,/* #98 */ + -0x1.39887db89b6869b8281a9f4222eep-17L + 0x1.c89cdfee34a155f4544297ef8798p-19Li,/* #99 */ + 0x1.a746a452d342fdd9745efdf4d52ap+0L - 0x1.e72d9f35e28e6208e42c8cc5a560p-2Li/* #100 */ + }; + + +__complex FTYPE errmax[NUMCNT] = + { + 0x0.000000000000000000000000p0L + 0x0.000000000000000000000000p0Li,/* #1 */ + 0x0.000000000000000000000001p1023+ 0x0.000000000000000000000001p0Li,/* #2 */ + 0x0.000000000000000000000001p346L + 0x0.000000000000000100000000p-1008Li,/* #3 */ + 0x0.000000000000000000000001p1023+ 0x0.000000000000000000000001p0Li,/* #4 */ + 0x0.000000000000000000000001p364L + 0x0.000000000000000000000000p0Li,/* #5 */ + 0x0.000000000000000000000000p0L + 0x0.000000000000000000000001p20Li,/* #6 */ + 0x0.000000000000000000000001p961L + 0x0.00000000000000000000001p982Li,/* #7 */ + 0x0.000000000000000000000001p-1L + 0x0.00000000000000000000001p-3Li, /* #8 */ + 0x0.000000000000000000000001p-9L + 0x0.000000000000000000000001p-9Li,/* #9 */ + 0x0.000000000000000000000001p279L + 0x0.0000000000000000000000001p-171Li,/* #10 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000000001p0Li,/* #11 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p0Li,/* #12 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p0Li,/* #13 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p0Li,/* #14 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p0Li,/* #15 */ + 0x0.000000000000000000000001p33L + 0x0.0000000000000000000001p-10Li,/* #16 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-65Li,/* #17 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-54Li,/* #18 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-53Li,/* #19 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-52Li,/* #20 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-51Li,/* #21 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-50Li,/* #22 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-49Li,/* #23 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-48Li,/* #24 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p-48Li,/* #25 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p-47Li,/* #26 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p-44Li,/* #27 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p-43Li,/* #28 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-3Li,/* #29 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p0Li,/* #30 */ + 0x0.000000000000000000000001p-39L + 0x0.0000000000000000000001p0Li,/* #31 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-65Li,/* #32 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-124Li,/* #33 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-80Li,/* #34 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-8044Li,/* #35 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-7999Li,/* #36 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-8044Li,/* #37 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-8044Li,/* #38 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-7999Li,/* #39 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-7200Li,/* #40 */ + 0x0.000000000000000000000001p900L + 0x0.0000000000000000000001p-720Li,/* #41 */ + 0x0.000000000000000000000001p2700L + 0x0.0000000000000000000001p-560Li,/* #42 */ + 0x0.000000000000100000000000p-9771L+ 0x0.0000000000000000000001p0Li,/* #43 */ + 0x0.000000000000100000000001p-9771L+ 0x0.0000000000000000000001p0Li,/* #44 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #45 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #46 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #47 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #48 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #49 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #50 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #51 */ + 0x0.000000000000000000000001p-9001L+ 0x0.0000000000000000000001p0Li,/* #52 */ + 0x0.000000000000000000000001p-9045L+ 0x0.0000000000000000000001p0Li,/* #53 */ + 0x0.000000000000000000000001p7199L+ 0x0.0000000000000000000001p8100Li,/* #54 */ + 0x0.000000000000000000000001p9899L+ 0x0.0000000000000000000001p9898Li,/* #55 */ + 0x0.000000000000000000000001p10049L+ 0x0.0000000000000000000001p10048Li,/* #56 */ + 0x0.000000000000000000000001p7899L+ 0x0.0000000000000000000001p7849Li,/* #57 */ + 0x0.000000000000000000000001p6998L+ 0x0.0000000000000000000001p6997Li,/* #58 */ + 0x0.000000000000000000000001p5999L+ 0x0.0000000000000000000001p0Li,/* #59 */ + 0x0.000000000000000000000001p5199L+ 0x0.0000000000000000000001p0Li,/* #60 */ + 0x0.000000000000000000000001p364L+ 0x0.0000000000000000000000p0Li,/* #61 */ + 0x0.000000000000000000000001p264L+ 0x0.0000000000000000000001p0Li,/* #62 */ + 0x0.000000000000000000000001p1004L+ 0x0.0000000000000000000001p1023Li,/* #63 */ + 0x0.000000000000000000000001p1004L+ 0x0.0000000000000000000001p504Li,/* #64 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p630Li,/* #65 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p675Li,/* #66 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p676Li,/* #67 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p680Li,/* #68 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p730Li,/* #69 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p830Li,/* #70 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p930Li,/* #71 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p930Li,/* #72 */ + 0x0.000000000000000000000001p1020L+ 0x0.0000000000000000000001p930Li,/* #73 */ + 0x0.000000000000000000000001p7L + 0x0.0000000000000000000001p0Li,/* #74 */ + 0x0.000000000000000000000001p1L + 0x0.0000000000000000000001p0Li,/* #75 */ + 0x0.000000000000000000000001p1L + 0x0.0000000000000000000001p2Li,/* #76 */ + 0x0.000000000000000000000001p1L + 0x0.0000000000000000000001p2Li,/* #77 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p-3Li,/* #78 */ + 0x0.000000000000000000000001p-2L + 0x0.0000000000000000000001p-7Li,/* #79 */ + 0x0.000000000000000000000001p-3L + 0x0.0000000000000000000001p-2Li,/* #80 */ + 0x0.000000000000000000000001p10L + 0x0.0000000000000000000001p8Li,/* #81 */ + 0x0.000000000000000000000001p10L + 0x0.0000000000000000000001p8Li,/* #82 */ + 0x0.000000000000000000000001p10L + 0x0.0000000000000000000001p8Li,/* #83 */ + 0x0.000000000000000000000001p10L + 0x0.0000000000000000000001p8Li,/* #84 */ + 0x0.000000000000000000000001p10L + 0x0.0000000000000000000001p8Li,/* #85 */ + 0x0.000000000000000000000001p1L + 0x0.0000000000000000000001p1Li,/* #86 */ + 0x0.000000000000000000000001p1L + 0x0.0000000000000000000001p-10Li,/* #87 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p-1Li,/* #88 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p-2Li,/* #89 */ + 0x0.000000000000000000000001p1L + 0x0.0000000000000000000001p-3Li,/* #90 */ + 0x0.000000000000000000000001p-5L + 0x0.0000000000000000000001p1Li,/* #91 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-2Li,/* #92 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p2Li,/* #93 */ + 0x0.000000000000000000000001p-1L + 0x0.0000000000000000000001p1Li,/* #94 */ + 0x0.000000000000000000000001p2L + 0x0.0000000000000000000001p3Li,/* #95 */ + 0x0.000000000000000000000001p-4L + 0x0.0000000000000000000001p-5Li,/* #96 */ + 0x0.000000000000000000000001p-5L + 0x0.0000000000000000000001p-7Li,/* #97 */ + 0x0.000000000000000000000001p-16L + 0x0.0000000000000000000001p-18Li,/* #98 */ + 0x0.000000000000000000000001p-17L + 0x0.0000000000000000000001p-19Li,/* #99 */ + 0x0.000000000000000000000001p0L + 0x0.0000000000000000000001p-2Li/* #100 */ + }; + + +int main(int argc, char** argv) +{ + int i; + FTYPE xr, xi, yr, yi, zr, zi, zzr, zzi; + FTYPE er, ei; + __complex FTYPE ans[NUMCNT]; + int errcnt; + + errcnt = 0; + for (i = 0; i < NUMCNT; i++) + { + ans[i] = x[i] / y[i]; + if( z[i] != z[i] ) /* Check for nan/inf case */ + { + zr = __real__ z[i]; + zi = __imag__ z[i]; + zzr = __real__ ans[i]; + zzi = __imag__ ans[i]; + er = __real__ errmax[i]; + ei = __imag__ errmax[i]; + errcnt++; + printf("x %3d " FMT " " FMT "i\n", + i + 1, __real__ x[i], __imag__ x[i]); + printf ("y %3d " FMT " " FMT "i\n", + i + 1, __real__ y[i], __imag__ y[i]); + printf("expected " FMT " " FMT "i\n", + __real__ z[i], __imag__ z[i]); + printf("actual " FMT " " FMT "i /* #%d */ FAIL\n", + __real__ ans[i], __imag__ ans[i], i + 1); + printf("diff " FMT " " FMT "i\n", + zr - zzr, zi - zzi); + printf("errmax " FMT " " FMT "i\n\n", + er, ei); + } + else + { + if( z[i] != ans[i] ) + { + zr = __real__ z[i]; + zi = __imag__ z[i]; + zzr = __real__ ans[i]; + zzi = __imag__ ans[i]; + er = __real__ errmax[i]; + ei = __imag__ errmax[i]; + if( (FABS(zr-zzr) > er) || (FABS(zi-zzi) > ei)) + { /* report if error exceeds error max */ + errcnt++; + printf("x %3d " FMT " " FMT "i\n", + i + 1, __real__ x[i], __imag__ x[i]); + printf ("y %3d " FMT " " FMT "i\n", + i + 1, __real__ y[i], __imag__ y[i]); + printf("expected " FMT " " FMT "i\n", + __real__ z[i], __imag__ z[i]); + printf("actual " FMT " " FMT "i /* #%d */ FAIL\n", + __real__ ans[i], __imag__ ans[i], i + 1); + printf("diff " FMT " " FMT "i\n", + zr - zzr, zi - zzi); + printf("errmax " FMT " " FMT "i\n\n", + er, ei); + } + } + } + } + if( errcnt > 0) + { + printf("%2d Failures\n",errcnt); + abort(); + } + printf("PASS\n"); + return 0; +} + diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59714_32.c b/gcc/testsuite/gcc.c-torture/execute/pr59714_32.c new file mode 100644 index 0000000..170e363 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr59714_32.c @@ -0,0 +1,506 @@ +#include +#include + +extern void abort (void); +#define FABS(x) ((x) >= 0 ? (x) : -(x)) +#define FTYPE float +#define FMT "%-17.6a" + +/* + Tables of numbers for complex division testing + All values in hex format + z[i] == correctly rounded value of x[i]/y[i]; + */ + +#define NUMCNT 100 + +__complex FTYPE x[NUMCNT] = + { + 0x1.0p0 + 0x1.0p0i, /* #1 */ + 0x1.0p0 + 0x1.0p0i, /* #2 */ + 0x1.0p127 + 0x1.0p-126i, /* #3 */ + 0x1.0p127 + 0x1.0p127i, /* #4 */ + 0x1.0p124 + 0x1.0p-44i, /* #5 */ + 0x1.0p-71 + 0x1.0p125i, /* #6 */ + 0x1.0p-47 + 0x1.0p-54i, /* #7 */ + 0x1.0p-149 + 0x1.0p-149i, /* #8 */ + 0x1.0p120 + 0x1.0p-89i, /* #9 */ + 0x1.0p-22 + 0x1.0p-146i, /* #10 */ + 0x1.0p0 + 0x3.0p0i, /* #11 */ + -0x1.0p0 + 0x3.0p0i, /* #12 */ + 0x1.0p0 - 0x3.0p0i, /* #13 */ + 0x3.0p0 + 0x1.0p0i, /* #14 */ + 0x3.0p0 + 0x4.0p0i, /* #15 */ + 0x1.0p0 - 0x3.000002p-20i, /* #16 */ + 0x1.0p0 + 0x3.000002p-20i, /* #17 */ + 0x1.0p0 + 0x1.800002p1i, /* #18 */ + 0x1.0p0 + 0x1.800004p1i, /* #19 */ + 0x1.0p0 + 0x1.800008p1i, /* #20 */ + 0x1.0p0 + 0x1.800010p1i, /* #21 */ + 0x1.0p0 + 0x1.800020p1i, /* #22 */ + 0x1.0p0 + 0x1.800040p1i, /* #23 */ + 0x1.0p0 + 0x1.800080p1i, /* #24 */ + 0x1.0p0 + 0x1.7ffff8p1i, /* #25 */ + 0x1.0p0 + 0x1.7ffff0p1i, /* #26 */ + 0x1.0p0 + 0x1.7fff80p1i, /* #27 */ + 0x1.0p0 + 0x1.7fff00p1i, /* #28 */ + 0x5.0p0 + 0x5.0p0i, /* #29 */ + 0x4.0p0 + 0x3.0p0i, /* #30 */ + -0x4.0p0 + 0x3.000004p0i, /* #31 */ + 0x3.000004p-20 + 0x1.0p0i, /* #32 */ + 0x1.000002p-80 + 0x1.0p0i, /* #33 */ + 0x1.000002p-100 + 0x1.0p0i, /* #34 */ + 0x1.0p0 + 0x1.000002p-100i, /* #35 */ + -0x1.0p0 + 0x1.000002p-100i, /* #36 */ + -0x1.0p0 + 0x1.000002p-100i, /* #37 */ + -0x1.0p0 + 0x1.000002p-100i, /* #38 */ + 0x1.0p0 - 0x1.000002p-100i, /* #39 */ + 0x1.0p40 - 0x1.000010p-60i, /* #40 */ + 0x1.975300p50 - 0x1.000002p-100i, /* #41 */ + 0x1.975300p100 - 0x1.000002p-100i, /* #42 */ + 0x1.975300p77 - 0x1.000002p-60i, /* #43 */ + 0x1.975300p87 - 0x1.000002p-60i, /* #44 */ + 0x1.975300p0 - 0x1.000002p-60i, /* #45 */ + 0x1.975300p50 - 0x1.000002p-60i, /* #46 */ + 0x1.975300p60 - 0x1.000002p-60i, /* #47 */ + 0x1.975300p70 - 0x1.000002p-60i, /* #48 */ + 0x1.975300p80 - 0x1.000002p-60i, /* #49 */ + 0x1.975300p90 - 0x1.000002p-60i, /* #50 */ + 0x1.975300p100 - 0x1.000002p-60i, /* #51 */ + 0x1.975300p110 - 0x1.000002p-60i, /* #52 */ + 0x1.975300p115 - 0x1.000002p-60i, /* #53 */ + 0x1.975300p120 - 0x1.000002p-0i, /* #54 */ + 0x1.975300p125 + 0x1.000002p70i, /* #55 */ + 0x1.975300p126 + 0x1.000000p80i, /* #56 */ + 0x1.975300p100 + 0x1.000000p90i, /* #57 */ + 0x1.975300p90 + 0x1.000000p95i, /* #58 */ + 0x1.975300p80 + 0x1.000000p100i, /* #59 */ + 0x1.97530p72 + 0x1.000000p72i, /* #60 */ + 0x1.0p120 + 0x1.0p-844i, /* #61 */ + 0x1.0p90 + 0x1.0p-844i, /* #62 */ + 0x1.0p54 + 0x1.0p53i, /* #63 */ + 0x1.0p14 + 0x1.0p-51i, /* #64 */ + 0x1.0p90 + 0x1.0p-51i, /* #65 */ + 0x1.0p85 + 0x1.0p-51i, /* #66 */ + 0x1.0p84 + 0x1.0p-51i, /* #67 */ + 0x1.0p80 + 0x1.0p-51i, /* #68 */ + 0x1.0p81 + 0x1.0p-51i, /* #69 */ + 0x1.0p71 + 0x1.0p-51i, /* #70 */ + 0x1.0p61 + 0x1.0p-51i, /* #71 */ + 0x1.0p51 + 0x1.0p-51i, /* #72 */ + 0x1.0p41 + 0x1.0p-51i, /* #73 */ + 0x13.0p4 + 0x1.0p-4i, /* #74 */ + 0x13.0p2 + 0x13.0p2i, /* #75 */ + 0x13.0p4 + 0x1.0p4i, /* #76 */ + 0x12.0p4 + 0x12.0p-4i, /* #77 */ + 0x1.0p1 + 0x12.0p1i, /* #78 */ + 0x1.0p2 + 0x1.0p4i, /* #79 */ + 0x13.0p0 + 0x0.0p0i, /* #80 */ + 0x1.01p12 - 0x1.037p-12i, /* #81 */ + -0x1.01p12 - 0x1.037p-12i, /* #82 */ + 0x1.01p12 - 0x1.037p-12i, /* #83 */ + -0x1.01p12 - 0x1.037p-12i, /* #84 */ + 0x1.01p12 - 0x1.037p-12i, /* #85 */ + 0x1.123456p3 - 0x1.789123p4i, /* #86 */ + 0x1.123457p3 - 0x1.789123p4i, /* #87 */ + 0x1.123458p3 + 0x1.789123p4i, /* #88 */ + 0x1.123456p3 + 0x1.789122p4i, /* #89 */ + 0x1.123456p3 + 0x1.789121p4i, /* #90 */ + 0x1.123456p3 + 0x1.789120p4i, /* #91 */ + 0x1.123455p3 - 0x1.789123p4i, /* #92 */ + 0x1.123454p3 - 0x1.789122p4i, /* #93 */ + -0x1.123453p3 + 0x1.789121p4i, /* #94 */ + 0x1.123452p3 + 0x1.789120p4i, /* #95 */ + 0x1.123451p3 - 0x1.789127p4i, /* #96 */ + 0x1.123459p3 - 0x1.789125p4i, /* #97 */ + -0x1.123450p3 + 0x1.789124p4i, /* #98 */ + 0x1.123456p3 + 0x1.789123p4i, /* #99 */ + 0x1.123456p3 - 0x1.789123p4i /* #100 */ + }; + +__complex FTYPE y[NUMCNT] = + { + 0x1.0p0 + 0x1.0p127i, /* #1 */ + 0x1.0p-126 + 0x1.0p-126i, /* #2 */ + 0x1.0p77 + 0x1.0p-77i, /* #3 */ + 0x1.0p0 + 0x1.0p0i, /* #4 */ + 0x1.0p65 + 0x1.0p-78i, /* #5 */ + 0x1.0p99 + 0x1.0p-33i, /* #6 */ + 0x1.0p-133 + 0x1.0p-140i, /* #7 */ + 0x1.0p-148 + 0x1.0p-148i, /* #8 */ + 0x1.0p127 + 0x1.0p127i, /* #9 */ + 0x1.0p-34 + 0x1.0p-79i, /* #10 */ + 0x1.0p0 + 0x3.0p0i, /* #11 */ + -0x1.0p0 + 0x3.0p0i, /* #12 */ + 0x1.0p0 - 0x3.0p0i, /* #13 */ + 0x3.0p0 + 0x1.0p0i, /* #14 */ + 0x3.0p0 + 0x4.0p0i, /* #15 */ + -0x2.0p0 + 0x8.0p-10i, /* #16 */ + 0x1.0p0 + 0x3.0p-20i, /* #17 */ + 0x1.0p0 + 0x3.0p0i, /* #18 */ + 0x1.0p0 + 0x3.0p0i, /* #19 */ + 0x1.0p0 + 0x3.0p0i, /* #20 */ + 0x1.0p0 + 0x3.0p0i, /* #21 */ + 0x1.0p0 + 0x3.0p0i, /* #22 */ + 0x1.0p0 + 0x3.0p0i, /* #23 */ + 0x1.0p0 + 0x3.0p0i, /* #24 */ + 0x1.0p0 + 0x3.0p0i, /* #25 */ + 0x1.0p0 + 0x3.0p0i, /* #26 */ + 0x1.0p0 + 0x3.0p0i, /* #27 */ + 0x1.0p0 + 0x3.0p0i, /* #28 */ + 0x3.0p0 + 0x4.0p0i, /* #29 */ + 0x3.0p0 - 0x4.0p0i, /* #30 */ + -0x3.0p0 - 0x4.0p0i, /* #31 */ + 0x3.0p-20 + 0x1.0p0i, /* #32 */ + 0x1.000000p-80 + 0x1.0p0i, /* #33 */ + 0x1.0p-80 + 0x1.0p0i, /* #34 */ + 0x1.0p0 + 0x1.0p-60i, /* #35 */ + 0x1.0p0 + 0x1.0p-60i, /* #36 */ + -0x1.0p0 + 0x1.0p-60i, /* #37 */ + 0x1.0p0 - 0x1.0p-60i, /* #38 */ + 0x1.0p0 + 0x1.0p-60i, /* #39 */ + 0x1.0p40 + 0x1.0p-60i, /* #40 */ + 0x1.97530p50 + 0x1.0p-60i, /* #41 */ + 0x1.97530p80 + 0x1.0p-60i, /* #42 */ + 0x1.0p-60 + 0x1.97530p57i, /* #43 */ + 0x1.0p-50 + 0x1.97530p57i, /* #44 */ + 0x1.0p-90 + 0x1.97530p0i, /* #45 */ + 0x1.0p-80 + 0x1.97530p10i, /* #46 */ + 0x1.0p-70 + 0x1.97530p20i, /* #47 */ + 0x1.0p-60 + 0x1.97530p30i, /* #48 */ + 0x1.0p-50 + 0x1.97530p40i, /* #49 */ + 0x1.0p-40 + 0x1.97530p50i, /* #50 */ + 0x1.0p-30 + 0x1.97530p60i, /* #51 */ + 0x1.0p-20 + 0x1.97530p70i, /* #52 */ + 0x1.0p-10 + 0x1.97530p80i, /* #53 */ + 0x1.0p-0 + 0x1.97530p90i, /* #54 */ + 0x1.97530p10 + 0x1.0000p10i, /* #55 */ + 0x1.97530p50 + 0x1.0000p50i, /* #56 */ + 0x1.97530p10 + 0x1.0000p50i, /* #57 */ + 0x1.97530p1 + 0x1.0000p1i, /* #58 */ + 0x1.97530p1 + 0x1.0000p1i, /* #59 */ + 0x1.97530p1 + 0x1.0000p1i, /* #60 */ + 0x1.0p66 + 0x1.0p-73i, /* #61 */ + 0x1.0p66 + 0x1.0p-73i, /* #62 */ + 0x1.0p-50 + 0x1.0p-100i, /* #63 */ + 0x1.0p0 + 0x1.0p-50i, /* #64 */ + 0x1.0p-11 + 0x1.0p-50i, /* #65 */ + 0x1.0p-14 + 0x1.0p-50i, /* #66 */ + 0x1.0p-15 + 0x1.0p-50i, /* #67 */ + 0x1.0p-16 + 0x1.0p-50i, /* #68 */ + 0x1.0p-21 + 0x1.0p-50i, /* #69 */ + 0x1.0p-31 + 0x1.0p-50i, /* #70 */ + 0x1.0p-41 + 0x1.0p-50i, /* #71 */ + 0x1.0p-51 + 0x1.0p-60i, /* #72 */ + 0x1.0p-61 + 0x1.0p-70i, /* #73 */ + 0x5.0p1 + 0x12.0p1i, /* #74 */ + 0x5.0p1 + 0x12.0p1i, /* #75 */ + 0x5.0p1 + 0x12.0p1i, /* #76 */ + 0x5.0p1 + 0x12.0p1i, /* #77 */ + 0x5.0p1 + 0x12.0p1i, /* #78 */ + 0x5.0p1 + 0x12.0p1i, /* #79 */ + 0x5.0p1 + 0x12.0p1i, /* #80 */ + 0x3.1p0 + 0x1.1p0i, /* #81 */ + -0x3.0p0 + 0x1.1p0i, /* #82 */ + -0x3.0p0 + 0x1.1p0i, /* #83 */ + 0x3.0p0 + 0x1.1p0i, /* #84 */ + 0x3.0p0 + 0x1.1p0i, /* #85 */ + 0x1.456789p2 - 0x1.789123p1i, /* #86 */ + 0x1.124569p2 - 0x1.781239p3i, /* #87 */ + 0x1.123457p3 - 0x1.789126p4i, /* #88 */ + 0x1.123456p1 + 0x1.891237p4i, /* #89 */ + 0x1.123456p2 + 0x1.357123p3i, /* #90 */ + 0x1.123456p3 - 0x1.789123p1i, /* #91 */ + 0x1.123456p1 - 0x1.789123p4i, /* #92 */ + 0x1.123456p2 + 0x1.789123p1i, /* #93 */ + 0x1.123456p3 + 0x1.789123p0i, /* #94 */ + -0x1.123456p1 - 0x1.789153p-2i, /* #95 */ + -0x1.123456p2 - 0x1.785123p7i, /* #96 */ + -0x1.123456p3 + 0x1.789123p9i, /* #97 */ + 0x1.123456p1 - 0x1.789123p20i, /* #98 */ + 0x1.123456p2 - 0x1.337788p21i, /* #99 */ + 0x1.123457p3 - 0x1.789991p3i /* #100 */ + }; + +__complex FTYPE z[NUMCNT] = + { + 0x1.0p-127 - 0x1.0p-127i, /* #1 */ + 0x1.0p126 + 0x0.0p0i, /* #2 */ + 0x1.0p50 - 0x1.0p-104i, /* #3 */ + 0x1.0p127 + 0x0.0p0i, /* #4 */ + 0x1.0p59 - 0x1.0p-84i, /* #5 */ + 0x1.0p-106 + 0x1.0p26i, /* #6 */ + 0x1.0p86 + 0x0.0p0i, /* #7 */ + 0x1.0p-1 + 0x0.0p0i, /* #8 */ + 0x1.0p-8 - 0x1.0p-8i, /* #9 */ + 0x1.0p12 - 0x1.0p-33i, /* #10 */ + 0x1.0p0 + 0x0.0p0i, /* #11 */ + 0x1.0p0 + 0x0.0p0i, /* #12 */ + 0x1.0p0 + 0x0.0p0i, /* #13 */ + 0x1.0p0 + 0x0.0p0i, /* #14 */ + 0x1.0p0 + 0x0.0p0i, /* #15 */ + -0x1.fffe00p-2 - 0x1.ff9e00p-10i, /* #16 */ + 0x1.000000p0 + 0x0.000000p0i, /* #17 */ + 0x1.000002p0 + 0x1.99999ap-26i, /* #18 */ + 0x1.000002p0 + 0x1.99999ap-25i, /* #19 */ + 0x1.000004p0 + 0x1.99999ap-24i, /* #20 */ + 0x1.00000ap0 + 0x1.99999ap-23i, /* #21 */ + 0x1.000014p0 + 0x1.99999ap-22i, /* #22 */ + 0x1.000026p0 + 0x1.99999ap-21i, /* #23 */ + 0x1.00004cp0 + 0x1.99999ap-20i, /* #24 */ + 0x1.fffff6p-1 - 0x1.99999ap-24i, /* #25 */ + 0x1.ffffecp-1 - 0x1.99999ap-23i, /* #26 */ + 0x1.ffff66p-1 - 0x1.99999ap-20i, /* #27 */ + 0x1.fffeccp-1 - 0x1.99999ap-19i, /* #28 */ + 0x1.666666p0 - 0x1.99999ap-3i, /* #29 */ + 0x0.0p0 + 0x1.0p0i, /* #30 */ + -0x1.47ae14p-25 - 0x1.000000p0i, /* #31 */ + 0x1.000000p0 - 0x1.000000p-42i, /* #32 */ + 0x1.000000p0 - 0x1.000000p-103i, /* #33 */ + 0x1.000000p0 + 0x1.ffffe0p-81i, /* #34 */ + 0x1.000000p0 - 0x1.000000p-60i, /* #35 */ + -0x1.000000p0 + 0x1.000000p-60i, /* #36 */ + 0x1.000000p0 + 0x1.000000p-60i, /* #37 */ + -0x1.0000000p0 - 0x1.000000p-60i, /* #38 */ + 0x1.000000p0 - 0x1.000000p-60i, /* #39 */ + 0x1.000000p0 - 0x1.000008p-99i, /* #40 */ + 0x1.000000p0 - 0x1.41c9b4p-111i, /* #41 */ + 0x1.000000p20 - 0x1.41c9b4p-121i, /* #42 */ + 0x1.41c99ep-98 - 0x1.000000p20i, /* #43 */ + 0x1.41c9b4p-78 - 0x1.000000p30i, /* #44 */ + -0x1.41c9b6p-61 - 0x1.000000p0i, /* #45 */ + 0x1.41c99ep-51 - 0x1.000000p40i, /* #46 */ + 0x1.41c9b4p-51 - 0x1.000000p40i, /* #47 */ + 0x1.41c9b4p-51 - 0x1.000000p40i, /* #48 */ + 0x1.41c9b4p-51 - 0x1.000000p40i, /* #49 */ + 0x1.41c9b4p-51 - 0x1.000000p40i, /* #50 */ + 0x1.41c9b4p-51 - 0x1.000000p40i, /* #51 */ + 0x1.41c9b4p-51 - 0x1.000000p40i, /* #52 */ + 0x1.41c9b4p-56 - 0x1.000000p35i, /* #53 */ + 0x1.41c9b4p-61 - 0x1.000000p30i, /* #54 */ + 0x1.6f0648p114 - 0x1.cd580cp113i, /* #55 */ + 0x1.6f0648p75 - 0x1.cd580cp74i, /* #56 */ + 0x1.000000p40 - 0x1.975300p50i, /* #57 */ + 0x1.38e3d6p92 + 0x1.beed4cp92i, /* #58 */ + 0x1.21f3a0p97 + 0x1.cd57eep97i, /* #59 */ + 0x1.000000p71 + 0x0.000000p0i, /* #60 */ + 0x1.000000p54 - 0x1.000000p-85i, /* #61 */ + 0x1.000000p24 - 0x1.000000p-115i, /* #62 */ + 0x1.000000p104 + 0x1.000000p103i, /* #63 */ + 0x1.000000p14 - 0x1.fffc00p-37i, /* #64 */ + 0x1.000000p101 - 0x1.000000p62i, /* #65 */ + 0x1.000000p99 - 0x1.000000p63i, /* #66 */ + 0x1.000000p99 - 0x1.000000p64i, /* #67 */ + 0x1.000000p96 - 0x1.000000p62i, /* #68 */ + 0x1.000000p102 - 0x1.000000p73i, /* #69 */ + 0x1.000000p102 - 0x1.000000p83i, /* #70 */ + 0x1.ffff80p101 - 0x1.ffff80p92i, /* #71 */ + 0x1.ffff80p101 - 0x1.ffff80p92i, /* #72 */ + 0x1.ffff80p101 - 0x1.ffff80p92i, /* #73 */ + 0x1.16f210p1 - 0x1.f5b3b6p2i, /* #74 */ + 0x1.408cd6p1 - 0x1.6a5c6cp0i, /* #75 */ + 0x1.4b8d92p1 - 0x1.ee653ap2i, /* #76 */ + 0x1.0bc840p1 - 0x1.dacedap2i, /* #77 */ + 0x1.e2a8b6p-1 + 0x1.a68292p-3i, /* #78 */ + 0x1.c3d9dcp-2 + 0x1.779082p-7i, /* #79 */ + 0x1.16bd40p-3 - 0x1.f5bb0cp-2i, /* #80 */ + 0x1.2b9c44p10 - 0x1.9fc934p8i, /* #81 */ + 0x1.3079a2p10 + 0x1.af5700p8i, /* #82 */ + -0x1.3079a2p10 - 0x1.af56f6p8i, /* #83 */ + -0x1.3079a2p10 + 0x1.af56f6p8i, /* #84 */ + 0x1.3079a2p10 - 0x1.af5700p8i, /* #85 */ + 0x1.a2741cp1 - 0x1.5e60a4p1i, /* #86 */ + 0x1.004a64p1 - 0x1.077824p-10i, /* #87 */ + -0x1.8825f4p-1 + 0x1.492fbap-1i, /* #88 */ + 0x1.f64170p-1 - 0x1.0d936ap-2i, /* #89 */ + 0x1.2e6b76p1 + 0x1.4911e4p-3i, /* #90 */ + 0x1.a1cec6p-5 + 0x1.61ced4p1i, /* #91 */ + 0x1.064f7cp0 + 0x1.1551c2p-2i, /* #92 */ + -0x1.344548p0 - 0x1.2aa5dap2i, /* #93 */ + -0x1.06d986p-1 + 0x1.6ad8d8p1i, /* #94 */ + -0x1.6deb5ap2 - 0x1.4028b8p3i, /* #95 */ + 0x1.fbd456p-4 + 0x1.8c3276p-5i, /* #96 */ + -0x1.0106f6p-5 - 0x1.69200cp-7i, /* #97 */ + -0x1.000008p-16 - 0x1.74d230p-18i, /* #98 */ + -0x1.39887ep-17 + 0x1.c89ce0p-19i, /* #99 */ + 0x1.a746a4p0 - 0x1.e72da8p-2i /* #100 */ + }; + + +__complex FTYPE errmax[NUMCNT] = + { + 0x0.000000p0 + 0x0.000000p0i, /* #1 */ + 0x0.000002p126 + 0x0.000002p-126i, /* #2 */ + 0x0.000002p50 + 0x0.000002p-104i, /* #3 */ + 0x0.000002p127 + 0x0.000002p0i, /* #4 */ + 0x0.000002p59 + 0x0.000002p-84i, /* #5 */ + 0x0.000000p-106 + 0x0.000002p26i, /* #6 */ + 0x0.000002p86 + 0x0.000002p0i, /* #7 */ + 0x0.000002p-1 + 0x0.000002p0i, /* #8 */ + 0x0.000002p-8 + 0x0.000002p-8i, /* #9 */ + 0x0.000002p12 + 0x0.000002p-33i, /* #10 */ + 0x0.000002p0 + 0x0.000002p0i, /* #11 */ + 0x0.000002p0 + 0x0.000002p0i, /* #12 */ + 0x0.000002p0 + 0x0.000002p0i, /* #13 */ + 0x0.000002p0 + 0x0.000002p0i, /* #14 */ + 0x0.000002p0 + 0x0.000002p0i, /* #15 */ + 0x0.000002p-2 + 0x0.000002p-10i, /* #16 */ + 0x0.000002p0 + 0x0.000002p0i, /* #17 */ + 0x0.000002p0 + 0x0.000002p-26i, /* #18 */ + 0x0.000002p0 + 0x0.000002p-25i, /* #19 */ + 0x0.000002p0 + 0x0.000002p-24i, /* #20 */ + 0x0.000002p0 + 0x0.000002p-23i, /* #21 */ + 0x0.000002p0 + 0x0.000002p-22i, /* #22 */ + 0x0.000002p0 + 0x0.000002p-21i, /* #23 */ + 0x0.000002p0 + 0x0.000002p-20i, /* #24 */ + 0x0.000002p-1 + 0x0.000002p-24i, /* #25 */ + 0x0.000002p-1 + 0x0.000002p-23i, /* #26 */ + 0x0.000002p-1 + 0x0.000002p-20i, /* #27 */ + 0x0.000002p-1 + 0x0.000002p-19i, /* #28 */ + 0x0.000002p0 + 0x0.000002p-3i, /* #29 */ + 0x0.000002p0 + 0x0.000002p0i, /* #30 */ + 0x0.000002p-25 + 0x0.000002p0i, /* #31 */ + 0x0.000002p0 + 0x0.000002p-42i, /* #32 */ + 0x0.000002p0 + 0x0.000002p-103i, /* #33 */ + 0x0.000002p0 + 0x0.000002p-81i, /* #34 */ + 0x0.000002p0 + 0x0.000002p-60i, /* #35 */ + 0x0.000002p0 + 0x0.000002p-60i, /* #36 */ + 0x0.000002p0 + 0x0.000002p-60i, /* #37 */ + 0x0.000002p0 + 0x0.000002p-60i, /* #38 */ + 0x0.000002p0 + 0x0.000002p-60i, /* #39 */ + 0x0.000002p0 + 0x0.000002p-99i, /* #40 */ + 0x0.000002p0 + 0x0.000002p-111i, /* #41 */ + 0x0.000002p20 + 0x0.000002p-121i, /* #42 */ + 0x0.0042000p-98 + 0x0.000002p20i, /* #43 */ + 0x0.0042000p-78 + 0x0.000002p30i, /* #44 */ + 0x0.004201p-61 + 0x0.000002p0i, /* #45 */ + 0x0.004201p-51 + 0x0.000002p40i, /* #46 */ + 0x0.004201p-51 + 0x0.000002p40i, /* #47 */ + 0x0.004201p-51 + 0x0.000002p40i, /* #48 */ + 0x0.004201p-51 + 0x0.000002p40i, /* #49 */ + 0x0.004201p-51 + 0x0.000002p40i, /* #50 */ + 0x0.004201p-51 + 0x0.000002p40i, /* #51 */ + 0x0.004201p-51 + 0x0.000002p40i, /* #52 */ + 0x0.004201p-56 + 0x0.000002p35i, /* #53 */ + 0x0.004201p-61 + 0x0.000002p30i, /* #54 */ + 0x0.000002p114 + 0x0.000002p113i, /* #55 */ + 0x0.000002p75 + 0x0.000002p74i, /* #56 */ + 0x0.000002p40 + 0x0.000002p50i, /* #57 */ + 0x0.000002p92 + 0x0.000002p92i, /* #58 */ + 0x0.000002p97 + 0x0.000002p97i, /* #59 */ + 0x0.000002p71 + 0x0.000002p0i, /* #60 */ + 0x0.000002p54 + 0x0.000000p-85i, /* #61 */ + 0x0.000002p24 + 0x0.000002p-115i, /* #62 */ + 0x0.000002p104 + 0x0.000002p103i, /* #63 */ + 0x0.000002p14 + 0x0.000002p-37i, /* #64 */ + 0x0.000002p101 + 0x0.000002p62i, /* #65 */ + 0x0.000002p99 + 0x0.000002p63i, /* #66 */ + 0x0.000002p99 + 0x0.000002p64i, /* #67 */ + 0x0.000002p96 + 0x0.000002p62i, /* #68 */ + 0x0.000002p102 + 0x0.000002p73i, /* #69 */ + 0x0.000002p102 + 0x0.000002p83i, /* #70 */ + 0x0.000002p101 + 0x0.000002p92i, /* #71 */ + 0x0.000002p101 + 0x0.000002p92i, /* #72 */ + 0x0.000002p101 + 0x0.000002p92i, /* #73 */ + 0x0.000002p1 + 0x0.000002p2i, /* #74 */ + 0x0.000002p1 + 0x0.000002p0i, /* #75 */ + 0x0.000002p1 + 0x0.000002p2i, /* #76 */ + 0x0.000002p1 + 0x0.000002p2i, /* #77 */ + 0x0.000002p-1 + 0x0.000002p-3i, /* #78 */ + 0x0.000002p-2 + 0x0.00000ap-7i, /* #79 */ + 0x0.000002p-3 + 0x0.000002p-2i, /* #80 */ + 0x0.000002p10 + 0x0.000002p8i, /* #81 */ + 0x0.000002p10 + 0x0.000002p8i, /* #82 */ + 0x0.000002p10 + 0x0.000002p8i, /* #83 */ + 0x0.000002p10 + 0x0.000002p8i, /* #84 */ + 0x0.000002p10 + 0x0.000002p8i, /* #85 */ + 0x0.000002p1 + 0x0.000002p1i, /* #86 */ + 0x0.000002p1 + 0x0.0000c0p-9i, /* #87 */ + 0x0.000002p-1 + 0x0.000002p-1i, /* #88 */ + 0x0.000002p-1 + 0x0.000002p-2i, /* #89 */ + 0x0.000002p1 + 0x0.000004p-3i, /* #90 */ + 0x0.000152p-5 + 0x0.000002p1i, /* #91 */ + 0x0.000002p0 + 0x0.000002p-2i, /* #92 */ + 0x0.000002p0 + 0x0.000002p2i, /* #93 */ + 0x0.000002p-1 + 0x0.000002p1i, /* #94 */ + 0x0.000002p2 + 0x0.000002p3i, /* #95 */ + 0x0.000002p-4 + 0x0.000002p-5i, /* #96 */ + 0x0.000002p-5 + 0x0.000002p-7i, /* #97 */ + 0x0.000002p-16 + 0x0.000002p-18i, /* #98 */ + 0x0.000002p-17 + 0x0.000002p-19i, /* #99 */ + 0x0.000002p0 + 0x0.000004p-2i /* #100 */ + }; + + +int main(int argc, char** argv) +{ + int i; + FTYPE xr, xi, yr, yi, zr, zi, zzr, zzi; + FTYPE er, ei; + __complex FTYPE ans[NUMCNT]; + int errcnt; + + errcnt = 0; + for (i = 0; i < NUMCNT; i++) + { + ans[i] = x[i] / y[i]; + if( z[i] != z[i] ) /* Check for nan/inf case */ + { + zr = __real__ z[i]; + zi = __imag__ z[i]; + zzr = __real__ ans[i]; + zzi = __imag__ ans[i]; + er = __real__ errmax[i]; + ei = __imag__ errmax[i]; + errcnt++; + printf("x %3d " FMT " " FMT "i\n", + i + 1, __real__ x[i], __imag__ x[i]); + printf ("y %3d " FMT " " FMT "i\n", + i + 1, __real__ y[i], __imag__ y[i]); + printf("expected " FMT " " FMT "i\n", + __real__ z[i], __imag__ z[i]); + printf("actual " FMT " " FMT "i /* #%d */ FAIL\n", + __real__ ans[i], __imag__ ans[i], i + 1); + printf("diff " FMT " " FMT "i\n", + zr - zzr, zi - zzi); + printf("errmax " FMT " " FMT "i\n\n", + er, ei); + } + else + { + if( z[i] != ans[i] ) + { + zr = __real__ z[i]; + zi = __imag__ z[i]; + zzr = __real__ ans[i]; + zzi = __imag__ ans[i]; + er = __real__ errmax[i]; + ei = __imag__ errmax[i]; + if( (FABS(zr-zzr) > er) || (FABS(zi-zzi) > ei)) + { /* report if error exceeds error max */ + errcnt++; + printf("x %3d " FMT " " FMT "i\n", + i + 1, __real__ x[i], __imag__ x[i]); + printf ("y %3d " FMT " " FMT "i\n", + i + 1, __real__ y[i], __imag__ y[i]); + printf("expected " FMT " " FMT "i\n", + __real__ z[i], __imag__ z[i]); + printf("actual " FMT " " FMT "i /* #%d */ FAIL\n", + __real__ ans[i], __imag__ ans[i], i + 1); + printf("diff " FMT " " FMT "i\n", + zr - zzr, zi - zzi); + printf("errmax " FMT " " FMT "i\n\n", + er, ei); + } + } + } + } + if( errcnt > 0) + { + printf("%2d Failures\n",errcnt); + abort(); + } + printf("PASS\n"); + return 0; +} + diff --git a/gcc/testsuite/gcc.c-torture/execute/pr59714_64.c b/gcc/testsuite/gcc.c-torture/execute/pr59714_64.c new file mode 100644 index 0000000..0a41174 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr59714_64.c @@ -0,0 +1,506 @@ +#include +#include + +extern void abort (void); +#define FABS(x) ((x) >= 0 ? (x) : -(x)) +#define FTYPE double +#define FMT "%-24.13a" + +/* + Tables of numbers for complex division testing + All values in hex format + z[i] == correctly rounded value of x[i]/y[i]; + */ + +#define NUMCNT 100 + +__complex FTYPE x[NUMCNT] = + { + 0x1.0p0 + 0x1.0p0i, /* #1 */ + 0x1.0p0 + 0x1.0p0i, /* #2 */ + 0x1.0p1023 + 0x1.0p-1023i, /* #3 */ + 0x1.0p1023 + 0x1.0p1023i, /* #4 */ + 0x1.0p1020 + 0x1.0p-844i, /* #5 */ + 0x1.0p-71 + 0x1.0p1021i, /* #6 */ + 0x1.0p-347 + 0x1.0p-54i, /* #7 */ + 0x1.0p-1074 + 0x1.0p-1074i, /* #8 */ + 0x1.0p1015 + 0x1.0p-989i, /* #9 */ + 0x1.0p-622 + 0x1.0p-1071i, /* #10 */ + 0x1.0p0 + 0x3.0p0i, /* #11 */ + -0x1.0p0 + 0x3.0p0i, /* #12 */ + 0x1.0p0 - 0x3.0p0i, /* #13 */ + 0x3.0p0 + 0x1.0p0i, /* #14 */ + 0x3.0p0 + 0x4.0p0i, /* #15 */ + 0x1.0p0 - 0x3.000000001p-20i, /* #16 */ + 0x1.0p0 + 0x3.00000000001p-20i, /* #17 */ + 0x1.0p0 + 0x1.8000000000002p1i, /* #18 */ + 0x1.0p0 + 0x1.8000000000004p1i, /* #19 */ + 0x1.0p0 + 0x1.8000000000008p1i, /* #20 */ + 0x1.0p0 + 0x1.8000000000010p1i, /* #21 */ + 0x1.0p0 + 0x1.8000000000020p1i, /* #22 */ + 0x1.0p0 + 0x1.8000000000040p1i, /* #23 */ + 0x1.0p0 + 0x1.8000000000080p1i, /* #24 */ + 0x1.0p0 + 0x1.7ffffffffff8p1i, /* #25 */ + 0x1.0p0 + 0x1.7ffffffffff0p1i, /* #26 */ + 0x1.0p0 + 0x1.7fffffffff80p1i, /* #27 */ + 0x1.0p0 + 0x1.7fffffffff00p1i, /* #28 */ + 0x5.0p0 + 0x5.0p0i, /* #29 */ + 0x4.0p0 + 0x3.0p0i, /* #30 */ + -0x4.0p0 + 0x3.000000001p0i, /* #31 */ + 0x3.00000000001p-20 + 0x1.0p0i, /* #32 */ + 0x1.00000000001p-80 + 0x1.0p0i, /* #33 */ + 0x1.00000000001p-600 + 0x1.0p0i, /* #34 */ + 0x1.0p0 + 0x1.00000000001p-600i, /* #35 */ + -0x1.0p0 + 0x1.00000000001p-600i, /* #36 */ + -0x1.0p0 + 0x1.00000000001p-600i, /* #37 */ + -0x1.0p0 + 0x1.00000000001p-600i, /* #38 */ + 0x1.0p0 - 0x1.00000000001p-600i, /* #39 */ + 0x1.0p100 - 0x1.00000000001p-600i, /* #40 */ + 0x1.97530p100 - 0x1.00000000001p-600i, /* #41 */ + 0x1.97530p300 - 0x1.00000000001p-600i, /* #42 */ + 0x1.97530p377 - 0x1.00000000001p-600i, /* #43 */ + 0x1.97530p477 - 0x1.00000000001p-500i, /* #44 */ + 0x1.97530p0 - 0x1.00000000001p-900i, /* #45 */ + 0x1.97530p100 - 0x1.00000000001p-800i, /* #46 */ + 0x1.97530p200 - 0x1.00000000001p-700i, /* #47 */ + 0x1.97530p300 - 0x1.00000000001p-600i, /* #48 */ + 0x1.97530p400 - 0x1.00000000001p-500i, /* #49 */ + 0x1.97530p500 - 0x1.00000000001p-400i, /* #50 */ + 0x1.97530p600 - 0x1.00000000001p-300i, /* #51 */ + 0x1.97530p700 - 0x1.00000000001p-200i, /* #52 */ + 0x1.97530p800 - 0x1.00000000001p-100i, /* #53 */ + 0x1.97530p900 - 0x1.00000000001p-0i, /* #54 */ + 0x1.97530p1000 + 0x1.00000000001p200i, /* #55 */ + 0x1.97530p1010 + 0x1.00000000000p300i, /* #56 */ + 0x1.97530p800 + 0x1.00000000000p400i, /* #57 */ + 0x1.97530p700 + 0x1.00000000000p500i, /* #58 */ + 0x1.97530p600 + 0x1.00000000000p600i, /* #59 */ + 0x1.97530p520 + 0x1.00000000000p520i, /* #60 */ + 0x1.0p1020 + 0x1.0p-844i, /* #61 */ + 0x1.0p920 + 0x1.0p-844i, /* #62 */ + 0x1.0p504 + 0x1.0p523i, /* #63 */ + 0x1.0p1004 + 0x1.0p-512i, /* #64 */ + 0x1.0p910 + 0x1.0p-512i, /* #65 */ + 0x1.0p865 + 0x1.0p-512i, /* #66 */ + 0x1.0p864 + 0x1.0p-512i, /* #67 */ + 0x1.0p860 + 0x1.0p-512i, /* #68 */ + 0x1.0p810 + 0x1.0p-512i, /* #69 */ + 0x1.0p710 + 0x1.0p-512i, /* #70 */ + 0x1.0p610 + 0x1.0p-512i, /* #71 */ + 0x1.0p510 + 0x1.0p-512i, /* #72 */ + 0x1.0p410 + 0x1.0p-512i, /* #73 */ + 0x13.0p4 + 0x1.0p-4i, /* #74 */ + 0x13.0p2 + 0x13.0p2i, /* #75 */ + 0x13.0p4 + 0x1.0p4i, /* #76 */ + 0x12.0p4 + 0x12.0p-4i, /* #77 */ + 0x1.0p1 + 0x12.0p1i, /* #78 */ + 0x1.0p2 + 0x1.0p4i, /* #79 */ + 0x13.0p0 + 0x0.0p0i, /* #80 */ + 0x1.01p12 - 0x1.037p-12i, /* #81 */ + -0x1.01p12 - 0x1.037p-12i, /* #82 */ + 0x1.01p12 - 0x1.037p-12i, /* #83 */ + -0x1.01p12 - 0x1.037p-12i, /* #84 */ + 0x1.01p12 - 0x1.037p-12i, /* #85 */ + 0x1.123456p3 - 0x1.789123p4i, /* #86 */ + 0x1.123457p3 - 0x1.789123p4i, /* #87 */ + 0x1.123458p3 + 0x1.789123p4i, /* #88 */ + 0x1.123456p3 + 0x1.789122p4i, /* #89 */ + 0x1.123456p3 + 0x1.789121p4i, /* #90 */ + 0x1.123456p3 + 0x1.789120p4i, /* #91 */ + 0x1.123455p3 - 0x1.789123p4i, /* #92 */ + 0x1.123454p3 - 0x1.789122p4i, /* #93 */ + -0x1.123453p3 + 0x1.789121p4i, /* #94 */ + 0x1.123452p3 + 0x1.789120p4i, /* #95 */ + 0x1.123451p3 - 0x1.789127p4i, /* #96 */ + 0x1.123459p3 - 0x1.789125p4i, /* #97 */ + -0x1.123450p3 + 0x1.789124p4i, /* #98 */ + 0x1.1234561p3 + 0x1.7891231p4i, /* #99 */ + 0x1.1234561p3 - 0x1.7891231p4i /* #100 */ + }; + +__complex FTYPE y[NUMCNT] = + { + 0x1.0p0 + 0x1.0p1023i, /* #1 */ + 0x1.0p-1023 + 0x1.0p-1023i, /* #2 */ + 0x1.0p677 + 0x1.0p-677i, /* #3 */ + 0x1.0p0 + 0x1.0p0i, /* #4 */ + 0x1.0p656 + 0x1.0p-780i, /* #5 */ + 0x1.0p1001 + 0x1.0p-323i, /* #6 */ + 0x1.0p-1037 + 0x1.0p-1058i, /* #7 */ + 0x1.0p-1073 + 0x1.0p-1074i, /* #8 */ + 0x1.0p1023 + 0x1.0p1023i, /* #9 */ + 0x1.0p-343 + 0x1.0p-798i, /* #10 */ + 0x1.0p0 + 0x3.0p0i, /* #11 */ + -0x1.0p0 + 0x3.0p0i, /* #12 */ + 0x1.0p0 - 0x3.0p0i, /* #13 */ + 0x3.0p0 + 0x1.0p0i, /* #14 */ + 0x3.0p0 + 0x4.0p0i, /* #15 */ + -0x2.0p0 + 0x8.0p-10i, /* #16 */ + 0x1.0p0 + 0x3.0p-20i, /* #17 */ + 0x1.0p0 + 0x3.0p0i, /* #18 */ + 0x1.0p0 + 0x3.0p0i, /* #19 */ + 0x1.0p0 + 0x3.0p0i, /* #20 */ + 0x1.0p0 + 0x3.0p0i, /* #21 */ + 0x1.0p0 + 0x3.0p0i, /* #22 */ + 0x1.0p0 + 0x3.0p0i, /* #23 */ + 0x1.0p0 + 0x3.0p0i, /* #24 */ + 0x1.0p0 + 0x3.0p0i, /* #25 */ + 0x1.0p0 + 0x3.0p0i, /* #26 */ + 0x1.0p0 + 0x3.0p0i, /* #27 */ + 0x1.0p0 + 0x3.0p0i, /* #28 */ + 0x3.0p0 + 0x4.0p0i, /* #29 */ + 0x3.0p0 - 0x4.0p0i, /* #30 */ + -0x3.0p0 - 0x4.0p0i, /* #31 */ + 0x3.0p-20 + 0x1.0p0i, /* #32 */ + 0x1.0p-80 + 0x1.0p0i, /* #33 */ + 0x1.0p-80 + 0x1.0p0i, /* #34 */ + 0x1.0p0 + 0x1.0p-600i, /* #35 */ + 0x1.0p0 + 0x1.0p-600i, /* #36 */ + -0x1.0p0 + 0x1.0p-600i, /* #37 */ + 0x1.0p0 - 0x1.0p-600i, /* #38 */ + 0x1.0p0 + 0x1.0p-600i, /* #39 */ + 0x1.0p100 + 0x1.0p-600i, /* #40 */ + 0x1.97530p100 + 0x1.0p-600i, /* #41 */ + 0x1.97530p300 + 0x1.0p-600i, /* #42 */ + 0x1.0p-600 + 0x1.97530p377i, /* #43 */ + 0x1.0p-500 + 0x1.97530p477i, /* #44 */ + 0x1.0p-900 + 0x1.97530p0i, /* #45 */ + 0x1.0p-800 + 0x1.97530p100i, /* #46 */ + 0x1.0p-700 + 0x1.97530p200i, /* #47 */ + 0x1.0p-600 + 0x1.97530p300i, /* #48 */ + 0x1.0p-500 + 0x1.97530p400i, /* #49 */ + 0x1.0p-400 + 0x1.97530p500i, /* #50 */ + 0x1.0p-300 + 0x1.97530p600i, /* #51 */ + 0x1.0p-200 + 0x1.97530p700i, /* #52 */ + 0x1.0p-100 + 0x1.97530p800i, /* #53 */ + 0x1.0p-0 + 0x1.97530p900i, /* #54 */ + 0x1.97530p100 + 0x1.0000p100i, /* #55 */ + 0x1.97530p50 + 0x1.0000p50i, /* #56 */ + 0x1.97530p100 + 0x1.0000p50i, /* #57 */ + 0x1.97530p1 + 0x1.0000p1i, /* #58 */ + 0x1.97530p1 + 0x1.0000p1i, /* #59 */ + 0x1.97530p1 + 0x1.0000p1i, /* #60 */ + 0x1.0p656 + 0x1.0p-730i, /* #61 */ + 0x1.0p656 + 0x1.0p-730i, /* #62 */ + 0x1.0p-500 + 0x1.0p-1000i, /* #63 */ + 0x1.0p0 + 0x1.0p-500i, /* #64 */ + 0x1.0p-110 + 0x1.0p-500i, /* #65 */ + 0x1.0p-155 + 0x1.0p-500i, /* #66 */ + 0x1.0p-156 + 0x1.0p-500i, /* #67 */ + 0x1.0p-160 + 0x1.0p-500i, /* #68 */ + 0x1.0p-210 + 0x1.0p-500i, /* #69 */ + 0x1.0p-310 + 0x1.0p-500i, /* #70 */ + 0x1.0p-410 + 0x1.0p-500i, /* #71 */ + 0x1.0p-510 + 0x1.0p-600i, /* #72 */ + 0x1.0p-610 + 0x1.0p-700i, /* #73 */ + 0x5.0p1 + 0x12.0p1i, /* #74 */ + 0x5.0p1 + 0x12.0p1i, /* #75 */ + 0x5.0p1 + 0x12.0p1i, /* #76 */ + 0x5.0p1 + 0x12.0p1i, /* #77 */ + 0x5.0p1 + 0x12.0p1i, /* #78 */ + 0x5.0p1 + 0x12.0p1i, /* #79 */ + 0x5.0p1 + 0x12.0p1i, /* #80 */ + 0x3.1p0 + 0x1.1p0i, /* #81 */ + -0x3.0p0 + 0x1.1p0i, /* #82 */ + -0x3.0p0 + 0x1.1p0i, /* #83 */ + 0x3.0p0 + 0x1.1p0i, /* #84 */ + 0x3.0p0 + 0x1.1p0i, /* #85 */ + 0x1.456789p2 - 0x1.789123p1i, /* #86 */ + 0x1.124569p2 - 0x1.781239p3i, /* #87 */ + 0x1.123457p3 - 0x1.789126p4i, /* #88 */ + 0x1.123456p1 + 0x1.891237p4i, /* #89 */ + 0x1.123456p2 + 0x1.357123p3i, /* #90 */ + 0x1.123456p3 - 0x1.789123p1i, /* #91 */ + 0x1.123456p1 - 0x1.789123p4i, /* #92 */ + 0x1.123456p2 + 0x1.789123p1i, /* #93 */ + 0x1.123456p3 + 0x1.789123p0i, /* #94 */ + -0x1.123456p1 - 0x1.789153p-2i, /* #95 */ + -0x1.123456p2 - 0x1.785123p7i, /* #96 */ + -0x1.123456p3 + 0x1.789123p9i, /* #97 */ + 0x1.123456p1 - 0x1.789123p20i, /* #98 */ + 0x1.123456p2 - 0x1.337788p21i, /* #99 */ + 0x1.123457p3 - 0x1.789991p3i /* #100 */ + }; + +__complex FTYPE z[NUMCNT] = + { + 0x1.0p-1023 - 0x1.0p-1023i, /* #1 */ + 0x1.0p1023 + 0x0.0p0i, /* #2 */ + 0x1.0p346 - 0x1.0p-1008i, /* #3 */ + 0x1.0p1023 + 0x0.0p0i, /* #4 */ + 0x1.0p364 - 0x1.0p-1072i, /* #5 */ + 0x1.0p-1072 + 0x1.0p20i, /* #6 */ + 3.898125604559113300e289 + 8.174961907852353577e295i, /* #7 */ + 0.6 + 0.2i, /* #8 */ + 0.001953125 - 0.001953125i, /* #9 */ + 1.02951151789360578e-84 + 6.97145987515076231e-220i, /* #10 */ + 0x1.0p0 + 0x0.0p0i, /* #11 */ + 0x1.0p0 + 0x0.0p0i, /* #12 */ + 0x1.0p0 + 0x0.0p0i, /* #13 */ + 0x1.0p0 + 0x0.0p0i, /* #14 */ + 0x1.0p0 + 0x0.0p0i, /* #15 */ + -0x1.fffe0061ff9e0p-2 - 0x1.ff9e0061ff9c0p-10i, /* #16 */ + 0x1.00000000000000p0 + 0x1.ffffffffee000p-65i, /* #17 */ + 0x1.0000000000002p0 + 0x1.999999999999ap-54i, /* #18 */ + 0x1.0000000000003p0 + 0x1.999999999999ap-53i, /* #19 */ + 0x1.0000000000005p0 + 0x1.999999999999ap-52i, /* #20 */ + 0x1.000000000000ap0 + 0x1.999999999999ap-51i, /* #21 */ + 0x1.0000000000013p0 + 0x1.999999999999ap-50i, /* #22 */ + 0x1.0000000000027p0 + 0x1.999999999999ap-49i, /* #23 */ + 0x1.000000000004dp0 + 0x1.999999999999ap-48i, /* #24 */ + 0x1.fffffffffff66p-1 - 0x1.999999999999ap-48i, /* #25 */ + 0x1.ffffffffffecdp-1 - 0x1.999999999999ap-47i, /* #26 */ + 0x1.ffffffffff666p-1 - 0x1.999999999999ap-44i, /* #27 */ + 0x1.fffffffffeccdp-1 - 0x1.999999999999ap-43i, /* #28 */ + 0x1.6666666666667p0 - 0x1.999999999999ap-3i, /* #29 */ + 0x0.0p0 + 0x1.0p0i, /* #30 */ + -0x1.47ae147ae147b00000p-39 - 0x1.0000000001eb8p0i, /* #31 */ + 0x1.00000000000000p0 - 0x1.ffffffffee000p-65i, /* #32 */ + 0x1.00000000000000p0 - 0x1.0000000000000p-124i, /* #33 */ + 0x1.00000000000000p0 + 0x1.0000000000000p-80i, /* #34 */ + 0x1.00000000000000p0 + 0x1.0000000000000p-644i, /* #35 */ + -0x1.00000000000000p0 + 0x1.0000000000080p-599i, /* #36 */ + 0x1.00000000000000p0 - 0x1.0000000000000p-644i, /* #37 */ + -0x1.00000000000000p0 + 0x1.0000000000000p-644i, /* #38 */ + 0x1.00000000000000p0 - 0x1.0000000000080p-599i, /* #39 */ + 0x1.00000000000000p0 - 0x1.0000000000080p-699i, /* #40 */ + 0x1.00000000000000p0 - 0x1.41c9b303bfbf2p-700i, /* #41 */ + 0x1.00000000000000p0 - 0x1.41c9b303bfbf2p-900i, /* #42 */ + -0x1.41c9b303bfb510p-1022 - 0x1.0000000000000p0i, /* #43 */ + -0x1.41c9b303bfb510p-1022 - 0x1.0000000000000p0i, /* #44 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #45 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #46 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #47 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #48 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #49 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #50 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #51 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #52 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #53 */ + -0x1.41c9b303bfb510p-945 - 0x1.0000000000000p0i, /* #54 */ + 0x1.6f0647208a31a0p899 - 0x1.cd580bc4697cap898i, /* #55 */ + 0x1.6f0647208a31a0p959 - 0x1.cd580bc4697cap958i, /* #56 */ + 0x1.00000000000000p700 - 0x1.41c9b303bfb51p649i, /* #57 */ + 0x1.6f0647208a31a0p698 - 0x1.cd580bc4697cap697i, /* #58 */ + 0x1.00000000000000p599 + 0x0.0000000000000p0i, /* #59 */ + 0x1.00000000000000p519 + 0x0.0000000000000p0i, /* #60 */ + 0x1.0p364 - 0x1.0p-1022i, /* #61 */ + 0x1.0p264 + 0x0.0p0i, /* #62 */ + 0x1.0p1004 + 0x1.0p1023i, /* #63 */ + 0x1.0p1004 - 0x1.0p504i, /* #64 */ + 0x1.0p1020 - 0x1.0p630i, /* #65 */ + 0x1.0p1020 - 0x1.0p675i, /* #66 */ + 0x1.0p1020 - 0x1.0p676i, /* #67 */ + 0x1.0p1020 - 0x1.0p680i, /* #68 */ + 0x1.0p1020 - 0x1.0p730i, /* #69 */ + 0x1.0p1020 - 0x1.0p830i, /* #70 */ + 0x1.0p1020 - 0x1.0p930i, /* #71 */ + 0x1.0p1020 - 0x1.0p930i, /* #72 */ + 0x1.0p1020 - 0x1.0p930i, /* #73 */ + 0x1.16f21023358c2p1 - 0x1.f5b3b6a5c6c90p2i, /* #74 */ + 0x1.408cd63069a0ap1 - 0x1.6a5c6c8fc5517p0i, /* #75 */ + 0x1.4b8d91f8aa2d8p1 - 0x1.ee6539f2cbeb7p2i, /* #76 */ + 0x1.0bc8408cd6307p1 - 0x1.daceda971b23fp2i, /* #77 */ + 0x1.e2a8b5e9fe887p-1 + 0x1.a682913ce1ecfp-3i, /* #78 */ + 0x1.c3d9db52e3648p-2 + 0x1.77908119ac60dp-7i, /* #79 */ + 0x1.16bd3fd10defep-3 - 0x1.f5bb0c784c496p-2i, /* #80 */ + 0x1.2b9c43596635bp10 - 0x1.9fc933bd0b3adp8i, /* #81 */ + 0x1.3079a1638e442p10 + 0x1.af56ff5f5ee08p8i, /* #82 */ + -0x1.3079a23d4567cp10 - 0x1.af56f5c477a85p8i, /* #83 */ + -0x1.3079a23d4567cp10 + 0x1.af56f5c477a85p8i, /* #84 */ + 0x1.3079a1638e442p10 - 0x1.af56ff5f5ee08p8i, /* #85 */ + 0x1.a27419691d785p+1 - 0x1.5e60a434afdfep1i, /* #86 */ + 0x1.004a6235052b9p1 - 0x1.077970d2017e9p-10i, /* #87 */ + -0x1.8825f329396f0p-1 + 0x1.492fb9aef1c35p-1i, /* #88 */ + 0x1.f6417093502e6p-1 - 0x1.0d936b36d2386p-2i, /* #89 */ + 0x1.2e6b76d3c1a74p1 + 0x1.4911f033da9e4p-3i, /* #90 */ + 0x1.a1ced84e145e9p-5 + 0x1.61ced4d722d38p1i, /* #91 */ + 0x1.064f7bc3e4834p0 + 0x1.1551c3ae74bd1p-2i, /* #92 */ + -0x1.344545d341aa8p0 - 0x1.2aa5da272dd3dp2i, /* #93 */ + -0x1.06d98474fe895p-1 + 0x1.6ad8d7df1b0c8p1i, /* #94 */ + -0x1.6deb5a7bec317p2 - 0x1.4028b8d0a2fc1p3i, /* #95 */ + 0x1.fbd4560086546p-4 + 0x1.8c3278a9ca9b4p-5i, /* #96 */ + -0x1.0106f72f51798p-5 - 0x1.69200e9aa701dp-7i, /* #97 */ + -0x1.00000929d9956p-16 - 0x1.74d2319d42342p-18i, /* #98 */ + -0x1.39887db89b686p-17 + 0x1.c89cdfee34a14p-19i, /* #99 */ + 0x1.a746a452d3430p0 - 0x1.e72d9f35e28e6p-2i /* #100 */ + }; + + +__complex FTYPE errmax[NUMCNT] = + { + 0x0.0000000000000p0 + 0x0.0000000000000p0i, /* #1 */ + 0x0.0000000000001p1023 + 0x0.0000000000001p0i, /* #2 */ + 0x0.0000000000001p346 + 0x0.0000000000001p-1008i, /* #3 */ + 0x0.0000000000001p1023 + 0x0.0000000000001p0i, /* #4 */ + 0x0.0000000000001p364 + 0x0.0000000000000p0i, /* #5 */ + 0x0.0000000000000p0 + 0x0.0000000000001p20i, /* #6 */ + 0x0.0000000000001p961 + 0x0.0000000000001p982i, /* #7 */ + 0x0.0000000000001p-1 + 0x0.0000000000010p-3i, /* #8 */ + 0x0.0000000000001p-9 + 0x0.0000000000001p-9i, /* #9 */ + 0x0.0000000000001p279 + 0x0.0000000000001p-171i, /* #10 */ + 0x0.0000000000001p0 + 0x0.0000000000001p0i, /* #11 */ + 0x0.0000000000001p0 + 0x0.000000000001p0i, /* #12 */ + 0x0.0000000000001p0 + 0x0.000000000001p0i, /* #13 */ + 0x0.0000000000001p0 + 0x0.000000000001p0i, /* #14 */ + 0x0.0000000000001p0 + 0x0.000000000001p0i, /* #15 */ + 0x1.0000000000001p-2 + 0x0.000000000001p-10i, /* #16 */ + 0x0.0000000000001p0 + 0x0.000000000001p-65i, /* #17 */ + 0x0.0000000000001p0 + 0x0.000000000001p-54i, /* #18 */ + 0x0.0000000000001p0 + 0x0.000000000001p-53i, /* #19 */ + 0x0.0000000000001p0 + 0x0.000000000001p-52i, /* #20 */ + 0x0.0000000000001p0 + 0x0.000000000001p-51i, /* #21 */ + 0x0.0000000000001p0 + 0x0.000000000001p-50i, /* #22 */ + 0x0.0000000000001p0 + 0x0.000000000001p-49i, /* #23 */ + 0x0.0000000000001p0 + 0x0.000000000001p-48i, /* #24 */ + 0x0.0000000000001p-1 + 0x0.000000000001p-48i, /* #25 */ + 0x0.0000000000001p-1 + 0x0.000000000001p-47i, /* #26 */ + 0x0.0000000000001p-1 + 0x0.000000000001p-44i, /* #27 */ + 0x0.0000000000001p-1 + 0x0.000000000001p-43i, /* #28 */ + 0x0.0000000000001p0 + 0x0.000000000001p-3i, /* #29 */ + 0x0.0000000000001p0 + 0x0.000000000001p0i, /* #30 */ + 0x0.0000000000001p-39 + 0x0.000000000001p0i, /* #31 */ + 0x0.0000000000001p0 + 0x0.000000000001p-65i, /* #32 */ + 0x0.0000000000001p0 + 0x0.000000000001p-124i, /* #33 */ + 0x0.0000000000001p0 + 0x0.000000000001p-80i, /* #34 */ + 0x0.0000000000001p0 + 0x0.000000000001p-644i, /* #35 */ + 0x0.0000000000001p0 + 0x0.000000000001p-599i, /* #36 */ + 0x0.0000000000001p0 + 0x0.000000000001p-644i, /* #37 */ + 0x0.0000000000001p0 + 0x0.000000000001p-644i, /* #38 */ + 0x0.0000000000001p0 + 0x0.000000000001p-599i, /* #39 */ + 0x0.0000000000001p0 + 0x0.000000000001p-699i, /* #40 */ + 0x0.0000000000001p0 + 0x0.000000000001p-700i, /* #41 */ + 0x0.0000000000001p0 + 0x0.000000000001p-900i, /* #42 */ + 0x0.0042000000000p-1022 + 0x0.000000000001p0i, /* #43 */ + 0x0.0042000000000p-1022 + 0x0.000000000001p0i, /* #44 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #45 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #46 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #47 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #48 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #49 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #50 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #51 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #52 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #53 */ + 0x0.0042000000001p-945 + 0x0.000000000001p0i, /* #54 */ + 0x0.0000000000001p899 + 0x0.000000000001p898i, /* #55 */ + 0x0.0000000000001p959 + 0x0.000000000001p958i, /* #56 */ + 0x0.0000000000001p700 + 0x0.000000000001p649i, /* #57 */ + 0x0.0000000000001p698 + 0x0.000000000001p697i, /* #58 */ + 0x0.0000000000001p599 + 0x0.000000000001p0i, /* #59 */ + 0x0.0000000000001p519 + 0x0.000000000001p0i, /* #60 */ + 0x0.0000000000001p364 + 0x0.000000000000p0i, /* #61 */ + 0x0.0000000000001p264 + 0x0.000000000001p0i, /* #62 */ + 0x0.0000000000001p1004 + 0x0.000000000001p1023i, /* #63 */ + 0x0.0000000000001p1004 + 0x0.000000000001p504i, /* #64 */ + 0x0.0000000000001p1020 + 0x0.000000000001p630i, /* #65 */ + 0x0.0000000000001p1020 + 0x0.000000000001p675i, /* #66 */ + 0x0.0000000000001p1020 + 0x0.000000000001p676i, /* #67 */ + 0x0.0000000000001p1020 + 0x0.000000000001p680i, /* #68 */ + 0x0.0000000000001p1020 + 0x0.000000000001p730i, /* #69 */ + 0x0.0000000000001p1020 + 0x0.000000000001p830i, /* #70 */ + 0x0.0000000000001p1020 + 0x0.000000000001p930i, /* #71 */ + 0x0.0000000000001p1020 + 0x0.000000000001p930i, /* #72 */ + 0x0.0000000000001p1020 + 0x0.000000000001p930i, /* #73 */ + 0x0.0000000000001p7 + 0x0.000000000001p0i, /* #74 */ + 0x0.0000000000001p1 + 0x0.000000000001p0i, /* #75 */ + 0x0.0000000000001p1 + 0x0.000000000001p2i, /* #76 */ + 0x0.0000000000001p1 + 0x0.000000000001p2i, /* #77 */ + 0x0.0000000000001p-1 + 0x0.000000000001p-3i, /* #78 */ + 0x0.0000000000001p-2 + 0x0.000000000001p-7i, /* #79 */ + 0x0.0000000000001p-3 + 0x0.000000000001p-2i, /* #80 */ + 0x0.0000000000001p10 + 0x0.000000000001p8i, /* #81 */ + 0x0.0000000000001p10 + 0x0.000000000001p8i, /* #82 */ + 0x0.0000000000001p10 + 0x0.000000000001p8i, /* #83 */ + 0x0.0000000000001p10 + 0x0.000000000001p8i, /* #84 */ + 0x0.0000000000001p10 + 0x0.000000000001p8i, /* #85 */ + 0x0.0000000000001p1 + 0x0.000000000001p1i, /* #86 */ + 0x0.0000000000001p1 + 0x0.000000000001p-10i, /* #87 */ + 0x0.0000000000001p-1 + 0x0.000000000001p-1i, /* #88 */ + 0x0.0000000000001p-1 + 0x0.000000000001p-2i, /* #89 */ + 0x0.0000000000001p1 + 0x0.000000000001p-3i, /* #90 */ + 0x0.0000000000005p-5 + 0x0.000000000001p1i, /* #91 */ + 0x0.0000000000001p0 + 0x0.000000000001p-2i, /* #92 */ + 0x0.0000000000001p0 + 0x0.000000000001p2i, /* #93 */ + 0x0.0000000000001p-1 + 0x0.000000000001p1i, /* #94 */ + 0x0.0000000000001p2 + 0x0.000000000001p3i, /* #95 */ + 0x0.0000000000001p-4 + 0x0.000000000001p-5i, /* #96 */ + 0x0.0000000000001p-5 + 0x0.000000000001p-7i, /* #97 */ + 0x0.0000000000001p-16 + 0x0.000000000001p-18i, /* #98 */ + 0x0.0000000000001p-17 + 0x0.000000000001p-19i, /* #99 */ + 0x0.0000000000001p0 + 0x0.000000000001p-2i /* #100 */ + }; + + +int main(int argc, char** argv) +{ + int i; + FTYPE xr, xi, yr, yi, zr, zi, zzr, zzi; + FTYPE er, ei; + __complex FTYPE ans[NUMCNT]; + int errcnt; + + errcnt = 0; + for (i = 0; i < NUMCNT; i++) + { + ans[i] = x[i] / y[i]; + if( z[i] != z[i] ) /* Check for nan/inf case */ + { + zr = __real__ z[i]; + zi = __imag__ z[i]; + zzr = __real__ ans[i]; + zzi = __imag__ ans[i]; + er = __real__ errmax[i]; + ei = __imag__ errmax[i]; + errcnt++; + printf("x %3d " FMT " " FMT "i\n", + i + 1, __real__ x[i], __imag__ x[i]); + printf ("y %3d " FMT " " FMT "i\n", + i + 1, __real__ y[i], __imag__ y[i]); + printf("expected " FMT " " FMT "i\n", + __real__ z[i], __imag__ z[i]); + printf("actual " FMT " " FMT "i /* #%d */ FAIL\n", + __real__ ans[i], __imag__ ans[i], i + 1); + printf("diff " FMT " " FMT "i\n", + zr - zzr, zi - zzi); + printf("errmax " FMT " " FMT "i\n\n", + er, ei); + } + else + { + if( z[i] != ans[i] ) + { + zr = __real__ z[i]; + zi = __imag__ z[i]; + zzr = __real__ ans[i]; + zzi = __imag__ ans[i]; + er = __real__ errmax[i]; + ei = __imag__ errmax[i]; + if( (FABS(zr-zzr) > er) || (FABS(zi-zzi) > ei)) + { /* report if error exceeds error max */ + errcnt++; + printf("x %3d " FMT " " FMT "i\n", + i + 1, __real__ x[i], __imag__ x[i]); + printf ("y %3d " FMT " " FMT "i\n", + i + 1, __real__ y[i], __imag__ y[i]); + printf("expected " FMT " " FMT "i\n", + __real__ z[i], __imag__ z[i]); + printf("actual " FMT " " FMT "i /* #%d */ FAIL\n", + __real__ ans[i], __imag__ ans[i], i + 1); + printf("diff " FMT " " FMT "i\n", + zr - zzr, zi - zzi); + printf("errmax " FMT " " FMT "i\n\n", + er, ei); + } + } + } + } + if( errcnt > 0) + { + printf("%2d Failures\n",errcnt); + abort(); + } + printf("PASS\n"); + return 0; +} + diff --git a/libgcc/config/sparc/sfp-machine.h b/libgcc/config/sparc/sfp-machine.h new file mode 100644 index 0000000..d22b7ed --- /dev/null +++ b/libgcc/config/sparc/sfp-machine.h @@ -0,0 +1,13 @@ +#ifndef SFP_MACHINE_H +#define SFP_MACHINE_H + +#define _FP_W_TYPE_SIZE 64 +#define _FP_W_TYPE unsigned long long +#define _FP_WS_TYPE signed long long +#define _FP_I_TYPE long long + +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 +#define __BYTE_ORDER __BIG_ENDIAN + +#endif diff --git a/libgcc/libgcc2.c b/libgcc/libgcc2.c index 83f865a..99e7bec 100644 --- a/libgcc/libgcc2.c +++ b/libgcc/libgcc2.c @@ -29,6 +29,41 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "tm.h" #include "libgcc_tm.h" +#if defined(L_divsc3) && defined(__LIBGCC_HAS_SF_MODE__) +#include "soft-fp/soft-fp.h" +#include "soft-fp/single.h" +typedef union _FP_UNION_S FP_UTYPE; +#define FP_EXPBIAS _FP_EXPBIAS_S +#endif + +#if defined(L_divdc3) && defined(__LIBGCC_HAS_DF_MODE__) +#include "soft-fp/soft-fp.h" +#include "soft-fp/double.h" +typedef union _FP_UNION_D FP_UTYPE; +#define FP_EXPBIAS _FP_EXPBIAS_D +#endif + +#if defined(L_divhc3) && defined(__LIBGCC_HAS_HF_MODE__) +#include "soft-fp/soft-fp.h" +#include "soft-fp/half.h" +typedef union _FP_UNION_H FP_UTYPE; +#define FP_EXPBIAS _FP_EXPBIAS_H +#endif + +#if defined(L_divxc3) && defined(__LIBGCC_HAS_XF_MODE__) +#include "soft-fp/soft-fp.h" +#include "soft-fp/extended.h" +typedef union _FP_UNION_E FP_UTYPE; +#define FP_EXPBIAS _FP_EXPBIAS_E +#endif + +#if defined(L_divtc3) && defined(__LIBGCC_HAS_TF_MODE__) +#include "soft-fp/soft-fp.h" +#include "soft-fp/quad.h" +typedef union _FP_UNION_Q FP_UTYPE; +#define FP_EXPBIAS _FP_EXPBIAS_Q +#endif + #ifdef HAVE_GAS_HIDDEN #define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) #else @@ -2039,30 +2074,158 @@ CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) #if defined(L_divhc3) || defined(L_divsc3) || defined(L_divdc3) \ || defined(L_divxc3) || defined(L_divtc3) +#if defined(FP_EXPBIAS) +#undef int + +/* Return an exponent of d */ +static inline MTYPE fp_exp(MTYPE d) +{ + FP_UTYPE u; + u.flt = d; + return u.bits.exp - FP_EXPBIAS; +} + +/* Return pow(2.0, n) */ +static inline MTYPE fp_pow2(int n) +{ + FP_UTYPE u, u1; + u.flt = 1.; + if (n > -FP_EXPBIAS) + { + u.bits.exp = n + FP_EXPBIAS; + return u.flt; + } + u.bits.exp = 1; + u1.flt = 1.; + u1.bits.exp = n - 1 + 2 * FP_EXPBIAS; + return u.flt * u1.flt; +} + +static inline int get_cde(int c, int d) +{ + int maxe = c, mine = d; + if (c < d) + { + maxe = d; + mine = c; + } + if (maxe > FP_EXPBIAS / 2) + { + if (mine - maxe > -FP_EXPBIAS) + return maxe; + if (maxe - FP_EXPBIAS / 2 >= mine - maxe + FP_EXPBIAS) + return maxe - FP_EXPBIAS / 2; + return mine - maxe + FP_EXPBIAS; + } + if (-mine > FP_EXPBIAS / 2) + return mine + FP_EXPBIAS <= maxe ? mine + FP_EXPBIAS : maxe; + return 0; +} + +static inline int get_abe(int e1, int e2) +{ + int maxe = e1, mine = e2; + if (e1 < e2) + { + maxe = e2; + mine = e1; + } + if (maxe >= FP_EXPBIAS) + return maxe - FP_EXPBIAS + 1; + if (mine <= -FP_EXPBIAS) + { + if (maxe < 0) + return maxe; + return FP_EXPBIAS - 1 - maxe; + } + return 0; +} +#endif /* FP_EXPBIAS */ + CTYPE CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) { MTYPE denom, ratio, x, y; CTYPE res; - /* ??? We can get better behavior from logarithmic scaling instead of - the division. But that would mean starting to link libgcc against - libm. We could implement something akin to ldexp/frexp as gcc builtins - fairly easily... */ +#if defined(FP_EXPBIAS) + /* By scaling the calculation with powers of 2.0 we can avoid any roundoff + errors. + 1. Convert (a+bi)/(c+di) to ((a+bi)/((c/x)+(d/x)i))*(1.0/x), where + x is any power of 2, such that neither (c/x)**2 nor (d/x)**2 cause + an overflow. Try to avoid underflow in c/x and d/x. + 2) Callculate a real part as + ((a/y)*(c/x)+(b/y)*(d/x)) / ((c/x)**2+(y/x)**2) * (y/x), where + y is any power of 2, such that neither (a/y)*(c/x) nor (b/y)*(d/x) cause + an overflow. Try to avoid underflow in a/y and b/y. + 3) Callculate an imaginary part as + ((b/y)*(c/x)-(a/y)*(d/x)) / ((c/x)**2 + (y/x)**2) * (y/x), where + y is any power of 2, such that neither (b/y)*(c/x) nor (a/y)*(d/x) cause + an overflow. Try to avoid underflow in a/y and b/y. */ + + int ae, be, ce, de, abe, cde; + ae = fp_exp (a); + be = fp_exp (b); + ce = fp_exp (c); + de = fp_exp (d); + cde = get_cde (ce, de); + if (cde != 0) { + ratio = fp_pow2 (-cde); + c *= ratio; + d *= ratio; + ce -= cde; + de -= cde; + } + denom = c * c + d * d; + + // Calculate a real part + abe = get_abe (ae + ce, be + de); + if (abe != 0) + { + MTYPE a1, b1; + ratio = fp_pow2 (-abe); + a1 = a * ratio; + b1 = b * ratio; + x = a1 * c + b1 * d; + } + else + x = a * c + b * d; + x /= denom; + if (abe - cde != 0) + x *= fp_pow2(abe - cde); + + // Calculate an imaginary part + abe = get_abe (be + ce, ae + de); + if (abe != 0) + { + MTYPE a1, b1; + ratio = fp_pow2 (-abe); + a1 = a * ratio; + b1 = b * ratio; + y = b1 * c - a1 * d; + } + else + y = b * c - a * d; + y /= denom; + if (abe - cde != 0) + y *= fp_pow2(abe - cde); + +#else if (FABS (c) < FABS (d)) { ratio = c / d; denom = (c * ratio) + d; x = ((a * ratio) + b) / denom; y = ((b * ratio) - a) / denom; - } - else + } + else { ratio = d / c; denom = (d * ratio) + c; x = ((b * ratio) + a) / denom; y = (b - (a * ratio)) / denom; } +#endif /* Recover infinities and zeros that computed as NaN+iNaN; the only cases are nonzero/zero, infinite/finite, and finite/infinite. */