public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] PR libgcc/59714 complex division is surprising on aarch64
@ 2017-10-25 17:29 vladimir.mezentsev
  2017-10-25 17:29 ` Joseph Myers
  0 siblings, 1 reply; 20+ messages in thread
From: vladimir.mezentsev @ 2017-10-25 17:29 UTC (permalink / raw)
  To: gcc-patches; +Cc: vladimir.mezentsev

From: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>

FMA (floating-point multiply-add) instructions are supported on aarch64.
These instructions can produce different result if two operations executed separately.
-ffp-contract=off doesn't allow the FMA instructions.

Tested on aarch64-unknown-linux-gnu. No regression. Two failed tests now passed.

ChangeLog:
2017-10-25  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR libgcc/59714
* libgcc/Makefile.in: Add -ffp-contract=off
---
 libgcc/Makefile.in | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
index a1a392d..f313556 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -455,6 +455,14 @@ ifeq ($(LIB2_SIDITI_CONV_FUNCS),)
   lib2funcs += $(subst XX,di,$(dwfloatfuncs))
 endif
 
+# Disable FMA (floating-point multiply-add) instructions for complex division.
+# These instructions can produce different result if two operations executed separately.
+LIBGCC2_FFP_CONTRAST_CFLAGS = -ffp-contract=off
+LIB2_DIV3_FUNCS = _divdc3 _divhc3 _divsc3
+lib2-div3-o = $(patsubst %,%$(objext),$(LIB2_DIV3_FUNCS))
+lib2-div3-s-o = $(patsubst %,%_s$(objext),$(LIB2_DIV3_FUNCS))
+$(lib2-div3-o) $(lib2-div3-s-o): LIBGCC2_CFLAGS += $(LIBGCC2_FFP_CONTRAST_CFLAGS)
+
 # These might cause a divide overflow trap and so are compiled with
 # unwinder info.
 LIB2_DIVMOD_FUNCS = _divdi3 _moddi3 _divmoddi4 \
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 20+ messages in thread
* [PATCH]  PR libgcc/59714 complex division is surprising on aarch64
@ 2018-02-06  7:20 vladimir.mezentsev
  2018-02-06 16:53 ` Joseph Myers
  0 siblings, 1 reply; 20+ messages in thread
From: vladimir.mezentsev @ 2018-02-06  7:20 UTC (permalink / raw)
  To: gcc-patches; +Cc: vladimir.mezentsev

From: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>

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

The formula for complex division (a+bi)/(c+di) is (a*c+b*d)/(c*c+d*d) + (b*c-a*d)/(c*c+d*d)i
The current implementation avoids overflow in (c*c + d*d) using
  x=MAX(|c|, |d|);  c1=c/x; d1=d/x;
and then calculating the result as
  (a*c1+b*d1)/(c1*c1+d1*d1)*(1.0/x) + (b*c1-a*d1)/(c1*c1+d1*d1)*(1.0/x)i

This approach has two issues:
  1. Unexpected rounding when x is not a power of 2.0
     For example, (1.0+3.0i) /(1.0+3.0i) should be 1.0
     but it is (1.0 - 1.66533e-17i) on aarch64 (PR59714)
  2. Unexpected underflow in c/x or d/x.
     For example, (0x1.0p+1023 + 0x0.8p-1022 i)/(0x1.0p+677 + 0x1.0p-677 i)
     should be (0x1.0p+346 - 0x1.0p-1008 i) but it is (0x1.0p+346)

My implementation avoids these issues.
I use soft-fp instead built-in functions because performance with built-in
functions (like __builtin_ilogb) is in two times worse.
Also libm is needed for built-in functions.

Restrictions:
  An old implementation is used when an architecture doesn't provide sfp-machine.h
  An old implementation is used for __divkc3 (I have no access on rs6000 for testing)

ChangeLog:
2018-02-05  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR libgcc/59714
* libgcc/libgcc2.c: New complex division implementation
* libgcc/soft-fp/quad.h: struct _FP_STRUCT_LAYOUT was redefined
* libgcc/config/no-sfp-machine.h: Add _NO_SFP_MACHINE_H
* 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/no-sfp-machine.h                    |   3 +
 libgcc/config/sparc/sfp-machine.h                 |  14 +
 libgcc/libgcc2.c                                  | 178 +++++++-
 libgcc/soft-fp/quad.h                             |   2 +-
 7 files changed, 1710 insertions(+), 5 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 <stdio.h>
