generic-poky/meta/packages/gcc/gcc-4.1.1/ppc-sfp-long-double-gcc411-...

4272 lines
98 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

* config/rs6000/darwin-ldouble.c: Build file for SOFT_FLOAT.
(strong_alias): Define.
(__gcc_qmul): Provide non-FMA for soft-float.
(__gcc_qdiv): Same.
(__gcc_qneg): New.
(__gcc_qeq): New.
(__gcc_qle): New.
(__gcc_qge): New.
(__gcc_qunord): New.
(__gcc_stoq): New.
(__gcc_dtoq): New.
(__gcc_qtos): New.
(__gcc_qtod): New.
(__gcc_qtoi): New.
(__gcc_qtou): New.
(__gcc_itoq): New.
(__gcc_utoq): New.
(fmsub): New.
* config/rs6000/rs6000.c (rs6000_emit_move): Handle TFmode
constant for soft-float.
(rs6000_init_libfuncs): Initialize soft-float functions.
* config/rs6000/libgcc-ppc-glibc.ver: Version soft-float symbols.
* config/rs6000/rs6000.md (movtf): Allow soft-float.
(movtf_softfloat): New.
* config/rs6000/t-ppccomm (TARGET_LIBGCC2_CFLAGS): Add
-mlong-double-128.
(ldblspecs): Remove.
* config/rs6000/sysv4.h (SUBTARGET_OVERRIDE_OPTIONS): Do not warn
about long double soft float.
diff -urN gcc-4.1.1/gcc/config/rs6000/darwin-ldouble.c gcc-4.1.1-patched/gcc/config/rs6000/darwin-ldouble.c
--- gcc-4.1.1/gcc/config/rs6000/darwin-ldouble.c 2006-03-23 16:23:58.000000000 -0600
+++ gcc-4.1.1-patched/gcc/config/rs6000/darwin-ldouble.c 2006-09-12 14:30:16.000000000 -0500
@@ -49,7 +49,8 @@
This code currently assumes big-endian. */
-#if (!defined (__NO_FPRS__) && !defined (__LITTLE_ENDIAN__) \
+#if ((!defined (__NO_FPRS__) || defined (_SOFT_FLOAT)) \
+ && !defined (__LITTLE_ENDIAN__) \
&& (defined (__MACH__) || defined (__powerpc__) || defined (_AIX)))
#define fabs(x) __builtin_fabs(x)
@@ -60,14 +61,19 @@
#define nonfinite(a) unlikely (! isless (fabs (a), inf ()))
+/* Define ALIASNAME as a strong alias for NAME. */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((alias (#name)));
+
/* All these routines actually take two long doubles as parameters,
but GCC currently generates poor code when a union is used to turn
a long double into a pair of doubles. */
-extern long double __gcc_qadd (double, double, double, double);
-extern long double __gcc_qsub (double, double, double, double);
-extern long double __gcc_qmul (double, double, double, double);
-extern long double __gcc_qdiv (double, double, double, double);
+long double __gcc_qadd (double, double, double, double);
+long double __gcc_qsub (double, double, double, double);
+long double __gcc_qmul (double, double, double, double);
+long double __gcc_qdiv (double, double, double, double);
#if defined __ELF__ && defined SHARED \
&& (defined __powerpc64__ || !(defined __linux__ || defined __gnu_hurd__))
@@ -139,6 +145,10 @@
return __gcc_qadd (a, b, -c, -d);
}
+#ifdef _SOFT_FLOAT
+static double fmsub (double, double, double);
+#endif
+
long double
__gcc_qmul (double a, double b, double c, double d)
{
@@ -154,7 +164,11 @@
/* Sum terms of two highest orders. */
/* Use fused multiply-add to get low part of a * c. */
+#ifndef _SOFT_FLOAT
asm ("fmsub %0,%1,%2,%3" : "=f"(tau) : "f"(a), "f"(c), "f"(t));
+#else
+ tau = fmsub (a, c, t);
+#endif
v = a*d;
w = b*c;
tau += v + w; /* Add in other second-order terms. */
@@ -187,7 +201,11 @@
numerically necessary. */
/* Use fused multiply-add to get low part of c * t. */
+#ifndef _SOFT_FLOAT
asm ("fmsub %0,%1,%2,%3" : "=f"(sigma) : "f"(c), "f"(t), "f"(s));
+#else
+ sigma = fmsub (c, t, s);
+#endif
v = a - s;
tau = ((v-sigma)+w)/c; /* Correction to t. */
@@ -201,4 +219,3959 @@
return z.ldval;
}
+#ifdef _SOFT_FLOAT
+
+long double __gcc_qneg (double, double);
+int __gcc_qeq (double, double, double, double);
+int __gcc_qne (double, double, double, double);
+int __gcc_qge (double, double, double, double);
+int __gcc_qle (double, double, double, double);
+int __gcc_qunord (double, double, double, double);
+long double __gcc_stoq (float);
+long double __gcc_dtoq (double);
+float __gcc_qtos (double, double);
+double __gcc_qtod (double, double);
+int __gcc_qtoi (double, double);
+unsigned int __gcc_qtou (double, double);
+long double __gcc_itoq (int);
+long double __gcc_utoq (unsigned int);
+
+extern int __eqdf2 (double, double);
+extern int __ledf2 (double, double);
+extern int __gedf2 (double, double);
+extern int __unorddf2 (double, double);
+
+/* Negate 'long double' value and return the result. */
+long double
+__gcc_qneg (double a, double aa)
+{
+ longDblUnion x;
+
+ x.dval[0] = -a;
+ x.dval[1] = -aa;
+ return x.ldval;
+}
+
+/* Compare two 'long double' values for equality. */
+int
+__gcc_qeq (double a, double aa, double c, double cc)
+{
+ if (__eqdf2 (a, c) == 0)
+ return __eqdf2 (aa, cc);
+ return 1;
+}
+
+strong_alias (__gcc_qeq, __gcc_qne);
+
+/* Compare two 'long double' values for less than or equal. */
+int
+__gcc_qle (double a, double aa, double c, double cc)
+{
+ if (__eqdf2 (a, c) == 0)
+ return __ledf2 (aa, cc);
+ return __ledf2 (a, c);
+}
+
+strong_alias (__gcc_qle, __gcc_qlt);
+
+/* Compare two 'long double' values for greater than or equal. */
+int
+__gcc_qge (double a, double aa, double c, double cc)
+{
+ if (__eqdf2 (a, c) == 0)
+ return __gedf2 (aa, cc);
+ return __gedf2 (a, c);
+}
+
+strong_alias (__gcc_qge, __gcc_qgt);
+
+/* Compare two 'long double' values for unordered. */
+int
+__gcc_qunord (double a, double aa, double c, double cc)
+{
+ if (__eqdf2 (a, c) == 0)
+ return __unorddf2 (aa, cc);
+ return __unorddf2 (a, c);
+}
+
+/* Convert single to long double. */
+long double
+__gcc_stoq (float a)
+{
+ longDblUnion x;
+
+ x.dval[0] = (double) a;
+ x.dval[1] = 0.0;
+
+ return x.ldval;
+}
+
+/* Convert double to long double. */
+long double
+__gcc_dtoq (double a)
+{
+ longDblUnion x;
+
+ x.dval[0] = a;
+ x.dval[1] = 0.0;
+
+ return x.ldval;
+}
+
+/* Convert long double to single. */
+float
+__gcc_qtos (double a, double aa __attribute__ ((__unused__)))
+{
+ return (float) a;
+}
+
+/* Convert long double to double. */
+double
+__gcc_qtod (double a, double aa __attribute__ ((__unused__)))
+{
+ return a;
+}
+
+/* Convert long double to int. */
+int
+__gcc_qtoi (double a, double aa)
+{
+ double z = a + aa;
+ return (int) z;
+}
+
+/* Convert long double to unsigned int. */
+unsigned int
+__gcc_qtou (double a, double aa)
+{
+ double z = a + aa;
+ return (unsigned int) z;
+}
+
+/* Convert int to long double. */
+long double
+__gcc_itoq (int a)
+{
+ return __gcc_dtoq ((double) a);
+}
+
+/* Convert unsigned int to long double. */
+long double
+__gcc_utoq (unsigned int a)
+{
+ return __gcc_dtoq ((double) a);
+}
+
+typedef int QItype __attribute__ ((mode (QI)));
+typedef int SItype __attribute__ ((mode (SI)));
+typedef int DItype __attribute__ ((mode (DI)));
+typedef unsigned int UQItype __attribute__ ((mode (QI)));
+typedef unsigned int USItype __attribute__ ((mode (SI)));
+typedef unsigned int UDItype __attribute__ ((mode (DI)));
+
+typedef unsigned int UHWtype __attribute__ ((mode (HI)));
+extern const UQItype __clz_tab[256];
+extern void abort (void);
+typedef float DFtype __attribute__ ((mode (DF)));
+
+union _FP_UNION_D
+{
+ DFtype flt;
+ struct
+ {
+
+ unsigned sign:1;
+ unsigned exp:11;
+ unsigned frac1:53 - (((unsigned long) 1 << (53 - 1) % 32) != 0) - 32;
+ unsigned frac0:32;
+ } bits __attribute__ ((packed));
+};
+typedef float TFtype __attribute__ ((mode (TF)));
+
+union _FP_UNION_Q
+{
+ TFtype flt;
+ struct
+ {
+
+ unsigned sign:1;
+ unsigned exp:15;
+ unsigned long frac3:113 - (((unsigned long) 1 << (113 - 1) % 32) !=
+ 0) - (32 * 3);
+ unsigned long frac2:32;
+ unsigned long frac1:32;
+ unsigned long frac0:32;
+ } bits __attribute__ ((packed));
+};
+
+static double
+fmsub (double a, double b, double c)
+{
+ int _fex = 0;
+ long A_c __attribute__ ((unused)), A_s, A_e;
+ unsigned long A_f0, A_f1;
+ long B_c __attribute__ ((unused)), B_s, B_e;
+ unsigned long B_f0, B_f1;
+ long C_c __attribute__ ((unused)), C_s, C_e;
+ unsigned long C_f0, C_f1;
+ long X_c __attribute__ ((unused)), X_s, X_e;
+ unsigned long X_f[4];
+ long Y_c __attribute__ ((unused)), Y_s, Y_e;
+ unsigned long Y_f[4];
+ long Z_c __attribute__ ((unused)), Z_s, Z_e;
+ unsigned long Z_f[4];
+ long U_c __attribute__ ((unused)), U_s, U_e;
+ unsigned long U_f[4];
+ long V_c __attribute__ ((unused)), V_s, V_e;
+ unsigned long V_f[4];
+ long R_c __attribute__ ((unused)), R_s, R_e;
+ unsigned long R_f0, R_f1;
+ double r;
+ long double u, v, x, y, z;
+
+/* FP_INIT_ROUNDMODE */
+ do
+ {
+ }
+ while (0);
+
+/* FP_UNPACK_RAW_D (A, a) */
+ do
+ {
+ union _FP_UNION_D _flo;
+ _flo.flt = (a);
+ A_f0 = _flo.bits.frac0;
+ A_f1 = _flo.bits.frac1;
+ A_e = _flo.bits.exp;
+ A_s = _flo.bits.sign;
+ }
+ while (0);
+
+/* FP_UNPACK_RAW_D (B, b) */
+ do
+ {
+ union _FP_UNION_D _flo;
+ _flo.flt = (b);
+ B_f0 = _flo.bits.frac0;
+ B_f1 = _flo.bits.frac1;
+ B_e = _flo.bits.exp;
+ B_s = _flo.bits.sign;
+ }
+ while (0);
+
+/* FP_UNPACK_RAW_D (C, c) */
+ do
+ {
+ union _FP_UNION_D _flo;
+ _flo.flt = (c);
+ C_f0 = _flo.bits.frac0;
+ C_f1 = _flo.bits.frac1;
+ C_e = _flo.bits.exp;
+ C_s = _flo.bits.sign;
+ }
+ while (0);
+
+ /* Extend double to quad. */
+/* FP_EXTEND(Q,D,4,2,X,A) */
+ do
+ {
+ if (113 < 53 || (32767 - 16383 < 2047 - 1023) || 16383 < 1023 + 53 - 1)
+ abort ();
+ X_s = A_s;
+ do
+ {
+ X_f[0] = A_f0;
+ X_f[1] = A_f1;
+ X_f[2] = X_f[3] = 0;
+ }
+ while (0);
+ if ((((A_e + 1) & 2047) > 1))
+ {
+ X_e = A_e + 16383 - 1023;
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((113 - 53)) / 32;
+ _up = ((113 - 53)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ X_f[_i] = X_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ X_f[_i] =
+ X_f[_i - _skip] << _up | X_f[_i - _skip - 1] >> _down;
+ X_f[_i--] = X_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ X_f[_i] = 0;
+ }
+ while (0);
+ }
+ else
+ {
+ if (A_e == 0)
+ {
+ if (((A_f1 | A_f0) == 0))
+ X_e = 0;
+ else
+ {
+ int _lz;
+ _fex |= (0);
+ do
+ {
+ if (A_f1)
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _lz = __builtin_clz (A_f1);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _lz = __builtin_clzl (A_f1);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _lz = __builtin_clzll (A_f1);
+ else
+ abort ();
+ }
+ while (0);
+ else
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _lz = __builtin_clz (A_f0);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _lz = __builtin_clzl (A_f0);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _lz = __builtin_clzll (A_f0);
+ else
+ abort ();
+ }
+ while (0);
+ _lz += 32;
+ }
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (_lz + 113 - (2 * 32)) / 32;
+ _up = (_lz + 113 - (2 * 32)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ X_f[_i] = X_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ X_f[_i] =
+ X_f[_i - _skip] << _up | X_f[_i - _skip -
+ 1] >> _down;
+ X_f[_i--] = X_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ X_f[_i] = 0;
+ }
+ while (0);
+ X_e = (16383 - 1023 + 1 + ((2 * 32) - 53) - _lz);
+ }
+ }
+ else
+ {
+ X_e = 32767;
+ if (!((A_f1 | A_f0) == 0))
+ {
+ if (!((A_f1) & ((unsigned long) 1 << (53 - 2) % 32)))
+ _fex |= (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((113 - 53)) / 32;
+ _up = ((113 - 53)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ X_f[_i] = X_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ X_f[_i] =
+ X_f[_i - _skip] << _up | X_f[_i - _skip -
+ 1] >> _down;
+ X_f[_i--] = X_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ X_f[_i] = 0;
+ }
+ while (0);
+ }
+ }
+ }
+ }
+ while (0);
+
+/* FP_EXTEND(Q,D,4,2,Y,B) */
+ do
+ {
+ if (113 < 53 || (32767 - 16383 < 2047 - 1023) || 16383 < 1023 + 53 - 1)
+ abort ();
+ Y_s = B_s;
+ do
+ {
+ Y_f[0] = B_f0;
+ Y_f[1] = B_f1;
+ Y_f[2] = Y_f[3] = 0;
+ }
+ while (0);
+ if ((((B_e + 1) & 2047) > 1))
+ {
+ Y_e = B_e + 16383 - 1023;
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((113 - 53)) / 32;
+ _up = ((113 - 53)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Y_f[_i] = Y_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Y_f[_i] =
+ Y_f[_i - _skip] << _up | Y_f[_i - _skip - 1] >> _down;
+ Y_f[_i--] = Y_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Y_f[_i] = 0;
+ }
+ while (0);
+ }
+ else
+ {
+ if (B_e == 0)
+ {
+ if (((B_f1 | B_f0) == 0))
+ Y_e = 0;
+ else
+ {
+ int _lz;
+ _fex |= (0);
+ do
+ {
+ if (B_f1)
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _lz = __builtin_clz (B_f1);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _lz = __builtin_clzl (B_f1);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _lz = __builtin_clzll (B_f1);
+ else
+ abort ();
+ }
+ while (0);
+ else
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _lz = __builtin_clz (B_f0);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _lz = __builtin_clzl (B_f0);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _lz = __builtin_clzll (B_f0);
+ else
+ abort ();
+ }
+ while (0);
+ _lz += 32;
+ }
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (_lz + 113 - (2 * 32)) / 32;
+ _up = (_lz + 113 - (2 * 32)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Y_f[_i] = Y_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Y_f[_i] =
+ Y_f[_i - _skip] << _up | Y_f[_i - _skip -
+ 1] >> _down;
+ Y_f[_i--] = Y_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Y_f[_i] = 0;
+ }
+ while (0);
+ Y_e = (16383 - 1023 + 1 + ((2 * 32) - 53) - _lz);
+ }
+ }
+ else
+ {
+ Y_e = 32767;
+ if (!((B_f1 | B_f0) == 0))
+ {
+ if (!((B_f1) & ((unsigned long) 1 << (53 - 2) % 32)))
+ _fex |= (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((113 - 53)) / 32;
+ _up = ((113 - 53)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Y_f[_i] = Y_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Y_f[_i] =
+ Y_f[_i - _skip] << _up | Y_f[_i - _skip -
+ 1] >> _down;
+ Y_f[_i--] = Y_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Y_f[_i] = 0;
+ }
+ while (0);
+ }
+ }
+ }
+ }
+ while (0);
+
+/* FP_EXTEND(Q,D,4,2,Z,C) */
+ do
+ {
+ if (113 < 53 || (32767 - 16383 < 2047 - 1023) || 16383 < 1023 + 53 - 1)
+ abort ();
+ Z_s = C_s;
+ do
+ {
+ Z_f[0] = C_f0;
+ Z_f[1] = C_f1;
+ Z_f[2] = Z_f[3] = 0;
+ }
+ while (0);
+ if ((((C_e + 1) & 2047) > 1))
+ {
+ Z_e = C_e + 16383 - 1023;
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((113 - 53)) / 32;
+ _up = ((113 - 53)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Z_f[_i] = Z_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Z_f[_i] =
+ Z_f[_i - _skip] << _up | Z_f[_i - _skip - 1] >> _down;
+ Z_f[_i--] = Z_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Z_f[_i] = 0;
+ }
+ while (0);
+ }
+ else
+ {
+ if (C_e == 0)
+ {
+ if (((C_f1 | C_f0) == 0))
+ Z_e = 0;
+ else
+ {
+ int _lz;
+ _fex |= (0);
+ do
+ {
+ if (C_f1)
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _lz = __builtin_clz (C_f1);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _lz = __builtin_clzl (C_f1);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _lz = __builtin_clzll (C_f1);
+ else
+ abort ();
+ }
+ while (0);
+ else
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _lz = __builtin_clz (C_f0);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _lz = __builtin_clzl (C_f0);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _lz = __builtin_clzll (C_f0);
+ else
+ abort ();
+ }
+ while (0);
+ _lz += 32;
+ }
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (_lz + 113 - (2 * 32)) / 32;
+ _up = (_lz + 113 - (2 * 32)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Z_f[_i] = Z_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Z_f[_i] =
+ Z_f[_i - _skip] << _up | Z_f[_i - _skip -
+ 1] >> _down;
+ Z_f[_i--] = Z_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Z_f[_i] = 0;
+ }
+ while (0);
+ Z_e = (16383 - 1023 + 1 + ((2 * 32) - 53) - _lz);
+ }
+ }
+ else
+ {
+ Z_e = 32767;
+ if (!((C_f1 | C_f0) == 0))
+ {
+ if (!((C_f1) & ((unsigned long) 1 << (53 - 2) % 32)))
+ _fex |= (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((113 - 53)) / 32;
+ _up = ((113 - 53)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Z_f[_i] = Z_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Z_f[_i] =
+ Z_f[_i - _skip] << _up | Z_f[_i - _skip -
+ 1] >> _down;
+ Z_f[_i--] = Z_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Z_f[_i] = 0;
+ }
+ while (0);
+ }
+ }
+ }
+ }
+ while (0);
+
+/* FP_PACK_RAW_Q(x,X) */
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.bits.frac0 = X_f[0];
+ _flo.bits.frac1 = X_f[1];
+ _flo.bits.frac2 = X_f[2];
+ _flo.bits.frac3 = X_f[3];
+ _flo.bits.exp = X_e;
+ _flo.bits.sign = X_s;
+ (x) = _flo.flt;
+ }
+ while (0);
+
+/* FP_PACK_RAW_Q(y,Y) */
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.bits.frac0 = Y_f[0];
+ _flo.bits.frac1 = Y_f[1];
+ _flo.bits.frac2 = Y_f[2];
+ _flo.bits.frac3 = Y_f[3];
+ _flo.bits.exp = Y_e;
+ _flo.bits.sign = Y_s;
+ (y) = _flo.flt;
+ }
+ while (0);
+
+/* FP_PACK_RAW_Q(z,Z) */
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.bits.frac0 = Z_f[0];
+ _flo.bits.frac1 = Z_f[1];
+ _flo.bits.frac2 = Z_f[2];
+ _flo.bits.frac3 = Z_f[3];
+ _flo.bits.exp = Z_e;
+ _flo.bits.sign = Z_s;
+ (z) = _flo.flt;
+ }
+ while (0);
+
+/* FP_HANDLE_EXCEPTIONS */
+ do
+ {
+ }
+ while (0);
+
+ /* Multiply. */
+/* FP_INIT_ROUNDMODE */
+ do
+ {
+ }
+ while (0);
+
+/* FP_UNPACK_Q(X,x) */
+ do
+ {
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.flt = (x);
+ X_f[0] = _flo.bits.frac0;
+ X_f[1] = _flo.bits.frac1;
+ X_f[2] = _flo.bits.frac2;
+ X_f[3] = _flo.bits.frac3;
+ X_e = _flo.bits.exp;
+ X_s = _flo.bits.sign;
+ }
+ while (0);
+ do
+ {
+ switch (X_e)
+ {
+ default:
+ (X_f[3]) |= ((unsigned long) 1 << (113 - 1) % 32);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ X_f[_i] = X_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ X_f[_i] =
+ X_f[_i - _skip] << _up | X_f[_i - _skip -
+ 1] >> _down;
+ X_f[_i--] = X_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ X_f[_i] = 0;
+ }
+ while (0);
+ X_e -= 16383;
+ X_c = 0;
+ break;
+ case 0:
+ if (((X_f[0] | X_f[1] | X_f[2] | X_f[3]) == 0))
+ X_c = 1;
+ else
+ {
+ long _shift;
+ do
+ {
+ if (X_f[3])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (X_f[3]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (X_f[3]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (X_f[3]);
+ else
+ abort ();
+ }
+ while (0);
+ }
+ else if (X_f[2])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (X_f[2]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (X_f[2]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (X_f[2]);
+ else
+ abort ();
+ }
+ while (0);
+ _shift += 32;
+ }
+ else if (X_f[1])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (X_f[1]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (X_f[1]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (X_f[1]);
+ else
+ abort ();
+ }
+ while (0);
+ _shift += 32 * 2;
+ }
+ else
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (X_f[0]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (X_f[0]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (X_f[0]);
+ else
+ abort ();
+ }
+ while (0);
+ _shift += 32 * 3;
+ }
+ }
+ while (0);
+ _shift -= ((4 * 32) - 113);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((_shift + 3)) / 32;
+ _up = ((_shift + 3)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ X_f[_i] = X_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ X_f[_i] =
+ X_f[_i - _skip] << _up | X_f[_i - _skip -
+ 1] >> _down;
+ X_f[_i--] = X_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ X_f[_i] = 0;
+ }
+ while (0);
+ X_e -= 16383 - 1 + _shift;
+ X_c = 0;
+ _fex |= (0);
+ }
+ break;
+ case 32767:
+ if (((X_f[0] | X_f[1] | X_f[2] | X_f[3]) == 0))
+ X_c = 2;
+ else
+ {
+ X_c = 3;
+ if (!((X_f[3]) & ((unsigned long) 1 << (113 - 2) % 32)))
+ _fex |= (0);
+ } break;
+ }
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_UNPACK_Q(Y,y) */
+ do
+ {
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.flt = (y);
+ Y_f[0] = _flo.bits.frac0;
+ Y_f[1] = _flo.bits.frac1;
+ Y_f[2] = _flo.bits.frac2;
+ Y_f[3] = _flo.bits.frac3;
+ Y_e = _flo.bits.exp;
+ Y_s = _flo.bits.sign;
+ }
+ while (0);
+ do
+ {
+ switch (Y_e)
+ {
+ default:
+ (Y_f[3]) |= ((unsigned long) 1 << (113 - 1) % 32);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Y_f[_i] = Y_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Y_f[_i] =
+ Y_f[_i - _skip] << _up | Y_f[_i - _skip -
+ 1] >> _down;
+ Y_f[_i--] = Y_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Y_f[_i] = 0;
+ }
+ while (0);
+ Y_e -= 16383;
+ Y_c = 0;
+ break;
+ case 0:
+ if (((Y_f[0] | Y_f[1] | Y_f[2] | Y_f[3]) == 0))
+ Y_c = 1;
+ else
+ {
+ long _shift;
+ do
+ {
+ if (Y_f[3])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (Y_f[3]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (Y_f[3]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (Y_f[3]);
+ else
+ abort ();
+ }
+ while (0);
+ }
+ else if (Y_f[2])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (Y_f[2]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (Y_f[2]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (Y_f[2]);
+ else
+ abort ();
+ }
+ while (0);
+ _shift += 32;
+ }
+ else if (Y_f[1])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (Y_f[1]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (Y_f[1]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (Y_f[1]);
+ else
+ abort ();
+ }
+ while (0);
+ _shift += 32 * 2;
+ }
+ else
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ _shift = __builtin_clz (Y_f[0]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ _shift = __builtin_clzl (Y_f[0]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ _shift = __builtin_clzll (Y_f[0]);
+ else
+ abort ();
+ }
+ while (0);
+ _shift += 32 * 3;
+ }
+ }
+ while (0);
+ _shift -= ((4 * 32) - 113);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = ((_shift + 3)) / 32;
+ _up = ((_shift + 3)) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Y_f[_i] = Y_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Y_f[_i] =
+ Y_f[_i - _skip] << _up | Y_f[_i - _skip -
+ 1] >> _down;
+ Y_f[_i--] = Y_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Y_f[_i] = 0;
+ }
+ while (0);
+ Y_e -= 16383 - 1 + _shift;
+ Y_c = 0;
+ _fex |= (0);
+ }
+ break;
+ case 32767:
+ if (((Y_f[0] | Y_f[1] | Y_f[2] | Y_f[3]) == 0))
+ Y_c = 2;
+ else
+ {
+ Y_c = 3;
+ if (!((Y_f[3]) & ((unsigned long) 1 << (113 - 2) % 32)))
+ _fex |= (0);
+ } break;
+ }
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_MUL_Q(U,X,Y) */
+ do
+ {
+ U_s = X_s ^ Y_s;
+ switch ((((X_c) << 2) | (Y_c)))
+ {
+ case (((0) << 2) | (0)):
+ U_c = 0;
+ U_e = X_e + Y_e + 1;
+ do
+ {
+ unsigned long _z_f[8];
+ unsigned long _b_f0, _b_f1;
+ unsigned long _c_f0, _c_f1;
+ unsigned long _d_f0, _d_f1;
+ unsigned long _e_f0, _e_f1;
+ unsigned long _f_f0, _f_f1;
+ do
+ {
+ USItype __m0 = (X_f[0]), __m1 = (Y_f[0]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" ((_z_f[1])):"%r" (X_f[0]),
+ "r" (Y_f
+ [0]));
+ ((_z_f[0])) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[0]), __m1 = (Y_f[1]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[0]),
+ "r" (Y_f
+ [1]));
+ (_b_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[1]), __m1 = (Y_f[0]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_c_f1):"%r" (X_f[1]),
+ "r" (Y_f
+ [0]));
+ (_c_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[1]), __m1 = (Y_f[1]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_d_f1):"%r" (X_f[1]),
+ "r" (Y_f
+ [1]));
+ (_d_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[0]), __m1 = (Y_f[2]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_e_f1):"%r" (X_f[0]),
+ "r" (Y_f
+ [2]));
+ (_e_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[2]), __m1 = (Y_f[0]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_f_f1):"%r" (X_f[2]),
+ "r" (Y_f
+ [0]));
+ (_f_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[1]) = _b_f0 + (_z_f[1]);
+ _c1 = (_z_f[1]) < _b_f0;
+ (_z_f[2]) = _b_f1 + 0;
+ _c2 = (_z_f[2]) < _b_f1;
+ (_z_f[2]) += _c1;
+ _c2 |= (_z_f[2]) < _c1;
+ (_z_f[3]) = 0 + 0 + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[1]) = _c_f0 + (_z_f[1]);
+ _c1 = (_z_f[1]) < _c_f0;
+ (_z_f[2]) = _c_f1 + (_z_f[2]);
+ _c2 = (_z_f[2]) < _c_f1;
+ (_z_f[2]) += _c1;
+ _c2 |= (_z_f[2]) < _c1;
+ (_z_f[3]) = 0 + (_z_f[3]) + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[2]) = _d_f0 + (_z_f[2]);
+ _c1 = (_z_f[2]) < _d_f0;
+ (_z_f[3]) = _d_f1 + (_z_f[3]);
+ _c2 = (_z_f[3]) < _d_f1;
+ (_z_f[3]) += _c1;
+ _c2 |= (_z_f[3]) < _c1;
+ (_z_f[4]) = 0 + 0 + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[2]) = _e_f0 + (_z_f[2]);
+ _c1 = (_z_f[2]) < _e_f0;
+ (_z_f[3]) = _e_f1 + (_z_f[3]);
+ _c2 = (_z_f[3]) < _e_f1;
+ (_z_f[3]) += _c1;
+ _c2 |= (_z_f[3]) < _c1;
+ (_z_f[4]) = 0 + (_z_f[4]) + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[2]) = _f_f0 + (_z_f[2]);
+ _c1 = (_z_f[2]) < _f_f0;
+ (_z_f[3]) = _f_f1 + (_z_f[3]);
+ _c2 = (_z_f[3]) < _f_f1;
+ (_z_f[3]) += _c1;
+ _c2 |= (_z_f[3]) < _c1;
+ (_z_f[4]) = 0 + (_z_f[4]) + _c2;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[0]), __m1 = (Y_f[3]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[0]),
+ "r" (Y_f
+ [3]));
+ (_b_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[3]), __m1 = (Y_f[0]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_c_f1):"%r" (X_f[3]),
+ "r" (Y_f
+ [0]));
+ (_c_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[1]), __m1 = (Y_f[2]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_d_f1):"%r" (X_f[1]),
+ "r" (Y_f
+ [2]));
+ (_d_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[2]), __m1 = (Y_f[1]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_e_f1):"%r" (X_f[2]),
+ "r" (Y_f
+ [1]));
+ (_e_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[3]) = _b_f0 + (_z_f[3]);
+ _c1 = (_z_f[3]) < _b_f0;
+ (_z_f[4]) = _b_f1 + (_z_f[4]);
+ _c2 = (_z_f[4]) < _b_f1;
+ (_z_f[4]) += _c1;
+ _c2 |= (_z_f[4]) < _c1;
+ (_z_f[5]) = 0 + 0 + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[3]) = _c_f0 + (_z_f[3]);
+ _c1 = (_z_f[3]) < _c_f0;
+ (_z_f[4]) = _c_f1 + (_z_f[4]);
+ _c2 = (_z_f[4]) < _c_f1;
+ (_z_f[4]) += _c1;
+ _c2 |= (_z_f[4]) < _c1;
+ (_z_f[5]) = 0 + (_z_f[5]) + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[3]) = _d_f0 + (_z_f[3]);
+ _c1 = (_z_f[3]) < _d_f0;
+ (_z_f[4]) = _d_f1 + (_z_f[4]);
+ _c2 = (_z_f[4]) < _d_f1;
+ (_z_f[4]) += _c1;
+ _c2 |= (_z_f[4]) < _c1;
+ (_z_f[5]) = 0 + (_z_f[5]) + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[3]) = _e_f0 + (_z_f[3]);
+ _c1 = (_z_f[3]) < _e_f0;
+ (_z_f[4]) = _e_f1 + (_z_f[4]);
+ _c2 = (_z_f[4]) < _e_f1;
+ (_z_f[4]) += _c1;
+ _c2 |= (_z_f[4]) < _c1;
+ (_z_f[5]) = 0 + (_z_f[5]) + _c2;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[2]), __m1 = (Y_f[2]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[2]),
+ "r" (Y_f
+ [2]));
+ (_b_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[1]), __m1 = (Y_f[3]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_c_f1):"%r" (X_f[1]),
+ "r" (Y_f
+ [3]));
+ (_c_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[3]), __m1 = (Y_f[1]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_d_f1):"%r" (X_f[3]),
+ "r" (Y_f
+ [1]));
+ (_d_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[2]), __m1 = (Y_f[3]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_e_f1):"%r" (X_f[2]),
+ "r" (Y_f
+ [3]));
+ (_e_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[3]), __m1 = (Y_f[2]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_f_f1):"%r" (X_f[3]),
+ "r" (Y_f
+ [2]));
+ (_f_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[4]) = _b_f0 + (_z_f[4]);
+ _c1 = (_z_f[4]) < _b_f0;
+ (_z_f[5]) = _b_f1 + (_z_f[5]);
+ _c2 = (_z_f[5]) < _b_f1;
+ (_z_f[5]) += _c1;
+ _c2 |= (_z_f[5]) < _c1;
+ (_z_f[6]) = 0 + 0 + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[4]) = _c_f0 + (_z_f[4]);
+ _c1 = (_z_f[4]) < _c_f0;
+ (_z_f[5]) = _c_f1 + (_z_f[5]);
+ _c2 = (_z_f[5]) < _c_f1;
+ (_z_f[5]) += _c1;
+ _c2 |= (_z_f[5]) < _c1;
+ (_z_f[6]) = 0 + (_z_f[6]) + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[4]) = _d_f0 + (_z_f[4]);
+ _c1 = (_z_f[4]) < _d_f0;
+ (_z_f[5]) = _d_f1 + (_z_f[5]);
+ _c2 = (_z_f[5]) < _d_f1;
+ (_z_f[5]) += _c1;
+ _c2 |= (_z_f[5]) < _c1;
+ (_z_f[6]) = 0 + (_z_f[6]) + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[5]) = _e_f0 + (_z_f[5]);
+ _c1 = (_z_f[5]) < _e_f0;
+ (_z_f[6]) = _e_f1 + (_z_f[6]);
+ _c2 = (_z_f[6]) < _e_f1;
+ (_z_f[6]) += _c1;
+ _c2 |= (_z_f[6]) < _c1;
+ (_z_f[7]) = 0 + 0 + _c2;
+ }
+ while (0);
+ do
+ {
+ unsigned long _c1, _c2;
+ (_z_f[5]) = _f_f0 + (_z_f[5]);
+ _c1 = (_z_f[5]) < _f_f0;
+ (_z_f[6]) = _f_f1 + (_z_f[6]);
+ _c2 = (_z_f[6]) < _f_f1;
+ (_z_f[6]) += _c1;
+ _c2 |= (_z_f[6]) < _c1;
+ (_z_f[7]) = 0 + (_z_f[7]) + _c2;
+ }
+ while (0);
+ do
+ {
+ USItype __m0 = (X_f[3]), __m1 = (Y_f[3]);
+ __asm__ ("mulhwu %0,%1,%2": "=r" (_b_f1):"%r" (X_f[3]),
+ "r" (Y_f
+ [3]));
+ (_b_f0) = __m0 * __m1;
+ }
+ while (0);
+ do
+ {
+ if (__builtin_constant_p ((_z_f[7])) && ((_z_f[7])) == 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" ((_z_f[7])), "=&r" ((_z_f[6])):"r" (_b_f1), "%r" (_b_f0),
+ "rI" ((_z_f
+ [6])));
+ else if (__builtin_constant_p ((_z_f[7]))
+ && ((_z_f[7])) == ~(USItype) 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" ((_z_f[7])), "=&r" ((_z_f[6])):"r" (_b_f1), "%r" (_b_f0),
+ "rI" ((_z_f
+ [6])));
+ else
+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" ((_z_f[7])), "=&r" ((_z_f[6])):"%r" (_b_f1), "r" ((_z_f[7])), "%r" (_b_f0),
+ "rI" ((_z_f
+ [6])));
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = ((3 + 113) - 1) / 32;
+ _down = ((3 + 113) - 1) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= _z_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 7 - _skip; ++_i)
+ _z_f[_i] = _z_f[_i + _skip];
+ else
+ {
+ _s |= _z_f[_i] << _up;
+ for (_i = 0; _i < 7 - _skip; ++_i)
+ _z_f[_i] =
+ _z_f[_i + _skip] >> _down | _z_f[_i + _skip +
+ 1] << _up;
+ _z_f[_i++] = _z_f[7] >> _down;
+ }
+ for (; _i < 8; ++_i)
+ _z_f[_i] = 0;
+ _z_f[0] |= (_s != 0);
+ }
+ while (0);
+ (U_f[3] = (_z_f[3]), U_f[2] = (_z_f[2]), U_f[1] =
+ (_z_f[1]), U_f[0] = (_z_f[0]));
+ }
+ while (0);
+ if (((U_f[3]) & ((unsigned long) 1 << ((3 + 113) % 32))))
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (1) / 32;
+ _down = (1) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= U_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ _s |= U_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ U_f[_i] =
+ U_f[_i + _skip] >> _down | U_f[_i + _skip +
+ 1] << _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ U_f[0] |= _sticky;
+ }
+ while (0);
+ else
+ U_e--;
+ break;
+ case (((3) << 2) | (3)):
+ do
+ {
+ if (((X_f[3]) & ((unsigned long) 1 << (113 - 2) % 32))
+ && !((Y_f[3]) & ((unsigned long) 1 << (113 - 2) % 32)))
+ {
+ U_s = Y_s;
+ (U_f[0] = Y_f[0], U_f[1] = Y_f[1], U_f[2] = Y_f[2], U_f[3] =
+ Y_f[3]);
+ }
+ else
+ {
+ U_s = X_s;
+ (U_f[0] = X_f[0], U_f[1] = X_f[1], U_f[2] = X_f[2], U_f[3] =
+ X_f[3]);
+ }
+ U_c = 3;
+ }
+ while (0);
+ break;
+ case (((3) << 2) | (0)):
+ case (((3) << 2) | (2)):
+ case (((3) << 2) | (1)):
+ U_s = X_s;
+ case (((2) << 2) | (2)):
+ case (((2) << 2) | (0)):
+ case (((1) << 2) | (0)):
+ case (((1) << 2) | (1)):
+ (U_f[0] = X_f[0], U_f[1] = X_f[1], U_f[2] = X_f[2], U_f[3] =
+ X_f[3]);
+ U_c = X_c;
+ break;
+ case (((0) << 2) | (3)):
+ case (((2) << 2) | (3)):
+ case (((1) << 2) | (3)):
+ U_s = Y_s;
+ case (((0) << 2) | (2)):
+ case (((0) << 2) | (1)):
+ (U_f[0] = Y_f[0], U_f[1] = Y_f[1], U_f[2] = Y_f[2], U_f[3] =
+ Y_f[3]);
+ U_c = Y_c;
+ break;
+ case (((2) << 2) | (1)):
+ case (((1) << 2) | (2)):
+ U_s = 0;
+ U_c = 3;
+ (U_f[3] =
+ ((((unsigned long) 1 << (113 - 2) % 32) << 1) - 1), U_f[2] =
+ -1, U_f[1] = -1, U_f[0] = -1);
+ _fex |= (0);
+ break;
+ default:
+ abort ();
+ }
+ }
+ while (0);
+
+/* FP_PACK_Q(u,U) */
+ do
+ {
+ do
+ {
+ switch (U_c)
+ {
+ case 0:
+ U_e += 16383;
+ if (U_e > 0)
+ {
+ do
+ {
+ if ((U_f[0]) & 7)
+ _fex |= (0);
+ switch (0)
+ {
+ case 0:
+ do
+ {
+ if (((U_f[0]) & 15) != ((unsigned long) 1 << 2))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 2)) <
+ ((unsigned long) 1 << 2));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 1:
+ (void) 0;
+ break;
+ case 2:
+ do
+ {
+ if (!U_s && ((U_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 3:
+ do
+ {
+ if (U_s && ((U_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ }
+ }
+ while (0);
+ if (((U_f[3]) & ((unsigned long) 1 << ((3 + 113) % 32))))
+ {
+ ((U_f[3]) &= ~((unsigned long) 1 << ((3 + 113) % 32)));
+ U_e++;
+ }
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _down = (3) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ U_f[_i] =
+ U_f[_i + _skip] >> _down | U_f[_i + _skip +
+ 1] << _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ }
+ while (0);
+ if (U_e >= 32767)
+ {
+ switch (0)
+ {
+ case 0:
+ U_c = 2;
+ break;
+ case 2:
+ if (!U_s)
+ U_c = 2;
+ break;
+ case 3:
+ if (U_s)
+ U_c = 2;
+ break;
+ }
+ if (U_c == 2)
+ {
+ U_e = 32767;
+ (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0);
+ }
+ else
+ {
+ U_e = 32767 - 1;
+ (U_f[3] = (~(signed long) 0), U_f[2] =
+ (~(signed long) 0), U_f[1] =
+ (~(signed long) 0), U_f[0] = (~(signed long) 0));
+ } _fex |= (0);
+ _fex |= (0);
+ }
+ }
+ else
+ {
+ U_e = -U_e + 1;
+ if (U_e <= (3 + 113))
+ {
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (U_e) / 32;
+ _down = (U_e) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= U_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ _s |= U_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ U_f[_i] =
+ U_f[_i + _skip] >> _down | U_f[_i +
+ _skip +
+ 1] <<
+ _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ U_f[0] |= _sticky;
+ }
+ while (0);
+ do
+ {
+ if ((U_f[0]) & 7)
+ _fex |= (0);
+ switch (0)
+ {
+ case 0:
+ do
+ {
+ if (((U_f[0]) & 15) !=
+ ((unsigned long) 1 << 2))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 2)) <
+ ((unsigned long) 1 << 2));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 1:
+ (void) 0;
+ break;
+ case 2:
+ do
+ {
+ if (!U_s && ((U_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 3:
+ do
+ {
+ if (U_s && ((U_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ }
+ }
+ while (0);
+ if ((U_f[3]) &
+ (((unsigned long) 1 << ((3 + 113) % 32)) >> 1))
+ {
+ U_e = 1;
+ (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0);
+ }
+ else
+ {
+ U_e = 0;
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _down = (3) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ U_f[_i] =
+ U_f[_i + _skip] >> _down | U_f[_i +
+ _skip +
+ 1] <<
+ _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ }
+ while (0);
+ _fex |= (0);
+ }
+ }
+ else
+ {
+ U_e = 0;
+ if (!((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ {
+ (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 1);
+ do
+ {
+ if ((U_f[0]) & 7)
+ _fex |= (0);
+ switch (0)
+ {
+ case 0:
+ do
+ {
+ if (((U_f[0]) & 15) !=
+ ((unsigned long) 1 << 2))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 2)) <
+ ((unsigned long) 1 << 2));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 1:
+ (void) 0;
+ break;
+ case 2:
+ do
+ {
+ if (!U_s && ((U_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 3:
+ do
+ {
+ if (U_s && ((U_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((U_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ U_f[1] += _t;
+ _t = (U_f[1] < _t);
+ U_f[2] += _t;
+ _t = (U_f[2] < _t);
+ U_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ }
+ }
+ while (0);
+ (U_f[0]) >>= (3);
+ }
+ _fex |= (0);
+ }
+ }
+ break;
+ case 1:
+ U_e = 0;
+ (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0);
+ break;
+ case 2:
+ U_e = 32767;
+ (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 0);
+ break;
+ case 3:
+ U_e = 32767;
+ if (!1)
+ {
+ (U_f[3] =
+ ((((unsigned long) 1 << (113 - 2) % 32) << 1) - 1),
+ U_f[2] = -1, U_f[1] = -1, U_f[0] = -1);
+ U_s = 0;
+ }
+ else
+ (U_f[3]) |= ((unsigned long) 1 << (113 - 2) % 32);
+ break;
+ }
+ }
+ while (0);
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.bits.frac0 = U_f[0];
+ _flo.bits.frac1 = U_f[1];
+ _flo.bits.frac2 = U_f[2];
+ _flo.bits.frac3 = U_f[3];
+ _flo.bits.exp = U_e;
+ _flo.bits.sign = U_s;
+ (u) = _flo.flt;
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_HANDLE_EXCEPTIONS */
+ do
+ {
+ }
+ while (0);
+
+ /* Subtract. */
+/* FP_INIT_ROUNDMODE */
+ do
+ {
+ }
+ while (0);
+
+/* FP_UNPACK_SEMIRAW_Q(U,u) */
+ do
+ {
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.flt = (u);
+ U_f[0] = _flo.bits.frac0;
+ U_f[1] = _flo.bits.frac1;
+ U_f[2] = _flo.bits.frac2;
+ U_f[3] = _flo.bits.frac3;
+ U_e = _flo.bits.exp;
+ U_s = _flo.bits.sign;
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ U_f[_i] = U_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ U_f[_i] =
+ U_f[_i - _skip] << _up | U_f[_i - _skip - 1] >> _down;
+ U_f[_i--] = U_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ U_f[_i] = 0;
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_UNPACK_SEMIRAW_Q(Z,z) */
+ do
+ {
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.flt = (z);
+ Z_f[0] = _flo.bits.frac0;
+ Z_f[1] = _flo.bits.frac1;
+ Z_f[2] = _flo.bits.frac2;
+ Z_f[3] = _flo.bits.frac3;
+ Z_e = _flo.bits.exp;
+ Z_s = _flo.bits.sign;
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ Z_f[_i] = Z_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ Z_f[_i] =
+ Z_f[_i - _skip] << _up | Z_f[_i - _skip - 1] >> _down;
+ Z_f[_i--] = Z_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ Z_f[_i] = 0;
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_SUB_Q(V,U,Z) */
+ do
+ {
+ if (!(Z_e == 32767 && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)))
+ Z_s ^= 1;
+ do
+ {
+ if (U_s == Z_s)
+ {
+ V_s = U_s;
+ int ediff = U_e - Z_e;
+ if (ediff > 0)
+ {
+ V_e = U_e;
+ if (Z_e == 0)
+ {
+ if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) ==
+ 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ goto add_done;
+ }
+ else
+ {
+ _fex |= (0);
+ ediff--;
+ if (ediff == 0)
+ {
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] + Z_f[0];
+ _c1 = V_f[0] < U_f[0];
+ V_f[1] = U_f[1] + Z_f[1];
+ _c2 = V_f[1] < U_f[1];
+ V_f[1] += _c1;
+ _c2 |= V_f[1] < _c1;
+ V_f[2] = U_f[2] + Z_f[2];
+ _c3 = V_f[2] < U_f[2];
+ V_f[2] += _c2;
+ _c3 |= V_f[2] < _c2;
+ V_f[3] = U_f[3] + Z_f[3] + _c3;
+ }
+ while (0);
+ goto add3;
+ }
+ if (U_e == 32767)
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3])
+ == 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3)
+ % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ goto add_done;
+ }
+ goto add1;
+ }
+ }
+ else if (U_e == 32767)
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ goto add_done;
+ }
+ (Z_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32);
+ add1:if (ediff <= (3 + 113))
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (ediff) / 32;
+ _down = (ediff) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= Z_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ Z_f[_i] = Z_f[_i + _skip];
+ else
+ {
+ _s |= Z_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ Z_f[_i] =
+ Z_f[_i + _skip] >> _down | Z_f[_i +
+ _skip +
+ 1] << _up;
+ Z_f[_i++] = Z_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ Z_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ Z_f[0] |= _sticky;
+ }
+ while (0);
+ else if (!((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ (Z_f[3] = 0, Z_f[2] = 0, Z_f[1] = 0, Z_f[0] = 1);
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] + Z_f[0];
+ _c1 = V_f[0] < U_f[0];
+ V_f[1] = U_f[1] + Z_f[1];
+ _c2 = V_f[1] < U_f[1];
+ V_f[1] += _c1;
+ _c2 |= V_f[1] < _c1;
+ V_f[2] = U_f[2] + Z_f[2];
+ _c3 = V_f[2] < U_f[2];
+ V_f[2] += _c2;
+ _c3 |= V_f[2] < _c2;
+ V_f[3] = U_f[3] + Z_f[3] + _c3;
+ }
+ while (0);
+ }
+ else if (ediff < 0)
+ {
+ ediff = -ediff;
+ V_e = Z_e;
+ if (U_e == 0)
+ {
+ if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ {
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) ==
+ 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ goto add_done;
+ }
+ else
+ {
+ _fex |= (0);
+ ediff--;
+ if (ediff == 0)
+ {
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = Z_f[0] + U_f[0];
+ _c1 = V_f[0] < Z_f[0];
+ V_f[1] = Z_f[1] + U_f[1];
+ _c2 = V_f[1] < Z_f[1];
+ V_f[1] += _c1;
+ _c2 |= V_f[1] < _c1;
+ V_f[2] = Z_f[2] + U_f[2];
+ _c3 = V_f[2] < Z_f[2];
+ V_f[2] += _c2;
+ _c3 |= V_f[2] < _c2;
+ V_f[3] = Z_f[3] + U_f[3] + _c3;
+ }
+ while (0);
+ goto add3;
+ }
+ if (Z_e == 32767)
+ {
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3])
+ == 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3)
+ % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ goto add_done;
+ }
+ goto add2;
+ }
+ }
+ else if (Z_e == 32767)
+ {
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ goto add_done;
+ }
+ (U_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32);
+ add2:if (ediff <= (3 + 113))
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (ediff) / 32;
+ _down = (ediff) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= U_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ _s |= U_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ U_f[_i] =
+ U_f[_i + _skip] >> _down | U_f[_i +
+ _skip +
+ 1] << _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ U_f[0] |= _sticky;
+ }
+ while (0);
+ else if (!((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 1);
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = Z_f[0] + U_f[0];
+ _c1 = V_f[0] < Z_f[0];
+ V_f[1] = Z_f[1] + U_f[1];
+ _c2 = V_f[1] < Z_f[1];
+ V_f[1] += _c1;
+ _c2 |= V_f[1] < _c1;
+ V_f[2] = Z_f[2] + U_f[2];
+ _c3 = V_f[2] < Z_f[2];
+ V_f[2] += _c2;
+ _c3 |= V_f[2] < _c2;
+ V_f[3] = Z_f[3] + U_f[3] + _c3;
+ }
+ while (0);
+ }
+ else
+ {
+ if (!(((U_e + 1) & 32767) > 1))
+ {
+ if (U_e == 0)
+ {
+ V_e = 0;
+ if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ {
+ if (!((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ _fex |= (0);
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ goto add_done;
+ }
+ else if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ {
+ _fex |= (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ goto add_done;
+ }
+ else
+ {
+ _fex |= (0);
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] + Z_f[0];
+ _c1 = V_f[0] < U_f[0];
+ V_f[1] = U_f[1] + Z_f[1];
+ _c2 = V_f[1] < U_f[1];
+ V_f[1] += _c1;
+ _c2 |= V_f[1] < _c1;
+ V_f[2] = U_f[2] + Z_f[2];
+ _c3 = V_f[2] < U_f[2];
+ V_f[2] += _c2;
+ _c3 |= V_f[2] < _c2;
+ V_f[3] = U_f[3] + Z_f[3] + _c3;
+ }
+ while (0);
+ if ((V_f[3]) &
+ ((unsigned long) 1 << (113 - 1 + 3) % 32))
+ {
+ (V_f[3]) &=
+ ~(unsigned long) ((unsigned long) 1 <<
+ (113 - 1 + 3) % 32);
+ V_e = 1;
+ }
+ goto add_done;
+ }
+ }
+ else
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) ==
+ 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) ==
+ 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ V_e = 32767;
+ if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ else if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ else
+ do
+ {
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _down = (3) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ U_f[_i] =
+ U_f[_i +
+ _skip] >> _down | U_f[_i +
+ _skip +
+ 1] <<
+ _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _down = (3) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ Z_f[_i] = Z_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ Z_f[_i] =
+ Z_f[_i +
+ _skip] >> _down | Z_f[_i +
+ _skip +
+ 1] <<
+ _up;
+ Z_f[_i++] = Z_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ Z_f[_i] = 0;
+ }
+ while (0);
+ do
+ {
+ if (((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2) %
+ 32))
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2) %
+ 32)))
+ {
+ V_s = Z_s;
+ (V_f[0] = Z_f[0], V_f[1] =
+ Z_f[1], V_f[2] = Z_f[2], V_f[3] =
+ Z_f[3]);
+ }
+ else
+ {
+ V_s = U_s;
+ (V_f[0] = U_f[0], V_f[1] =
+ U_f[1], V_f[2] = U_f[2], V_f[3] =
+ U_f[3]);
+ }
+ V_c = 3;
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ V_f[_i] = V_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ V_f[_i] =
+ V_f[_i - _skip] << _up | V_f[_i -
+ _skip
+ -
+ 1] >>
+ _down;
+ V_f[_i--] = V_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ V_f[_i] = 0;
+ }
+ while (0);
+ }
+ while (0);
+ goto add_done;
+ }
+ }
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] + Z_f[0];
+ _c1 = V_f[0] < U_f[0];
+ V_f[1] = U_f[1] + Z_f[1];
+ _c2 = V_f[1] < U_f[1];
+ V_f[1] += _c1;
+ _c2 |= V_f[1] < _c1;
+ V_f[2] = U_f[2] + Z_f[2];
+ _c3 = V_f[2] < U_f[2];
+ V_f[2] += _c2;
+ _c3 |= V_f[2] < _c2;
+ V_f[3] = U_f[3] + Z_f[3] + _c3;
+ }
+ while (0);
+ V_e = U_e + 1;
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (1) / 32;
+ _down = (1) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= V_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ V_f[_i] = V_f[_i + _skip];
+ else
+ {
+ _s |= V_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ V_f[_i] =
+ V_f[_i + _skip] >> _down | V_f[_i + _skip +
+ 1] << _up;
+ V_f[_i++] = V_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ V_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ V_f[0] |= _sticky;
+ }
+ while (0);
+ if (V_e == 32767)
+ do
+ {
+ if (0 == 0 || (0 == 2 && !V_s) || (0 == 3 && V_s))
+ {
+ V_e = 32767;
+ (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0);
+ }
+ else
+ {
+ V_e = 32767 - 1;
+ _fex |= (0);
+ _fex |= (0);
+ (V_f[3] = (~(signed long) 0), V_f[2] =
+ (~(signed long) 0), V_f[1] =
+ (~(signed long) 0), V_f[0] = (~(signed long) 0));
+ }
+ }
+ while (0);
+ goto add_done;
+ }
+ add3:if ((V_f[3]) &
+ ((unsigned long) 1 << (113 - 1 + 3) % 32))
+ {
+ (V_f[3]) &=
+ ~(unsigned long) ((unsigned long) 1 << (113 - 1 + 3) %
+ 32);
+ V_e++;
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (1) / 32;
+ _down = (1) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= V_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ V_f[_i] = V_f[_i + _skip];
+ else
+ {
+ _s |= V_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ V_f[_i] =
+ V_f[_i + _skip] >> _down | V_f[_i + _skip +
+ 1] << _up;
+ V_f[_i++] = V_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ V_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ V_f[0] |= _sticky;
+ }
+ while (0);
+ if (V_e == 32767)
+ do
+ {
+ if (0 == 0 || (0 == 2 && !V_s) || (0 == 3 && V_s))
+ {
+ V_e = 32767;
+ (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0);
+ }
+ else
+ {
+ V_e = 32767 - 1;
+ _fex |= (0);
+ _fex |= (0);
+ (V_f[3] = (~(signed long) 0), V_f[2] =
+ (~(signed long) 0), V_f[1] =
+ (~(signed long) 0), V_f[0] = (~(signed long) 0));
+ }
+ }
+ while (0);
+ }
+ add_done:;
+ }
+ else
+ {
+ int ediff = U_e - Z_e;
+ if (ediff > 0)
+ {
+ V_e = U_e;
+ V_s = U_s;
+ if (Z_e == 0)
+ {
+ if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) ==
+ 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ goto sub_done;
+ }
+ else
+ {
+ _fex |= (0);
+ ediff--;
+ if (ediff == 0)
+ {
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] - Z_f[0];
+ _c1 = V_f[0] > U_f[0];
+ V_f[1] = U_f[1] - Z_f[1];
+ _c2 = V_f[1] > U_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (Z_f[1] == U_f[1]);
+ V_f[2] = U_f[2] - Z_f[2];
+ _c3 = V_f[2] > U_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (Z_f[2] == U_f[2]);
+ V_f[3] = U_f[3] - Z_f[3] - _c3;
+ }
+ while (0);
+ goto sub3;
+ }
+ if (U_e == 32767)
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3])
+ == 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3)
+ % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ goto sub_done;
+ }
+ goto sub1;
+ }
+ }
+ else if (U_e == 32767)
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ goto sub_done;
+ }
+ (Z_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32);
+ sub1:if (ediff <= (3 + 113))
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (ediff) / 32;
+ _down = (ediff) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= Z_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ Z_f[_i] = Z_f[_i + _skip];
+ else
+ {
+ _s |= Z_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ Z_f[_i] =
+ Z_f[_i + _skip] >> _down | Z_f[_i +
+ _skip +
+ 1] << _up;
+ Z_f[_i++] = Z_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ Z_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ Z_f[0] |= _sticky;
+ }
+ while (0);
+ else if (!((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ (Z_f[3] = 0, Z_f[2] = 0, Z_f[1] = 0, Z_f[0] = 1);
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] - Z_f[0];
+ _c1 = V_f[0] > U_f[0];
+ V_f[1] = U_f[1] - Z_f[1];
+ _c2 = V_f[1] > U_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (Z_f[1] == U_f[1]);
+ V_f[2] = U_f[2] - Z_f[2];
+ _c3 = V_f[2] > U_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (Z_f[2] == U_f[2]);
+ V_f[3] = U_f[3] - Z_f[3] - _c3;
+ }
+ while (0);
+ }
+ else if (ediff < 0)
+ {
+ ediff = -ediff;
+ V_e = Z_e;
+ V_s = Z_s;
+ if (U_e == 0)
+ {
+ if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ {
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) ==
+ 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ goto sub_done;
+ }
+ else
+ {
+ _fex |= (0);
+ ediff--;
+ if (ediff == 0)
+ {
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = Z_f[0] - U_f[0];
+ _c1 = V_f[0] > Z_f[0];
+ V_f[1] = Z_f[1] - U_f[1];
+ _c2 = V_f[1] > Z_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (U_f[1] == Z_f[1]);
+ V_f[2] = Z_f[2] - U_f[2];
+ _c3 = V_f[2] > Z_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (U_f[2] == Z_f[2]);
+ V_f[3] = Z_f[3] - U_f[3] - _c3;
+ }
+ while (0);
+ goto sub3;
+ }
+ if (Z_e == 32767)
+ {
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3])
+ == 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3)
+ % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ goto sub_done;
+ }
+ goto sub2;
+ }
+ }
+ else if (Z_e == 32767)
+ {
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ goto sub_done;
+ }
+ (U_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32);
+ sub2:if (ediff <= (3 + 113))
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (ediff) / 32;
+ _down = (ediff) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= U_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ _s |= U_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ U_f[_i] =
+ U_f[_i + _skip] >> _down | U_f[_i +
+ _skip +
+ 1] << _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ U_f[0] |= _sticky;
+ }
+ while (0);
+ else if (!((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ (U_f[3] = 0, U_f[2] = 0, U_f[1] = 0, U_f[0] = 1);
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = Z_f[0] - U_f[0];
+ _c1 = V_f[0] > Z_f[0];
+ V_f[1] = Z_f[1] - U_f[1];
+ _c2 = V_f[1] > Z_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (U_f[1] == Z_f[1]);
+ V_f[2] = Z_f[2] - U_f[2];
+ _c3 = V_f[2] > Z_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (U_f[2] == Z_f[2]);
+ V_f[3] = Z_f[3] - U_f[3] - _c3;
+ }
+ while (0);
+ }
+ else
+ {
+ if (!(((U_e + 1) & 32767) > 1))
+ {
+ if (U_e == 0)
+ {
+ V_e = 0;
+ if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ {
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ V_s = (0 == 3);
+ else
+ {
+ _fex |= (0);
+ V_s = Z_s;
+ }
+ goto sub_done;
+ }
+ else if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ {
+ _fex |= (0);
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ V_s = U_s;
+ goto sub_done;
+ }
+ else
+ {
+ _fex |= (0);
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] - Z_f[0];
+ _c1 = V_f[0] > U_f[0];
+ V_f[1] = U_f[1] - Z_f[1];
+ _c2 = V_f[1] > U_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (Z_f[1] == U_f[1]);
+ V_f[2] = U_f[2] - Z_f[2];
+ _c3 = V_f[2] > U_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (Z_f[2] == U_f[2]);
+ V_f[3] = U_f[3] - Z_f[3] - _c3;
+ }
+ while (0);
+ V_s = U_s;
+ if ((V_f[3]) &
+ ((unsigned long) 1 << (113 - 1 + 3) % 32))
+ {
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = Z_f[0] - U_f[0];
+ _c1 = V_f[0] > Z_f[0];
+ V_f[1] = Z_f[1] - U_f[1];
+ _c2 = V_f[1] > Z_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (U_f[1] == Z_f[1]);
+ V_f[2] = Z_f[2] - U_f[2];
+ _c3 = V_f[2] > Z_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (U_f[2] == Z_f[2]);
+ V_f[3] = Z_f[3] - U_f[3] - _c3;
+ }
+ while (0);
+ V_s = Z_s;
+ }
+ else
+ if (((V_f[0] | V_f[1] | V_f[2] | V_f[3]) ==
+ 0))
+ V_s = (0 == 3);
+ goto sub_done;
+ }
+ }
+ else
+ {
+ do
+ {
+ if (U_e == 32767
+ && !((U_f[0] | U_f[1] | U_f[2] | U_f[3]) ==
+ 0)
+ && !((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ do
+ {
+ if (Z_e == 32767
+ && !((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) ==
+ 0)
+ && !((Z_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) %
+ 32)))
+ _fex |= (0);
+ }
+ while (0);
+ V_e = 32767;
+ if (((U_f[0] | U_f[1] | U_f[2] | U_f[3]) == 0))
+ {
+ if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ {
+ V_s = 0;
+ (V_f[3] =
+ ((((unsigned long) 1 << (113 - 2) %
+ 32) << 1) - 1), V_f[2] = -1, V_f[1] =
+ -1, V_f[0] = -1);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ V_f[_i] = V_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ V_f[_i] =
+ V_f[_i -
+ _skip] << _up | V_f[_i -
+ _skip -
+ 1] >>
+ _down;
+ V_f[_i--] = V_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ V_f[_i] = 0;
+ }
+ while (0);
+ _fex |= (0);
+ }
+ else
+ {
+ V_s = Z_s;
+ (V_f[0] = Z_f[0], V_f[1] = Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ }
+ }
+ else
+ {
+ if (((Z_f[0] | Z_f[1] | Z_f[2] | Z_f[3]) == 0))
+ {
+ V_s = U_s;
+ (V_f[0] = U_f[0], V_f[1] = U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ }
+ else
+ {
+ do
+ {
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _down = (3) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip;
+ ++_i)
+ U_f[_i] = U_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip;
+ ++_i)
+ U_f[_i] =
+ U_f[_i +
+ _skip] >> _down | U_f[_i
+ +
+ _skip
+ +
+ 1]
+ << _up;
+ U_f[_i++] = U_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ U_f[_i] = 0;
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _down = (3) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip;
+ ++_i)
+ Z_f[_i] = Z_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip;
+ ++_i)
+ Z_f[_i] =
+ Z_f[_i +
+ _skip] >> _down | Z_f[_i
+ +
+ _skip
+ +
+ 1]
+ << _up;
+ Z_f[_i++] = Z_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ Z_f[_i] = 0;
+ }
+ while (0);
+ do
+ {
+ if (((U_f[3]) &
+ ((unsigned long) 1 << (113 - 2)
+ % 32))
+ && !((Z_f[3]) &
+ ((unsigned long) 1 <<
+ (113 - 2) % 32)))
+ {
+ V_s = Z_s;
+ (V_f[0] = Z_f[0], V_f[1] =
+ Z_f[1], V_f[2] =
+ Z_f[2], V_f[3] = Z_f[3]);
+ }
+ else
+ {
+ V_s = U_s;
+ (V_f[0] = U_f[0], V_f[1] =
+ U_f[1], V_f[2] =
+ U_f[2], V_f[3] = U_f[3]);
+ }
+ V_c = 3;
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ V_f[_i] = V_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ V_f[_i] =
+ V_f[_i -
+ _skip] << _up | V_f[_i -
+ _skip
+ -
+ 1]
+ >> _down;
+ V_f[_i--] = V_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ V_f[_i] = 0;
+ }
+ while (0);
+ }
+ while (0);
+ }
+ }
+ goto sub_done;
+ }
+ }
+ V_e = U_e;
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = U_f[0] - Z_f[0];
+ _c1 = V_f[0] > U_f[0];
+ V_f[1] = U_f[1] - Z_f[1];
+ _c2 = V_f[1] > U_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (Z_f[1] == U_f[1]);
+ V_f[2] = U_f[2] - Z_f[2];
+ _c3 = V_f[2] > U_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (Z_f[2] == U_f[2]);
+ V_f[3] = U_f[3] - Z_f[3] - _c3;
+ }
+ while (0);
+ V_s = U_s;
+ if ((V_f[3]) & ((unsigned long) 1 << (113 - 1 + 3) % 32))
+ {
+ do
+ {
+ unsigned long _c1, _c2, _c3;
+ V_f[0] = Z_f[0] - U_f[0];
+ _c1 = V_f[0] > Z_f[0];
+ V_f[1] = Z_f[1] - U_f[1];
+ _c2 = V_f[1] > Z_f[1];
+ V_f[1] -= _c1;
+ _c2 |= _c1 && (U_f[1] == Z_f[1]);
+ V_f[2] = Z_f[2] - U_f[2];
+ _c3 = V_f[2] > Z_f[2];
+ V_f[2] -= _c2;
+ _c3 |= _c2 && (U_f[2] == Z_f[2]);
+ V_f[3] = Z_f[3] - U_f[3] - _c3;
+ }
+ while (0);
+ V_s = Z_s;
+ }
+ else if (((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0))
+ {
+ V_e = 0;
+ V_s = (0 == 3);
+ goto sub_done;
+ }
+ goto norm;
+ }
+ sub3:if ((V_f[3]) &
+ ((unsigned long) 1 << (113 - 1 + 3) % 32))
+ {
+ int diff;
+ (V_f[3]) &= ((unsigned long) 1 << (113 - 1 + 3) % 32) - 1;
+ norm:do
+ {
+ if (V_f[3])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ diff = __builtin_clz (V_f[3]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ diff = __builtin_clzl (V_f[3]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ diff = __builtin_clzll (V_f[3]);
+ else
+ abort ();
+ }
+ while (0);
+ }
+ else if (V_f[2])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ diff = __builtin_clz (V_f[2]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ diff = __builtin_clzl (V_f[2]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ diff = __builtin_clzll (V_f[2]);
+ else
+ abort ();
+ }
+ while (0);
+ diff += 32;
+ }
+ else if (V_f[1])
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ diff = __builtin_clz (V_f[1]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ diff = __builtin_clzl (V_f[1]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ diff = __builtin_clzll (V_f[1]);
+ else
+ abort ();
+ }
+ while (0);
+ diff += 32 * 2;
+ }
+ else
+ {
+ do
+ {
+ if (sizeof (unsigned long) ==
+ sizeof (unsigned int))
+ diff = __builtin_clz (V_f[0]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long))
+ diff = __builtin_clzl (V_f[0]);
+ else if (sizeof (unsigned long) ==
+ sizeof (unsigned long long))
+ diff = __builtin_clzll (V_f[0]);
+ else
+ abort ();
+ }
+ while (0);
+ diff += 32 * 3;
+ }
+ }
+ while (0);
+ diff -= ((4 * 32) - (3 + 113));
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (diff) / 32;
+ _up = (diff) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ V_f[_i] = V_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ V_f[_i] =
+ V_f[_i - _skip] << _up | V_f[_i - _skip -
+ 1] >> _down;
+ V_f[_i--] = V_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ V_f[_i] = 0;
+ }
+ while (0);
+ if (V_e <= diff)
+ {
+ diff = diff - V_e + 1;
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (diff) / 32;
+ _down = (diff) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= V_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ V_f[_i] = V_f[_i + _skip];
+ else
+ {
+ _s |= V_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ V_f[_i] =
+ V_f[_i + _skip] >> _down | V_f[_i +
+ _skip +
+ 1] <<
+ _up;
+ V_f[_i++] = V_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ V_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ V_f[0] |= _sticky;
+ }
+ while (0);
+ V_e = 0;
+ }
+ else
+ {
+ V_e -= diff;
+ (V_f[3]) &=
+ ~(unsigned long) ((unsigned long) 1 << (113 - 1 + 3) %
+ 32);
+ }
+ }
+ sub_done:;
+ }
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_PACK_SEMIRAW_Q(v,V) */
+ do
+ {
+ do
+ {
+ do
+ {
+ if ((V_f[0]) & 7)
+ _fex |= (0);
+ switch (0)
+ {
+ case 0:
+ do
+ {
+ if (((V_f[0]) & 15) != ((unsigned long) 1 << 2))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((V_f[0] +=
+ ((unsigned long) 1 << 2)) <
+ ((unsigned long) 1 << 2));
+ V_f[1] += _t;
+ _t = (V_f[1] < _t);
+ V_f[2] += _t;
+ _t = (V_f[2] < _t);
+ V_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 1:
+ (void) 0;
+ break;
+ case 2:
+ do
+ {
+ if (!V_s && ((V_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((V_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ V_f[1] += _t;
+ _t = (V_f[1] < _t);
+ V_f[2] += _t;
+ _t = (V_f[2] < _t);
+ V_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 3:
+ do
+ {
+ if (V_s && ((V_f[0]) & 7))
+ do
+ {
+ unsigned long _t;
+ _t =
+ ((V_f[0] +=
+ ((unsigned long) 1 << 3)) <
+ ((unsigned long) 1 << 3));
+ V_f[1] += _t;
+ _t = (V_f[1] < _t);
+ V_f[2] += _t;
+ _t = (V_f[2] < _t);
+ V_f[3] += _t;
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ }
+ }
+ while (0);
+ if ((V_f[3]) & (((unsigned long) 1 << ((3 + 113) % 32)) >> 1))
+ {
+ (V_f[3]) &= ~(((unsigned long) 1 << ((3 + 113) % 32)) >> 1);
+ V_e++;
+ if (V_e == 32767)
+ do
+ {
+ if (0 == 0 || (0 == 2 && !V_s) || (0 == 3 && V_s))
+ {
+ V_e = 32767;
+ (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0);
+ }
+ else
+ {
+ V_e = 32767 - 1;
+ _fex |= (0);
+ _fex |= (0);
+ (V_f[3] = (~(signed long) 0), V_f[2] =
+ (~(signed long) 0), V_f[1] =
+ (~(signed long) 0), V_f[0] = (~(signed long) 0));
+ }
+ }
+ while (0);
+ }
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _down = (3) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ V_f[_i] = V_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ V_f[_i] =
+ V_f[_i + _skip] >> _down | V_f[_i + _skip + 1] << _up;
+ V_f[_i++] = V_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ V_f[_i] = 0;
+ }
+ while (0);
+ if (!(((V_e + 1) & 32767) > 1)
+ && !((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0))
+ {
+ if (V_e == 0)
+ _fex |= (0);
+ else
+ {
+ if (!1)
+ {
+ (V_f[3] =
+ ((((unsigned long) 1 << (113 - 2) % 32) << 1) - 1),
+ V_f[2] = -1, V_f[1] = -1, V_f[0] = -1);
+ V_s = 0;
+ }
+ else
+ (V_f[3]) |= ((unsigned long) 1 << (113 - 2) % 32);
+ }
+ }
+ }
+ while (0);
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.bits.frac0 = V_f[0];
+ _flo.bits.frac1 = V_f[1];
+ _flo.bits.frac2 = V_f[2];
+ _flo.bits.frac3 = V_f[3];
+ _flo.bits.exp = V_e;
+ _flo.bits.sign = V_s;
+ (v) = _flo.flt;
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_HANDLE_EXCEPTIONS */
+ do
+ {
+ }
+ while (0);
+
+ /* Truncate quad to double. */
+/* FP_INIT_ROUNDMODE */
+ do
+ {
+ }
+ while (0);
+
+/* FP_UNPACK_SEMIRAW_Q(V,v) */
+ do
+ {
+ do
+ {
+ union _FP_UNION_Q _flo;
+ _flo.flt = (v);
+ V_f[0] = _flo.bits.frac0;
+ V_f[1] = _flo.bits.frac1;
+ V_f[2] = _flo.bits.frac2;
+ V_f[3] = _flo.bits.frac3;
+ V_e = _flo.bits.exp;
+ V_s = _flo.bits.sign;
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (3) / 32;
+ _up = (3) % 32;
+ _down = 32 - _up;
+ if (!_up)
+ for (_i = 3; _i >= _skip; --_i)
+ V_f[_i] = V_f[_i - _skip];
+ else
+ {
+ for (_i = 3; _i > _skip; --_i)
+ V_f[_i] =
+ V_f[_i - _skip] << _up | V_f[_i - _skip - 1] >> _down;
+ V_f[_i--] = V_f[0] << _up;
+ }
+ for (; _i >= 0; --_i)
+ V_f[_i] = 0;
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_TRUNC(D,Q,2,4,R,V) */
+ do
+ {
+ if (113 < 53 || 16383 < 1023 + 53 - 1)
+ abort ();
+ R_s = V_s;
+ if ((((V_e + 1) & 32767) > 1))
+ {
+ R_e = V_e + 1023 - 16383;
+ if (R_e >= 2047)
+ do
+ {
+ if (0 == 0 || (0 == 2 && !R_s) || (0 == 3 && R_s))
+ {
+ R_e = 2047;
+ (R_f0 = 0, R_f1 = 0);
+ }
+ else
+ {
+ R_e = 2047 - 1;
+ _fex |= (0);
+ _fex |= (0);
+ (R_f0 = (~(signed long) 0), R_f1 = (~(signed long) 0));
+ }
+ }
+ while (0);
+ else
+ {
+ if (R_e <= 0)
+ {
+ if (R_e <= 1 - 53)
+ (V_f[3] = 0, V_f[2] = 0, V_f[1] = 0, V_f[0] = 0);
+ else
+ {
+ (V_f[3]) |= ((unsigned long) 1 << (113 - 1 + 3) % 32);
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (((3 + 113) - (3 + 53) + 1 - R_e)) / 32;
+ _down = (((3 + 113) - (3 + 53) + 1 - R_e)) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= V_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ V_f[_i] = V_f[_i + _skip];
+ else
+ {
+ _s |= V_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ V_f[_i] =
+ V_f[_i + _skip] >> _down | V_f[_i +
+ _skip +
+ 1] <<
+ _up;
+ V_f[_i++] = V_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ V_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ V_f[0] |= _sticky;
+ }
+ while (0);
+ }
+ R_e = 0;
+ }
+ else
+ do
+ {
+ int _sticky;
+ do
+ {
+ long _up, _down, _skip, _i;
+ unsigned long _s;
+ _skip = (((3 + 113) - (3 + 53))) / 32;
+ _down = (((3 + 113) - (3 + 53))) % 32;
+ _up = 32 - _down;
+ for (_s = _i = 0; _i < _skip; ++_i)
+ _s |= V_f[_i];
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ V_f[_i] = V_f[_i + _skip];
+ else
+ {
+ _s |= V_f[_i] << _up;
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ V_f[_i] =
+ V_f[_i + _skip] >> _down | V_f[_i + _skip +
+ 1] << _up;
+ V_f[_i++] = V_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ V_f[_i] = 0;
+ _sticky = (_s != 0);
+ }
+ while (0);
+ V_f[0] |= _sticky;
+ }
+ while (0);
+ do
+ {
+ R_f0 = V_f[0];
+ R_f1 = V_f[1];
+ }
+ while (0);
+ }
+ }
+ else
+ {
+ if (V_e == 0)
+ {
+ R_e = 0;
+ (R_f0 = 0, R_f1 = 0);
+ if (!((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0))
+ {
+ _fex |= (0);
+ _fex |= (0);
+ }
+ }
+ else
+ {
+ R_e = 2047;
+ if (((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0))
+ (R_f0 = 0, R_f1 = 0);
+ else
+ {
+ do
+ {
+ if (V_e == 32767
+ && !((V_f[0] | V_f[1] | V_f[2] | V_f[3]) == 0)
+ && !((V_f[3]) &
+ ((unsigned long) 1 << (113 - 2 + 3) % 32)))
+ _fex |= (0);
+ }
+ while (0);
+ do
+ {
+ long _up, _down, _skip, _i;
+ _skip = (((3 + 113) - (3 + 53))) / 32;
+ _down = (((3 + 113) - (3 + 53))) % 32;
+ _up = 32 - _down;
+ if (!_down)
+ for (_i = 0; _i <= 3 - _skip; ++_i)
+ V_f[_i] = V_f[_i + _skip];
+ else
+ {
+ for (_i = 0; _i < 3 - _skip; ++_i)
+ V_f[_i] =
+ V_f[_i + _skip] >> _down | V_f[_i + _skip +
+ 1] << _up;
+ V_f[_i++] = V_f[3] >> _down;
+ }
+ for (; _i < 4; ++_i)
+ V_f[_i] = 0;
+ }
+ while (0);
+ do
+ {
+ R_f0 = V_f[0];
+ R_f1 = V_f[1];
+ }
+ while (0);
+ (R_f1) |= ((unsigned long) 1 << (53 - 2 + 3) % 32);
+ }
+ }
+ }
+ }
+ while (0);
+
+/* FP_PACK_SEMIRAW_D(r,R) */
+ do
+ {
+ do
+ {
+ do
+ {
+ if ((R_f0) & 7)
+ _fex |= (0);
+ switch (0)
+ {
+ case 0:
+ do
+ {
+ if (((R_f0) & 15) != ((unsigned long) 1 << 2))
+ do
+ {
+ if (__builtin_constant_p (0) && (0) == 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 2)));
+ else if (__builtin_constant_p (0)
+ && (0) == ~(USItype) 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 2)));
+ else
+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" (R_f1), "=&r" (R_f0):"%r" (R_f1), "r" (0), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 2)));
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 1:
+ (void) 0;
+ break;
+ case 2:
+ do
+ {
+ if (!R_s && ((R_f0) & 7))
+ do
+ {
+ if (__builtin_constant_p (0) && (0) == 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 3)));
+ else if (__builtin_constant_p (0)
+ && (0) == ~(USItype) 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 3)));
+ else
+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" (R_f1), "=&r" (R_f0):"%r" (R_f1), "r" (0), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 3)));
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ case 3:
+ do
+ {
+ if (R_s && ((R_f0) & 7))
+ do
+ {
+ if (__builtin_constant_p (0) && (0) == 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 3)));
+ else if (__builtin_constant_p (0)
+ && (0) == ~(USItype) 0)
+ __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2": "=r" (R_f1), "=&r" (R_f0):"r" (R_f1), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 3)));
+ else
+ __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3": "=r" (R_f1), "=&r" (R_f0):"%r" (R_f1), "r" (0), "%r" (R_f0),
+ "rI" (((unsigned long) 1 <<
+ 3)));
+ }
+ while (0);
+ }
+ while (0);
+ break;
+ }
+ }
+ while (0);
+ if ((R_f1) & (((unsigned long) 1 << (3 + 53) % 32) >> 1))
+ {
+ (R_f1) &= ~(((unsigned long) 1 << (3 + 53) % 32) >> 1);
+ R_e++;
+ if (R_e == 2047)
+ do
+ {
+ if (0 == 0 || (0 == 2 && !R_s) || (0 == 3 && R_s))
+ {
+ R_e = 2047;
+ (R_f0 = 0, R_f1 = 0);
+ }
+ else
+ {
+ R_e = 2047 - 1;
+ _fex |= (0);
+ _fex |= (0);
+ (R_f0 = (~(signed long) 0), R_f1 =
+ (~(signed long) 0));
+ }
+ }
+ while (0);
+ }
+ (void) (((3) < 32) ? (
+ {
+ R_f0 = R_f0 >> (3) | R_f1 << (32 - (3)); R_f1 >>= (3);}):(
+ {
+ R_f0 = R_f1 >> ((3) - 32); R_f1 = 0;}));
+ if (!(((R_e + 1) & 2047) > 1) && !((R_f1 | R_f0) == 0))
+ {
+ if (R_e == 0)
+ _fex |= (0);
+ else
+ {
+ if (!1)
+ {
+ (R_f0 = -1, R_f1 =
+ ((((unsigned long) 1 << (53 - 2) % 32) << 1) - 1));
+ R_s = 0;
+ }
+ else
+ (R_f1) |= ((unsigned long) 1 << (53 - 2) % 32);
+ }
+ }
+ }
+ while (0);
+ do
+ {
+ union _FP_UNION_D _flo;
+ _flo.bits.frac0 = R_f0;
+ _flo.bits.frac1 = R_f1;
+ _flo.bits.exp = R_e;
+ _flo.bits.sign = R_s;
+ (r) = _flo.flt;
+ }
+ while (0);
+ }
+ while (0);
+
+/* FP_HANDLE_EXCEPTIONS */
+ do
+ {
+ }
+ while (0);
+
+ return r;
+}
+
+
+#endif
+
#endif
diff -urN gcc42-trunc-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver gcc42-patched-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver
--- gcc42-trunc-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver 2006-08-02 11:07:16.000000000 -0500
+++ gcc42-patched-20060802/gcc/config/rs6000/libgcc-ppc-glibc.ver 2006-09-01 08:28:29.000000000 -0500
@@ -21,11 +21,32 @@
%else
GCC_3.4.4 {
%endif
+%else
+GCC_4.2.0 {
+%endif
# long double support
__gcc_qadd
__gcc_qsub
__gcc_qmul
__gcc_qdiv
-}
+
+%ifdef _SOFT_FLOAT
+ __gcc_qneg
+ __gcc_qeq
+ __gcc_qne
+ __gcc_ggt
+ __gcc_qge
+ __gcc_qlt
+ __gcc_qle
+ __gcc_qunord
+ __gcc_stoq
+ __gcc_dtoq
+ __gcc_qtos
+ __gcc_qtod
+ __gcc_qtoi
+ __gcc_qtou
+ __gcc_itoq
+ __gcc_utoq
%endif
+}
diff -urN gcc42-trunc-20060802/gcc/config/rs6000/rs6000.c gcc42-patched-20060802/gcc/config/rs6000/rs6000.c
--- gcc42-trunc-20060802/gcc/config/rs6000/rs6000.c 2006-08-02 11:07:16.000000000 -0500
+++ gcc42-patched-20060802/gcc/config/rs6000/rs6000.c 2006-09-01 08:28:29.000000000 -0500
@@ -4016,8 +4016,7 @@
/* 128-bit constant floating-point values on Darwin should really be
loaded as two parts. */
- if (!TARGET_IEEEQUAD
- && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128
+ if (!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128
&& mode == TFmode && GET_CODE (operands[1]) == CONST_DOUBLE)
{
/* DImode is used, not DFmode, because simplify_gen_subreg doesn't
@@ -9175,9 +9174,6 @@
static void
rs6000_init_libfuncs (void)
{
- if (!TARGET_HARD_FLOAT)
- return;
-
if (DEFAULT_ABI != ABI_V4 && TARGET_XCOFF
&& !TARGET_POWER2 && !TARGET_POWERPC)
{
@@ -9196,6 +9192,27 @@
set_optab_libfunc (sub_optab, TFmode, "__gcc_qsub");
set_optab_libfunc (smul_optab, TFmode, "__gcc_qmul");
set_optab_libfunc (sdiv_optab, TFmode, "__gcc_qdiv");
+
+ if (TARGET_SOFT_FLOAT)
+ {
+ set_optab_libfunc (neg_optab, TFmode, "__gcc_qneg");
+ set_optab_libfunc (eq_optab, TFmode, "__gcc_qeq");
+ set_optab_libfunc (ne_optab, TFmode, "__gcc_qne");
+ set_optab_libfunc (gt_optab, TFmode, "__gcc_qgt");
+ set_optab_libfunc (ge_optab, TFmode, "__gcc_qge");
+ set_optab_libfunc (lt_optab, TFmode, "__gcc_qlt");
+ set_optab_libfunc (le_optab, TFmode, "__gcc_qle");
+ set_optab_libfunc (unord_optab, TFmode, "__gcc_qunord");
+
+ set_conv_libfunc (sext_optab, TFmode, SFmode, "__gcc_stoq");
+ set_conv_libfunc (sext_optab, TFmode, DFmode, "__gcc_dtoq");
+ set_conv_libfunc (trunc_optab, SFmode, TFmode, "__gcc_qtos");
+ set_conv_libfunc (trunc_optab, DFmode, TFmode, "__gcc_qtod");
+ set_conv_libfunc (sfix_optab, SImode, TFmode, "__gcc_qtoi");
+ set_conv_libfunc (ufix_optab, SImode, TFmode, "__gcc_qtou");
+ set_conv_libfunc (sfloat_optab, TFmode, SImode, "__gcc_itoq");
+ set_conv_libfunc (ufloat_optab, TFmode, SImode, "__gcc_utoq");
+ }
}
else
{
diff -urN gcc42-trunc-20060802/gcc/config/rs6000/rs6000.md gcc42-patched-20060802/gcc/config/rs6000/rs6000.md
--- gcc42-trunc-20060802/gcc/config/rs6000/rs6000.md 2006-08-02 11:07:16.000000000 -0500
+++ gcc42-patched-20060802/gcc/config/rs6000/rs6000.md 2006-09-01 08:28:29.000000000 -0500
@@ -7920,42 +7920,44 @@
"")
(define_insn "*movcc_internal1"
- [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,?y,r,r,r,r,q,cl,r,m")
- (match_operand:CC 1 "nonimmediate_operand" "y,r,r,x,y,r,h,r,r,m,r"))]
+ [(set (match_operand:CC 0 "nonimmediate_operand" "=y,x,?y,y,r,r,r,r,r,q,cl,r,m")
+ (match_operand:CC 1 "general_operand" "y,r,r,O,x,y,r,I,h,r,r,m,r"))]
"register_operand (operands[0], CCmode)
|| register_operand (operands[1], CCmode)"
"@
mcrf %0,%1
mtcrf 128,%1
{rlinm|rlwinm} %1,%1,%F0,0xffffffff\;mtcrf %R0,%1\;{rlinm|rlwinm} %1,%1,%f0,0xffffffff
+ crxor %0,%0,%0
mfcr %0%Q1
mfcr %0%Q1\;{rlinm|rlwinm} %0,%0,%f1,0xf0000000
mr %0,%1
+ {lil|li} %0,%1
mf%1 %0
mt%0 %1
mt%0 %1
{l%U1%X1|lwz%U1%X1} %0,%1
{st%U0%U1|stw%U0%U1} %1,%0"
[(set (attr "type")
- (cond [(eq_attr "alternative" "0")
+ (cond [(eq_attr "alternative" "0,3")
(const_string "cr_logical")
(eq_attr "alternative" "1,2")
(const_string "mtcr")
- (eq_attr "alternative" "5,7")
+ (eq_attr "alternative" "6,7,9")
(const_string "integer")
- (eq_attr "alternative" "6")
- (const_string "mfjmpr")
(eq_attr "alternative" "8")
+ (const_string "mfjmpr")
+ (eq_attr "alternative" "10")
(const_string "mtjmpr")
- (eq_attr "alternative" "9")
+ (eq_attr "alternative" "11")
(const_string "load")
- (eq_attr "alternative" "10")
+ (eq_attr "alternative" "12")
(const_string "store")
(ne (symbol_ref "TARGET_MFCRF") (const_int 0))
(const_string "mfcrf")
]
(const_string "mfcr")))
- (set_attr "length" "4,4,12,4,8,4,4,4,4,4,4")])
+ (set_attr "length" "4,4,12,4,4,8,4,4,4,4,4,4,4")])
;; For floating-point, we normally deal with the floating-point registers
;; unless -msoft-float is used. The sole exception is that parameter passing
@@ -8313,8 +8315,7 @@
(define_expand "movtf"
[(set (match_operand:TF 0 "general_operand" "")
(match_operand:TF 1 "any_operand" ""))]
- "!TARGET_IEEEQUAD
- && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
+ "!TARGET_IEEEQUAD && TARGET_LONG_DOUBLE_128"
"{ rs6000_emit_move (operands[0], operands[1], TFmode); DONE; }")
; It's important to list the o->f and f->o moves before f->f because
@@ -8333,6 +8334,19 @@
{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
[(set_attr "length" "8,8,8,20,20,16")])
+(define_insn_and_split "*movtf_softfloat"
+ [(set (match_operand:TF 0 "nonimmediate_operand" "=r,Y,r")
+ (match_operand:TF 1 "input_operand" "YGHF,r,r"))]
+ "!TARGET_IEEEQUAD
+ && (TARGET_SOFT_FLOAT || !TARGET_FPRS) && TARGET_LONG_DOUBLE_128
+ && (gpc_reg_operand (operands[0], TFmode)
+ || gpc_reg_operand (operands[1], TFmode))"
+ "#"
+ "&& reload_completed"
+ [(pc)]
+{ rs6000_split_multireg_move (operands[0], operands[1]); DONE; }
+ [(set_attr "length" "20,20,16")])
+
(define_expand "extenddftf2"
[(parallel [(set (match_operand:TF 0 "nonimmediate_operand" "")
(float_extend:TF (match_operand:DF 1 "input_operand" "")))
diff -urN gcc42-trunc-20060802/gcc/config/rs6000/sysv4.h gcc42-patched-20060802/gcc/config/rs6000/sysv4.h
--- gcc42-trunc-20060802/gcc/config/rs6000/sysv4.h 2006-08-02 11:07:16.000000000 -0500
+++ gcc42-patched-20060802/gcc/config/rs6000/sysv4.h 2006-09-01 08:28:29.000000000 -0500
@@ -215,10 +215,6 @@
error ("-msecure-plt not supported by your assembler"); \
} \
\
- if (TARGET_SOFT_FLOAT && TARGET_LONG_DOUBLE_128 \
- && rs6000_explicit_options.long_double) \
- warning (0, "-msoft-float and -mlong-double-128 not supported"); \
- \
/* Treat -fPIC the same as -mrelocatable. */ \
if (flag_pic > 1 && DEFAULT_ABI != ABI_AIX) \
{ \
diff -urN gcc42-trunc-20060802/gcc/config/rs6000/t-ppccomm gcc42-patched-20060802/gcc/config/rs6000/t-ppccomm
--- gcc42-trunc-20060802/gcc/config/rs6000/t-ppccomm 2006-08-02 11:07:16.000000000 -0500
+++ gcc42-patched-20060802/gcc/config/rs6000/t-ppccomm 2006-09-01 08:28:29.000000000 -0500
@@ -12,15 +12,8 @@
cat $(srcdir)/config/rs6000/tramp.asm > tramp.S
ifneq (,$findstring gnu,$(target))
-TARGET_LIBGCC2_CFLAGS += -specs=ldblspecs
-
+TARGET_LIBGCC2_CFLAGS += -mlong-double-128
SHLIB_MAPFILES += $(srcdir)/config/rs6000/libgcc-ppc-glibc.ver
-
-# Hack to use -mlong-double-128 only when not compiling nof libgcc
-mklibgcc: ldblspecs
-
-ldblspecs: specs
- sed -e '/cc1_options/{ n; s/$$/ %{!msoft-float:-mlong-double-128}/; }' < specs > $@
endif
# Switch synonyms