summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/dfp-bit.c66
-rw-r--r--gcc/config/dfp-bit.h22
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/dfp/dfp-except.h13
-rw-r--r--gcc/testsuite/gcc.dg/dfp/fe-binop.c107
-rw-r--r--gcc/testsuite/gcc.dg/dfp/fe-check.h70
-rw-r--r--gcc/testsuite/gcc.dg/dfp/fe-convert-1.c42
-rw-r--r--gcc/testsuite/gcc.dg/dfp/fe-convert-2.c34
-rw-r--r--gcc/testsuite/gcc.dg/dfp/fe-convert-3.c49
-rw-r--r--libdecnumber/ChangeLog5
-rw-r--r--libdecnumber/decExcept.c59
-rw-r--r--libdecnumber/decExcept.h39
-rw-r--r--libgcc/ChangeLog4
-rw-r--r--libgcc/Makefile.in2
15 files changed, 523 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2137c70f1bc..de00ed61d74 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-29 Janis Johnson <janis187@us.ibm.com>
+
+ * config/dfp-bit.c: Add parameterized support for fp exceptions.
+ * config/dfp-bit.h: Ditto.
+
007-01-29 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
* c-decl.c (pop_scope): Replace warnings with call to
diff --git a/gcc/config/dfp-bit.c b/gcc/config/dfp-bit.c
index 47575ccc8b7..927804c1def 100644
--- a/gcc/config/dfp-bit.c
+++ b/gcc/config/dfp-bit.c
@@ -88,6 +88,19 @@ dfp_unary_op (dfp_unary_func op, DFP_C_TYPE arg)
/* Perform the operation. */
op (&res, &arg1, &context);
+ if (DFP_EXCEPTIONS_ENABLED && context.status != 0)
+ {
+ /* decNumber exception flags we care about here. */
+ int ieee_flags;
+ int dec_flags = DEC_IEEE_854_Division_by_zero | DEC_IEEE_854_Inexact
+ | DEC_IEEE_854_Invalid_operation | DEC_IEEE_854_Overflow
+ | DEC_IEEE_854_Underflow;
+ dec_flags &= context.status;
+ ieee_flags = DFP_IEEE_FLAGS (dec_flags);
+ if (ieee_flags != 0)
+ DFP_HANDLE_EXCEPTIONS (ieee_flags);
+ }
+
TO_ENCODED (&encoded_result, &res, &context);
IEEE_TO_HOST (encoded_result, &result);
return result;
@@ -115,6 +128,19 @@ dfp_binary_op (dfp_binary_func op, DFP_C_TYPE arg_a, DFP_C_TYPE arg_b)
/* Perform the operation. */
op (&res, &arg1, &arg2, &context);
+ if (DFP_EXCEPTIONS_ENABLED && context.status != 0)
+ {
+ /* decNumber exception flags we care about here. */
+ int ieee_flags;
+ int dec_flags = DEC_IEEE_854_Division_by_zero | DEC_IEEE_854_Inexact
+ | DEC_IEEE_854_Invalid_operation | DEC_IEEE_854_Overflow
+ | DEC_IEEE_854_Underflow;
+ dec_flags &= context.status;
+ ieee_flags = DFP_IEEE_FLAGS (dec_flags);
+ if (ieee_flags != 0)
+ DFP_HANDLE_EXCEPTIONS (ieee_flags);
+ }
+
TO_ENCODED (&encoded_result, &res, &context);
IEEE_TO_HOST (encoded_result, &result);
return result;
@@ -379,6 +405,17 @@ DFP_TO_DFP (DFP_C_TYPE f_from)
TO_INTERNAL (&s_from, &d);
TO_ENCODED_TO (&s_to, &d, &context);
+ if (DFP_EXCEPTIONS_ENABLED && context.status != 0)
+ {
+ /* decNumber exception flags we care about here. */
+ int ieee_flags;
+ int dec_flags = DEC_IEEE_854_Inexact | DEC_IEEE_854_Invalid_operation;
+ dec_flags &= context.status;
+ ieee_flags = DFP_IEEE_FLAGS (dec_flags);
+ if (ieee_flags != 0)
+ DFP_HANDLE_EXCEPTIONS (ieee_flags);
+ }
+
IEEE_TO_HOST_TO (s_to, &f_to);
return f_to;
}
@@ -394,6 +431,9 @@ DFP_TO_INT (DFP_C_TYPE x)
/* decNumber's decimal* types have the same format as C's _Decimal*
types, but they have different calling conventions. */
+ /* TODO: Decimal float to integer conversions should raise FE_INVALID
+ if the result value does not fit into the result type. */
+
IEEE_TYPE s;
char buf[BUFMAX];
char *pos;
@@ -444,6 +484,19 @@ INT_TO_DFP (INT_TYPE i)
/* Convert from the floating point string to a decimal* type. */
FROM_STRING (&s, buf, &context);
IEEE_TO_HOST (s, &f);
+
+ if (DFP_EXCEPTIONS_ENABLED && context.status != 0)
+ {
+ /* decNumber exception flags we care about here. */
+ int ieee_flags;
+ int dec_flags = DEC_IEEE_854_Inexact | DEC_IEEE_854_Invalid_operation
+ | DEC_IEEE_854_Overflow;
+ dec_flags &= context.status;
+ ieee_flags = DFP_IEEE_FLAGS (dec_flags);
+ if (ieee_flags != 0)
+ DFP_HANDLE_EXCEPTIONS (ieee_flags);
+ }
+
return f;
}
#endif
@@ -492,6 +545,19 @@ BFP_TO_DFP (BFP_TYPE x)
/* Convert from the floating point string to a decimal* type. */
FROM_STRING (&s, buf, &context);
IEEE_TO_HOST (s, &f);
+
+ if (DFP_EXCEPTIONS_ENABLED && context.status != 0)
+ {
+ /* decNumber exception flags we care about here. */
+ int ieee_flags;
+ int dec_flags = DEC_IEEE_854_Inexact | DEC_IEEE_854_Invalid_operation
+ | DEC_IEEE_854_Overflow | DEC_IEEE_854_Underflow;
+ dec_flags &= context.status;
+ ieee_flags = DFP_IEEE_FLAGS (dec_flags);
+ if (ieee_flags != 0)
+ DFP_HANDLE_EXCEPTIONS (ieee_flags);
+ }
+
return f;
}
#endif
diff --git a/gcc/config/dfp-bit.h b/gcc/config/dfp-bit.h
index e68f7df416b..1bbe1563a42 100644
--- a/gcc/config/dfp-bit.h
+++ b/gcc/config/dfp-bit.h
@@ -32,6 +32,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include <fenv.h>
#include <decRound.h>
+#include <decExcept.h>
#include "tconfig.h"
#include "coretypes.h"
#include "tm.h"
@@ -120,6 +121,27 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#define DFP_INIT_ROUNDMODE(A) A = DEC_ROUND_HALF_EVEN
#endif
+#ifdef DFP_EXCEPTIONS_ENABLED
+/* Return IEEE exception flags based on decNumber status flags. */
+#define DFP_IEEE_FLAGS(DEC_FLAGS) __extension__ \
+({int _fe_flags = 0; \
+ if ((dec_flags & DEC_IEEE_854_Division_by_zero) != 0) \
+ _fe_flags |= FE_DIVBYZERO; \
+ if ((dec_flags & DEC_IEEE_854_Inexact) != 0) \
+ _fe_flags |= FE_INEXACT; \
+ if ((dec_flags & DEC_IEEE_854_Invalid_operation) != 0) \
+ _fe_flags |= FE_INVALID; \
+ if ((dec_flags & DEC_IEEE_854_Overflow) != 0) \
+ _fe_flags |= FE_OVERFLOW; \
+ if ((dec_flags & DEC_IEEE_854_Underflow) != 0) \
+ _fe_flags |= FE_UNDERFLOW; \
+ _fe_flags; })
+#else
+#define DFP_EXCEPTIONS_ENABLED 0
+#define DFP_IEEE_FLAGS(A) 0
+#define DFP_HANDLE_EXCEPTIONS(A) do {} while (0)
+#endif
+
/* Conversions between different decimal float types use WIDTH_TO to
determine additional macros to define. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7403bf96851..205b74dc142 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2007-01-29 Janis Johnson <janis187@us.ibm.com>
+ * gcc.dg/dfp/dfp-except.h: New file.
+ * gcc.dg/dfp/fe-check.h: New file.
+ * gcc.dg/dfp/fe-binop.c: New test.
+ * gcc.dg/dfp/fe-convert-1.c: New test.
+ * gcc.dg/dfp/fe-convert-2.c: New test.
+ * gcc.dg/dfp/fe-convert-3.c: New test.
+
* gcc.dg/dfp/dec-eval-method.c: Replace decfloat.h with float.h.
* gcc.dg/dfp/decfloat-constants.c: Ditto.
* gcc.dg/dfp/convert-dfp.c: Ditto.
diff --git a/gcc/testsuite/gcc.dg/dfp/dfp-except.h b/gcc/testsuite/gcc.dg/dfp/dfp-except.h
new file mode 100644
index 00000000000..3ef97ff6be5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dfp/dfp-except.h
@@ -0,0 +1,13 @@
+/* Use undocumented functions in libgcc to clear and test dummy floating
+ point exception flags. That functionality is in libgcc just for
+ testing purposes.
+
+ If fesetexcept and feclearexcept are available, use those instead. */
+
+/* Get names of exception flags. */
+#include <fenv.h>
+
+extern void __dfp_clear_except (int);
+#define DFP_CLEAR_EXCEPT(M) __dfp_clear_except(M)
+extern int __dfp_test_except (int);
+#define DFP_TEST_EXCEPT(M) __dfp_test_except(M)
diff --git a/gcc/testsuite/gcc.dg/dfp/fe-binop.c b/gcc/testsuite/gcc.dg/dfp/fe-binop.c
new file mode 100644
index 00000000000..007bc6e44dd
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dfp/fe-binop.c
@@ -0,0 +1,107 @@
+/* { dg-options "-std=gnu99" } */
+
+/* Touch tests that check for raising appropriate exceptions for binary
+ arithmetic operations on decimal float values. */
+
+#include "fe-check.h"
+
+volatile _Decimal32 a32, b32, c32;
+volatile _Decimal64 a64, b64, c64;
+volatile _Decimal128 a128, b128, c128;
+_Decimal32 inf32;
+_Decimal64 inf64;
+_Decimal128 inf128;
+
+BINOP (100, /, a32, 2.0df, b32, 0.df, c32, FE_DIVBYZERO)
+BINOP (101, /, a64, 2.0dd, b64, 0.dd, c64, FE_DIVBYZERO)
+BINOP (102, /, a128, 2.0dl, b128, 0.dl, c128, FE_DIVBYZERO)
+
+BINOP (200, /, a32, 0.df, b32, 0.df, c32, FE_INVALID)
+BINOP (201, /, a64, 0.dd, b64, 0.dd, c64, FE_INVALID)
+BINOP (202, /, a128, 0.dl, b128, 0.dl, c128, FE_INVALID)
+BINOP (203, /, a32, inf32, b32, inf32, c32, FE_INVALID)
+BINOP (204, /, a64, inf64, b64, inf64, c64, FE_INVALID)
+BINOP (205, /, a128, inf128, b128, inf128, c128, FE_INVALID)
+BINOP (206, *, a32, 0.df, b32, __builtin_infd32(), c32, FE_INVALID)
+BINOP (207, *, a32, __builtin_infd32(), b32, 0.df, c32, FE_INVALID)
+BINOP (208, *, a64, 0.df, b64, __builtin_infd64(), c64, FE_INVALID)
+BINOP (209, *, a64, __builtin_infd64(), b64, 0.df, c64, FE_INVALID)
+BINOP (210, *, a128, 0.df, b128, __builtin_infd128(), c128, FE_INVALID)
+BINOP (211, *, a128, __builtin_infd128(), b128, 0.df, c128, FE_INVALID)
+BINOP (212, +, a32, inf32, b32, -inf32, c32, FE_INVALID)
+BINOP (213, +, a64, inf64, b64, -inf64, c64, FE_INVALID)
+BINOP (214, +, a128, inf128, b128, -inf128, c128, FE_INVALID)
+BINOP (215, -, a32, inf32, b32, inf32, c32, FE_INVALID)
+BINOP (216, -, a64, inf64, b64, inf64, c64, FE_INVALID)
+BINOP (217, -, a128, inf128, b128, inf128, c128, FE_INVALID)
+
+BINOP (300, /, a32, 9.9e94df, b32, 1.e-3df, c32, FE_OVERFLOW|FE_INEXACT)
+BINOP (301, /, a64, 9.9e382dd, b64, 1.e-3dd, c64, FE_OVERFLOW|FE_INEXACT)
+BINOP (302, /, a128, 9.9e6142dl, b128, 1.e-3dl, c128, FE_OVERFLOW|FE_INEXACT)
+BINOP (303, +, a32, 9.9e96df, b32, 1.e96df, c32, FE_OVERFLOW|FE_INEXACT)
+BINOP (304, +, a64, 9.9e384dd, b64, 1.e384dd, c64, FE_OVERFLOW|FE_INEXACT)
+BINOP (305, +, a128, 9.9e6144dl, b128, 1.e6144dl, c128, FE_OVERFLOW|FE_INEXACT)
+
+BINOP (400, /, a32, 1.e-3df, b32, 9.9e94df, c32, FE_UNDERFLOW|FE_INEXACT)
+BINOP (401, /, a64, 1.e-3dd, b64, 9.9e382dd, c64, FE_UNDERFLOW|FE_INEXACT)
+BINOP (402, /, a128, 1.e-3dl, b128, 9.9e6142dl, c128, FE_UNDERFLOW|FE_INEXACT)
+BINOP (403, *, a32, 1.e-95df, b32, 1.e-7df, c32, FE_UNDERFLOW|FE_INEXACT)
+BINOP (404, *, a64, 1.e-383dd, b64, 1.e-16dd, c64, FE_UNDERFLOW|FE_INEXACT)
+BINOP (405, *, a128, 1.e-6143dl, b128, 1.e-34dl, c128, FE_UNDERFLOW|FE_INEXACT)
+
+BINOP (500, /, a32, 1.df, b32, 3.df, c32, FE_INEXACT)
+BINOP (501, /, a64, 1.dd, b64, 3.dd, c64, FE_INEXACT)
+BINOP (502, /, a128, 1.dl, b128, 3.dl, c128, FE_INEXACT)
+
+int
+main ()
+{
+ inf32 = __builtin_infd32();
+ inf64 = __builtin_infd64();
+ inf128 = __builtin_infd128();
+
+ binop_100 ();
+ binop_101 ();
+ binop_102 ();
+
+ binop_200 ();
+ binop_201 ();
+ binop_202 ();
+ binop_203 ();
+ binop_204 ();
+ binop_205 ();
+ binop_206 ();
+ binop_207 ();
+ binop_208 ();
+ binop_209 ();
+ binop_210 ();
+ binop_211 ();
+ binop_212 ();
+ binop_213 ();
+ binop_214 ();
+ binop_215 ();
+ binop_216 ();
+ binop_217 ();
+
+ binop_300 ();
+ binop_301 ();
+ binop_302 ();
+ binop_303 ();
+ binop_304 ();
+ binop_305 ();
+
+ binop_400 ();
+ binop_401 ();
+ binop_402 ();
+ binop_403 ();
+ binop_404 ();
+ binop_405 ();
+
+ binop_500 ();
+ binop_501 ();
+ binop_502 ();
+
+ if (failcnt != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/dfp/fe-check.h b/gcc/testsuite/gcc.dg/dfp/fe-check.h
new file mode 100644
index 00000000000..0e072aa9fa1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dfp/fe-check.h
@@ -0,0 +1,70 @@
+/* Common support for checking that appropriate floating point exceptions
+ are raised for decimal float operations. These tests are here to test
+ the software decimal float support in libgcc. */
+
+#include "dfp-except.h"
+
+extern void abort (void);
+static int failcnt = 0;
+
+/* Support compiling the test to report individual failures; default is
+ to abort as soon as a check fails. */
+#if defined(DBG) || defined(DBG2)
+#include <stdio.h>
+#define FAILURE(NUM,KIND,EXCEPT) \
+ { printf ("failed for test %d: %s %s\n", NUM, KIND, EXCEPT); failcnt++; }
+#else
+#define FAILURE(N,K,E) abort ();
+#endif
+
+/* This is useful when modifying the test to make sure that tests are
+ actually run. */
+#if defined(DBG2)
+#define SUCCESS(NUM,EXCEPT) \
+ { printf ("passed for test %d: %s\n", NUM, EXCEPT); }
+#else
+#define SUCCESS(N,E) ;
+#endif
+
+#define CHECKFLAG(NUM,EXCEPT,GOT,WANT) \
+ if ((WANT & EXCEPT) != (GOT & EXCEPT)) \
+ { \
+ if ((WANT & EXCEPT) != 0) \
+ FAILURE (NUM, "missing", #EXCEPT) \
+ else \
+ FAILURE (NUM, "unexpected", #EXCEPT) \
+ } \
+ else \
+ SUCCESS (NUM, #EXCEPT)
+
+void
+checkflags (int num, int want)
+{
+ int got = DFP_TEST_EXCEPT (FE_ALL_EXCEPT);
+ CHECKFLAG (num, FE_INVALID, got, want)
+ CHECKFLAG (num, FE_OVERFLOW, got, want)
+ CHECKFLAG (num, FE_UNDERFLOW, got, want)
+ CHECKFLAG (num, FE_DIVBYZERO, got, want)
+ CHECKFLAG (num, FE_INEXACT, got, want)
+}
+
+#define BINOP(NUM,OP,VAR1,VAL1,VAR2,VAL2,VAR3,EXCEPT) \
+void \
+binop_##NUM (void) \
+{ \
+ VAR1 = VAL1; \
+ VAR2 = VAL2; \
+ DFP_CLEAR_EXCEPT (FE_ALL_EXCEPT); \
+ VAR3 = VAR1 OP VAR2; \
+ checkflags (NUM, EXCEPT); \
+}
+
+#define CONVERT(NUM,FROM,TO,VALUE,EXCEPT) \
+void \
+convert_##NUM (void) \
+{ \
+ FROM = VALUE; \
+ DFP_CLEAR_EXCEPT (FE_ALL_EXCEPT); \
+ TO = FROM; \
+ checkflags (NUM, EXCEPT); \
+}
diff --git a/gcc/testsuite/gcc.dg/dfp/fe-convert-1.c b/gcc/testsuite/gcc.dg/dfp/fe-convert-1.c
new file mode 100644
index 00000000000..b308546effe
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dfp/fe-convert-1.c
@@ -0,0 +1,42 @@
+/* { dg-options "-std=gnu99" } */
+
+/* Check that appropriate exceptions are raised for conversions involving
+ decimal float values. */
+
+#include "fe-check.h"
+
+volatile _Decimal32 d32;
+volatile _Decimal64 d64;
+volatile _Decimal128 d128;
+
+/* Conversions between decimal float types should raise an invalid
+ exception if the values doesn't fit, either because the value
+ is too large or the result can't hold the full precision. */
+
+CONVERT (100, d64, d32, 9.999999e96DD, 0)
+CONVERT (101, d64, d32, 10.000000e96DD, FE_INEXACT)
+CONVERT (102, d64, d32, 1.1111111DD, FE_INEXACT)
+CONVERT (110, d128, d32, 9.999999e96DL, 0)
+CONVERT (111, d128, d32, 10.000000e96DL, FE_INEXACT)
+CONVERT (112, d128, d32, 1.1111111DL, FE_INEXACT)
+CONVERT (120, d128, d64, 9.999999999999999E384DL, 0)
+CONVERT (121, d128, d64, 10.00000000000000E384DL, FE_INEXACT)
+CONVERT (122, d128, d64, 1.1111111111111111DL, FE_INEXACT)
+
+int
+main ()
+{
+ convert_100 ();
+ convert_101 ();
+ convert_102 ();
+ convert_110 ();
+ convert_111 ();
+ convert_112 ();
+ convert_120 ();
+ convert_121 ();
+ convert_122 ();
+
+ if (failcnt != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/dfp/fe-convert-2.c b/gcc/testsuite/gcc.dg/dfp/fe-convert-2.c
new file mode 100644
index 00000000000..ca55023a579
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dfp/fe-convert-2.c
@@ -0,0 +1,34 @@
+/* { dg-options "-std=gnu99" } */
+
+/* Check that appropriate exceptions are raised for BFP to DFP conversions.
+ The test only uses double and _Decimal32; tests for conversions to
+ _Decimal64 would need 128-bit long double. */
+
+#include "fe-check.h"
+
+volatile _Decimal32 d32;
+volatile double d;
+
+CONVERT (100, d, d32, 1.0e96, 0)
+CONVERT (101, d, d32, 1.0e97, FE_OVERFLOW|FE_INEXACT)
+CONVERT (102, d, d32, -1.0e96, 0)
+CONVERT (103, d, d32, -1.0e97, FE_OVERFLOW|FE_INEXACT)
+
+#if 0
+/* These should result in fp exceptions but don't. */
+CONVERT (xxx, d, d32, 1.0e-96, FE_UNDERFLOW|FE_INEXACT)
+CONVERT (xxx, d, d32, 0.00048828125, FE_INEXACT) /* exact power of 2 */
+#endif
+
+int
+main ()
+{
+ convert_100 ();
+ convert_101 ();
+ convert_102 ();
+ convert_103 ();
+
+ if (failcnt != 0)
+ abort ();
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/dfp/fe-convert-3.c b/gcc/testsuite/gcc.dg/dfp/fe-convert-3.c
new file mode 100644
index 00000000000..e3fe30eeb11
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dfp/fe-convert-3.c
@@ -0,0 +1,49 @@
+/* { dg-options "-std=gnu99" } */
+
+/* Check that appropriate exceptions are raised for int to DFP conversions. */
+
+#include "fe-check.h"
+
+volatile _Decimal32 d32;
+volatile _Decimal64 d64;
+volatile signed int si;
+volatile unsigned int ui;
+volatile signed long long sll;
+volatile unsigned long long ull;
+
+CONVERT (100, si, d32, 9999999, 0)
+CONVERT (101, si, d32, 11111111, FE_INEXACT)
+CONVERT (102, si, d32, -9999999, 0)
+CONVERT (103, si, d32, -10000001, FE_INEXACT)
+CONVERT (110, ui, d32, 9999999, 0)
+CONVERT (111, ui, d32, 10000001, FE_INEXACT)
+CONVERT (200, sll, d64, 9999999999999999, 0)
+CONVERT (201, sll, d64, 10000000000000001, FE_INEXACT)
+CONVERT (202, sll, d64, -9999999999999999, 0)
+CONVERT (203, sll, d64, -10000000000000001, FE_INEXACT)
+CONVERT (210, ull, d64, 9999999999999999, 0)
+CONVERT (211, ull, d64, 10000000000000001, FE_INEXACT)
+
+int
+main ()
+{
+ if (sizeof (long long) != 16)
+ return 0;
+
+ convert_100 ();
+ convert_101 ();
+ convert_102 ();
+ convert_103 ();
+ convert_110 ();
+ convert_111 ();
+ convert_200 ();
+ convert_201 ();
+ convert_202 ();
+ convert_203 ();
+ convert_210 ();
+ convert_211 ();
+
+ if (failcnt != 0)
+ abort ();
+ return 0;
+}
diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog
index 0994aee40e7..3579b7c610b 100644
--- a/libdecnumber/ChangeLog
+++ b/libdecnumber/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-29 Janis Johnson <janis187@us.ibm.com>
+
+ * decExcept.c: New.
+ * decExcept.h: New.
+
2006-11-29 Janis Johnson <janis187@us.ibm.com>
* decRound.c: Move declarations to new file, update comments.
diff --git a/libdecnumber/decExcept.c b/libdecnumber/decExcept.c
new file mode 100644
index 00000000000..68217024206
--- /dev/null
+++ b/libdecnumber/decExcept.c
@@ -0,0 +1,59 @@
+/* Temporary library support for decimal floating point.
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ In addition to the permissions in the GNU General Public License, the
+ Free Software Foundation gives you unlimited permission to link the
+ compiled version of this file into combinations with other programs,
+ and to distribute those combinations without any restriction coming
+ from the use of this file. (The General Public License restrictions
+ do apply in other respects; for example, they cover modification of
+ the file, and distribution when not linked into a combine
+ executable.)
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING. If not, write to the Free
+ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#include <fenv.h>
+#include "config.h"
+#include "decContext.h"
+#include "decExcept.h"
+
+/* Internal, non-documented functions for testing libgcc functions.
+ This support is not sufficient for real use. */
+
+static int __dfp_except_flags = 0;
+
+/* Clear the dummy exception flags. */
+void
+__dfp_clear_except (void)
+{
+ __dfp_except_flags = 0;
+}
+
+/* Return the dummy exception flags corresponding to the mask. */
+int
+__dfp_test_except (int mask)
+{
+ return __dfp_except_flags & mask;
+}
+
+/* Set dummy exception flags. */
+void
+__dfp_raise_except (int flags)
+{
+ __dfp_except_flags |= flags;
+}
diff --git a/libdecnumber/decExcept.h b/libdecnumber/decExcept.h
new file mode 100644
index 00000000000..12ba87d01fb
--- /dev/null
+++ b/libdecnumber/decExcept.h
@@ -0,0 +1,39 @@
+/* Temporary library support for decimal floating point.
+ Copyright (C) 2006 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ In addition to the permissions in the GNU General Public License, the
+ Free Software Foundation gives you unlimited permission to link the
+ compiled version of this file into combinations with other programs,
+ and to distribute those combinations without any restriction coming
+ from the use of this file. (The General Public License restrictions
+ do apply in other respects; for example, they cover modification of
+ the file, and distribution when not linked into a combine
+ executable.)
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING. If not, write to the Free
+ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA. */
+
+#include <fenv.h>
+#include "config.h"
+#include "decContext.h"
+
+#define DFP_EXCEPTIONS_ENABLED 1
+#define DFP_HANDLE_EXCEPTIONS(A) __dfp_raise_except(A)
+
+void __dfp_clear_except (void);
+int __dfp_test_except (int);
+void __dfp_raise_except (int);
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index a92bf3998cc..7023d8048a6 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,7 @@
+2007-01-29 Janis Johnson <janis187@us.ibm.com>
+
+ * Makefile.in (dec-filenames): Add decExcept.
+
2007-01-28 Daniel Jacobowitz <dan@codesourcery.com>
PR bootstrap/30469
diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in
index a911ef8f2bc..cb91cdaf756 100644
--- a/libgcc/Makefile.in
+++ b/libgcc/Makefile.in
@@ -464,7 +464,7 @@ endif
dec-filenames =
ifneq ($(D32PBIT)$(D64PBIT)$(D128PBIT),)
-dec-filenames += decContext decNumber decRound decLibrary decUtility
+dec-filenames += decContext decNumber decExcept decRound decLibrary decUtility
endif
ifneq ($(D32PBIT),)