+#include <math.h>
+
+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 <stdio.h>
+#include <math.h>
+
+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 <stdio.h>
+#include <math.h>
+
+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/no-sfp-machine.h b/libgcc/config/no-sfp-machine.h
index 8f7341d..c164e81 100644
--- a/libgcc/config/no-sfp-machine.h
+++ b/libgcc/config/no-sfp-machine.h
@@ -1 +1,4 @@
 /* Dummy sfp-machine.h header for targets that don't need one.  */
+#ifndef _NO_SFP_MACHINE_H
+#define _NO_SFP_MACHINE_H
+#endif
diff --git a/libgcc/config/sparc/sfp-machine.h b/libgcc/config/sparc/sfp-machine.h
new file mode 100644
index 0000000..8654b47
--- /dev/null
+++ b/libgcc/config/sparc/sfp-machine.h
@@ -0,0 +1,14 @@
+#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 /* _SFP_MACHINE_H */
+
diff --git a/libgcc/libgcc2.c b/libgcc/libgcc2.c
index 83f865a..9c28110 100644
--- a/libgcc/libgcc2.c
+++ b/libgcc/libgcc2.c
@@ -29,6 +29,44 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #include "tm.h"
 #include "libgcc_tm.h"
 
+#if defined(L_divhc3) || defined(L_divsc3) || defined(L_divdc3) \
+    || defined(L_divxc3) || defined(L_divtc3)
+//#include "soft-fp/soft-fp.h"
+#include "sfp-machine.h"
+
+#ifndef _NO_SFP_MACHINE_H  /* soft-fp (IEEE format) is supported */
+#if defined(L_divsc3) && defined(__LIBGCC_HAS_SF_MODE__)
+#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/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/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/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/quad.h"
+typedef union _FP_UNION_Q   FP_UTYPE;
+#define FP_EXPBIAS          _FP_EXPBIAS_Q
+#endif
+#endif /* _NO_SFP_MACHINE_H */
+#endif /* L_divhc3 || L_divsc3 || L_divdc3 || L_divxc3 || L_divtc3 */
+
 #ifdef HAVE_GAS_HIDDEN
 #define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))
 #else
