* fp.cxx (fp::integer (long long&, round_mode_t)): New method.
(fp::integer (unsigned long long&, round_mode_t)): New method.
* fp.h: Likewise.
* cgen-fpu.cxx (unorderedsf): New method.
(adddf, subdf, muldf, divdf, negdf, absdf, sqrtdf): Implemented.
(eqdf, ltdf, ledf, gtdf, gedf, gedf): Implemented.
(unordereddf): New method.
(unordereddf, fextsfdf): Implemented.
(floatdisf, fixsfsi, fixsfdi, floatsidf, floatdidf, fixdfsi)
(fixdfdi): Implemented.
* cgen-fpu.h: Likewise.
2006-05-10 Dave Brolley <brolley@redhat.com>
+ * fp.cxx (fp::integer (long long&, round_mode_t)): New method.
+ (fp::integer (unsigned long long&, round_mode_t)): New method.
+ * fp.h: Likewise.
+ * cgen-fpu.cxx (unorderedsf): New method.
+ (adddf, subdf, muldf, divdf, negdf, absdf, sqrtdf): Implemented.
+ (eqdf, ltdf, ledf, gtdf, gedf, gedf): Implemented.
+ (unordereddf): New method.
+ (unordereddf, fextsfdf): Implemented.
+ (floatdisf, fixsfsi, fixsfdi, floatsidf, floatdidf, fixdfsi)
+ (fixdfdi): Implemented.
+ * cgen-fpu.h: Likewise.
* cgen-cpu.h (trace_counter): Now virtual.
(SETMEMBI): Write to data memory
(class cgen_bi_endian_cpu, class cgen_bi_endian_cpu)
return fp (x) >= fp (y);
}
-#if 0
+int cgen_fp_ops::unorderedsf (cgen_fpu*, SF x, SF y)
+{
+ fp f1(x);
+ fp f2(y);
+ return f1.is_nan () || f2.is_nan ();
+}
+
/* basic DF ops */
-DF cgen_fp_ops::adddf (cgen_fpu*, DF, DF);
-DF cgen_fp_ops::subdf (cgen_fpu*, DF, DF);
-DF cgen_fp_ops::muldf (cgen_fpu*, DF, DF);
-DF cgen_fp_ops::divdf (cgen_fpu*, DF, DF);
-DF cgen_fp_ops::negdf (cgen_fpu*, DF);
-DF cgen_fp_ops::absdf (cgen_fpu*, DF);
-DF cgen_fp_ops::sqrtdf (cgen_fpu*, DF);
+DF cgen_fp_ops::adddf (cgen_fpu *fpu, DF x, DF y)
+{
+ fp r = fp (x) + fp (y);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+DF cgen_fp_ops::subdf (cgen_fpu *fpu, DF x, DF y)
+{
+ fp r = fp (x) - fp (y);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+DF cgen_fp_ops::muldf (cgen_fpu *fpu, DF x, DF y)
+{
+ fp r = fp (x) * fp (y);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+DF cgen_fp_ops::divdf (cgen_fpu *fpu, DF x, DF y)
+{
+ fp r = fp (x) / fp (y);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+DF cgen_fp_ops::negdf (cgen_fpu *fpu, DF x)
+{
+ fp r (x);
+ r = fp::neg (r);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+DF cgen_fp_ops::absdf (cgen_fpu *fpu, DF x)
+{
+ fp r (x);
+ r = fp::abs (r);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+DF cgen_fp_ops::sqrtdf (cgen_fpu *fpu, DF x)
+{
+ fp r (x);
+ r = fp::sqrt (r);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+#if 0
DF cgen_fp_ops::invdf (cgen_fpu*, DF);
DF cgen_fp_ops::cosdf (cgen_fpu*, DF);
DF cgen_fp_ops::sindf (cgen_fpu*, DF);
DF cgen_fp_ops::mindf (cgen_fpu*, DF, DF);
DF cgen_fp_ops::maxdf (cgen_fpu*, DF, DF);
+#endif
+
+int cgen_fp_ops::eqdf (cgen_fpu *fpu, DF x, DF y)
+{
+ return fp (x) == fp (y);
+}
+
+int cgen_fp_ops::nedf (cgen_fpu *fpu, DF x, DF y)
+{
+ return fp (x) == fp (y);
+}
+int cgen_fp_ops::ltdf (cgen_fpu *fpu, DF x, DF y)
+{
+ return fp (x) < fp (y);
+}
+int cgen_fp_ops::ledf (cgen_fpu *fpu, DF x, DF y)
+{
+ return fp (x) <= fp (y);
+}
+int cgen_fp_ops::gtdf (cgen_fpu *fpu, DF x, DF y)
+{
+ return fp (x) > fp (y);
+}
+int cgen_fp_ops::gedf (cgen_fpu *fpu, DF x, DF y)
+{
+ return fp (x) >= fp (y);
+}
+
+int cgen_fp_ops::unordereddf (cgen_fpu *fpu, DF x, DF y)
+{
+ fp f1(x);
+ fp f2(y);
+ return f1.is_nan () || f2.is_nan ();
+}
-int cgen_fp_ops::eqdf (cgen_fpu*, DF, DF);
-int cgen_fp_ops::nedf (cgen_fpu*, DF, DF);
-int cgen_fp_ops::ltdf (cgen_fpu*, DF, DF);
-int cgen_fp_ops::ledf (cgen_fpu*, DF, DF);
-int cgen_fp_ops::gtdf (cgen_fpu*, DF, DF);
-int cgen_fp_ops::gedf (cgen_fpu*, DF, DF);
+/* SF/DF conversion ops */
+DF cgen_fp_ops::fextsfdf (cgen_fpu *fpu, SF x)
+{
+ fp r (x);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
- /* SF/DF conversion ops */
-DF cgen_fp_ops::fextsfdf (cgen_fpu*, SF);
-SF cgen_fp_ops::ftruncdfsf (cgen_fpu*, DF);
+SF cgen_fp_ops::ftruncdfsf (cgen_fpu *fpu, DF x)
+{
+ fp r (x);
+ SF tmp;
+ r.pack (tmp);
+ return tmp;
+}
-#endif // not implemented yet
SF cgen_fp_ops::floatsisf (cgen_fpu* fpu, SI x)
{
fp r = fp::from_int (x);
r.pack (tmp);
return tmp;
}
+
+SF cgen_fp_ops::floatdisf (cgen_fpu *fpu, DI x)
+{
+ fp r = fp::from_int (x);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
#if 0 // not implemented yet
-SF cgen_fp_ops::floatdisf (cgen_fpu*, DI);
SF cgen_fp_ops::ufloatsisf (cgen_fpu*, USI);
SF cgen_fp_ops::ufloatdisf (cgen_fpu*, UDI);
#endif // not implemented yet
-SI cgen_fp_ops::fixsfsi (cgen_fpu*, SF x)
+SI cgen_fp_ops::fixsfsi (cgen_fpu *fpu, SF x)
+{
+ fp r (x);
+ SI tmp;
+ r.integer (tmp, fp::round_default);
+ return tmp;
+}
+
+DI cgen_fp_ops::fixsfdi (cgen_fpu *fpu, SF x)
{
fp r (x);
- unsigned int tmp;
+ DI tmp;
r.integer (tmp, fp::round_default);
return tmp;
}
+
#if 0 // not implemented yet
-DI cgen_fp_ops::fixsfdi (cgen_fpu*, SF);
USI cgen_fp_ops::ufixsfsi (cgen_fpu*, SF)
UDI cgen_fp_ops::ufixsfdi (cgen_fpu*, SF);
+#endif
+DF cgen_fp_ops::floatsidf (cgen_fpu *fpu, SI x)
+{
+ fp r = fp::from_int (x);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
+
+DF cgen_fp_ops::floatdidf (cgen_fpu *fpu, DI x)
+{
+ fp r = fp::from_int (x);
+ check_result (fpu, r);
+ DF tmp;
+ r.pack (tmp);
+ return tmp;
+}
-DF cgen_fp_ops::floatsidf (cgen_fpu*, SI);
-DF cgen_fp_ops::floatdidf (cgen_fpu*, DI);
+#if 0
DF cgen_fp_ops::ufloatsidf (cgen_fpu*, USI);
DF cgen_fp_ops::ufloatdidf (cgen_fpu*, UDI);
+#endif
+SI cgen_fp_ops::fixdfsi (cgen_fpu *fpu, DF x)
+{
+ fp r (x);
+ SI tmp;
+ r.integer (tmp, fp::round_default);
+ return tmp;
+}
+
+DI cgen_fp_ops::fixdfdi (cgen_fpu *fpu, DF x)
+{
+ fp r (x);
+ DI tmp;
+ r.integer (tmp, fp::round_default);
+ return tmp;
+}
-SI cgen_fp_ops::fixdfsi (cgen_fpu*, DF);
-DI cgen_fp_ops::fixdfdi (cgen_fpu*, DF);
+#if 0
USI cgen_fp_ops::ufixdfsi (cgen_fpu*, DF);
UDI cgen_fp_ops::ufixdfdi (cgen_fpu*, DF);
virtual int lesf (cgen_fpu*, SF, SF);
virtual int gtsf (cgen_fpu*, SF, SF);
virtual int gesf (cgen_fpu*, SF, SF);
+ virtual int unorderedsf (cgen_fpu*, SF, SF);
-#if 0
/* basic DF ops */
virtual DF adddf (cgen_fpu*, DF, DF);
virtual DF subdf (cgen_fpu*, DF, DF);
virtual DF negdf (cgen_fpu*, DF);
virtual DF absdf (cgen_fpu*, DF);
virtual DF sqrtdf (cgen_fpu*, DF);
+#if 0
virtual DF invdf (cgen_fpu*, DF);
virtual DF cosdf (cgen_fpu*, DF);
virtual DF sindf (cgen_fpu*, DF);
virtual DF mindf (cgen_fpu*, DF, DF);
virtual DF maxdf (cgen_fpu*, DF, DF);
-
+#endif
virtual int eqdf (cgen_fpu*, DF, DF);
virtual int nedf (cgen_fpu*, DF, DF);
virtual int ltdf (cgen_fpu*, DF, DF);
virtual int ledf (cgen_fpu*, DF, DF);
virtual int gtdf (cgen_fpu*, DF, DF);
virtual int gedf (cgen_fpu*, DF, DF);
+ virtual int unordereddf (cgen_fpu*, DF, DF);
/* SF/DF conversion ops */
virtual DF fextsfdf (cgen_fpu*, SF);
virtual SF ftruncdfsf (cgen_fpu*, DF);
-#endif // not implemented yet
virtual SF floatsisf (cgen_fpu*, SI);
-#if 0 // not implemented yet
virtual SF floatdisf (cgen_fpu*, DI);
+#if 0 // not implemented yet
virtual SF ufloatsisf (cgen_fpu*, USI);
virtual SF ufloatdisf (cgen_fpu*, UDI);
#endif // not implemented yet
virtual SI fixsfsi (cgen_fpu*, SF);
-#if 0 // not implemented yet
virtual DI fixsfdi (cgen_fpu*, SF);
+#if 0 // not implemented yet
virtual USI ufixsfsi (cgen_fpu*, SF);
virtual UDI ufixsfdi (cgen_fpu*, SF);
-
+#endif
virtual DF floatsidf (cgen_fpu*, SI);
virtual DF floatdidf (cgen_fpu*, DI);
+#if 0
virtual DF ufloatsidf (cgen_fpu*, USI);
virtual DF ufloatdidf (cgen_fpu*, UDI);
-
+#endif
virtual SI fixdfsi (cgen_fpu*, DF);
virtual DI fixdfdi (cgen_fpu*, DF);
+#if 0
virtual USI ufixdfsi (cgen_fpu*, DF);
virtual UDI ufixdfdi (cgen_fpu*, DF);
// fp.cxx - Floating point number class implementation. -*- C++ -*-
-// Copyright 1997, 1998, 2002, 2005 Free Software Foundation, Inc.
+// Copyright 1997, 1998, 2002, 2005, 2006 Free Software Foundation, Inc.
// Copyright 2002 Red Hat, Inc.
// This file is part of SID.
}
void
+ fp::integer (long long& i, round_mode_t mode)
+ {
+ fp_to_int (i, mode);
+ }
+
+ void
fp::integer (unsigned int& i, round_mode_t mode)
{
fp_to_int (i, mode);
fp_to_int (i, mode);
}
+ void
+ fp::integer (unsigned long long& i, round_mode_t mode)
+ {
+ fp_to_int (i, mode);
+ }
+
std::ostream& operator<< (std::ostream& out, const fp& f)
{
out << ((f.sign) ? "-" : "+");
// fp.h - Floating point number class using host integer ops. -*- C++ -*-
-// Copyright 1997, 1998, 2002, 2005 Free Software Foundation, Inc.
+// Copyright 1997, 1998, 2002, 2005, 2006 Free Software Foundation, Inc.
// Copyright 2002 Red Hat, Inc.
// This file is part of SID.
// Conversions to integers.
virtual void integer (int&, round_mode_t = round_default);
virtual void integer (long&, round_mode_t = round_default);
+ virtual void integer (long long&, round_mode_t = round_default);
virtual void integer (unsigned int&, round_mode_t = round_default);
virtual void integer (unsigned long&, round_mode_t = round_default);
+ virtual void integer (unsigned long long&, round_mode_t = round_default);
// Pack an fp into registers of various sizes.
void pack (cgen::SF&) const;