@@ -2039,16 +2077,147 @@ 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
+
+/* Extract 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;
+}
+
+/* Return an exponent N, such that neither (2**(ce-N))**2 nor (2**(de-N))**2
+   cause an overflow. Also try to avoid underflow. */
+static inline int scale_factor_for_c_d(int ce, int de)
+{
+  int maxe = ce, mine = de;
+  if (ce < de)
+    {
+      maxe = de;
+      mine = ce;
+    }
+  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;
+}
+
+/* Return an exponent N, such that neither 2**(e1-N) nor 2**(e2-N) cause
+   an overflow. Also try to avoid underflow. */
+static inline int scale_factor_for_ac_bd_bc_ad(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 = scale_factor_for_c_d (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 = scale_factor_for_ac_bd_bc_ad (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 = scale_factor_for_ac_bd_bc_ad (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;
@@ -2063,6 +2232,7 @@ CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
       x = ((b * ratio) + a) / denom;
       y = (b - (a * ratio)) / denom;
     }
+#endif /* FP_EXPBIAS */
 
   /* Recover infinities and zeros that computed as NaN+iNaN; the only cases
      are nonzero/zero, infinite/finite, and finite/infinite.  */
diff --git a/libgcc/soft-fp/quad.h b/libgcc/soft-fp/quad.h
index a09b95f..d96380c 100644
--- a/libgcc/soft-fp/quad.h
+++ b/libgcc/soft-fp/quad.h
@@ -203,7 +203,7 @@ union _FP_UNION_Q
 union _FP_UNION_Q
 {
   TFtype flt /* __attribute__ ((mode (TF))) */ ;
-  struct _FP_STRUCT_LAYOUT
+  struct _FP_STRUCT_LAYOUT_0
   {
     _FP_W_TYPE a, b;
   } longs;
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 20+ messages in thread
* [PATCH]  PR libgcc/59714 complex division is surprising on aarch64
@ 2018-01-25 20:40 vladimir.mezentsev
  2018-01-26  3:39 ` Joseph Myers
  0 siblings, 1 reply; 20+ messages in thread
From: vladimir.mezentsev @ 2018-01-25 20:40 UTC (permalink / raw)
  To: gcc-patches; +Cc: vladimir.mezentsev

From: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>

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  <vladimir.mezentsev@oracle.com>

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 <stdio.h>
+#include <math.h>
+
+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 <stdio.h>
+#include <math.h>
+
+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 <stdio.h>
+#include <math.h>
+
+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.  */
-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 20+ messages in thread
* Re: [PATCH] PR libgcc/59714 complex division is surprising on aarch64
@ 2017-10-19 13:20 Wilco Dijkstra
  2017-10-19 13:52 ` Richard Earnshaw (lists)
  0 siblings, 1 reply; 20+ messages in thread
From: Wilco Dijkstra @ 2017-10-19 13:20 UTC (permalink / raw)
  To: vladimir.mezentsev; +Cc: GCC Patches, nd

Vladimir wrote:

+# Disable floating-point expression contraction
+LIBGCC2_FFP_CONTRAST_CFLAGS = -ffp-contract=off
+

It looks like this disables fp-contract in all of libgcc...
What is the the number of FMAs in libgcc before/after?

If it disables anything other than the ones in complex division, it
would have an unintended performance impact. It's best to do
this just for complex division.

Wilco

^ permalink raw reply	[flat|nested] 20+ messages in thread
* [PATCH] PR libgcc/59714 complex division is surprising on aarch64
@ 2017-10-18 21:32 vladimir.mezentsev
  0 siblings, 0 replies; 20+ messages in thread
From: vladimir.mezentsev @ 2017-10-18 21:32 UTC (permalink / raw)
  To: gcc-patches; +Cc: vladimir.mezentsev

From: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>

FMA (floating-point multiply-add) instructions are supported on aarch64.
These instructions can produce different result if two operations executed separately.
-ffp-contract=off doesn't allow the FMA instructions.

Tested on two platforms:
  aarch64-unknown-linux-gnu: No regression. Two failed tests now passed.
  sparc64-unknown-linux-gnu: No regression.

ChangeLog:
2017-10-18  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR libgcc/59714
* libgcc/Makefile.in: Add -ffp-contract=off
---
 libgcc/Makefile.in |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
index a1a392d..b771875 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -237,12 +237,16 @@ else
 DECNUMINC =
 endif
 
+# Disable floating-point expression contraction
+LIBGCC2_FFP_CONTRAST_CFLAGS = -ffp-contract=off
+
 # Options to use when compiling libgcc2.a.
 #
 LIBGCC2_DEBUG_CFLAGS = -g
 LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(HOST_LIBGCC2_CFLAGS) \
 		 $(LIBGCC2_DEBUG_CFLAGS) -DIN_LIBGCC2 \
 		 -fbuilding-libgcc -fno-stack-protector \
+		 $(LIBGCC2_FFP_CONTRAST_CFLAGS) \
 		 $(INHIBIT_LIBC_CFLAGS)
 
 # Additional options to use when compiling libgcc2.a.
-- 
1.7.1

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2018-02-07  0:31 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-25 17:29 [PATCH] PR libgcc/59714 complex division is surprising on aarch64 vladimir.mezentsev
2017-10-25 17:29 ` Joseph Myers
2017-10-25 19:19   ` vladimir.mezentsev
2017-10-25 20:04     ` Joseph Myers
  -- strict thread matches above, loose matches on Subject: below --
2018-02-06  7:20 vladimir.mezentsev
2018-02-06 16:53 ` Joseph Myers
2018-02-07  0:25   ` vladimir.mezentsev
2018-02-07  0:31     ` Joseph Myers
2018-01-25 20:40 vladimir.mezentsev
2018-01-26  3:39 ` Joseph Myers
2018-01-29 20:54   ` vladimir.mezentsev
2018-01-29 21:01     ` Joseph Myers
2018-02-06  8:55       ` vladimir.mezentsev
2018-02-06 17:13         ` Joseph Myers
2017-10-19 13:20 Wilco Dijkstra
2017-10-19 13:52 ` Richard Earnshaw (lists)
2017-10-19 17:13   ` Vladimir Mezentsev
2017-10-19 17:24     ` Wilco Dijkstra
2017-10-25  3:26       ` vladimir.mezentsev
2017-10-18 21:32 vladimir.mezentsev

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).