OSDN Git Service

2006-05-10 Dave Brolley <brolley@redhat.com>
authorbrolley <brolley>
Wed, 10 May 2006 21:15:35 +0000 (21:15 +0000)
committerbrolley <brolley>
Wed, 10 May 2006 21:15:35 +0000 (21:15 +0000)
        * 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.

sid/component/cgen-cpu/ChangeLog
sid/component/cgen-cpu/cgen-fpu.cxx
sid/component/cgen-cpu/cgen-fpu.h
sid/component/cgen-cpu/fp.cxx
sid/component/cgen-cpu/fp.h

index 0353816..b416367 100644 (file)
@@ -1,5 +1,16 @@
 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) 
index 1fdf91d..34d11a4 100644 (file)
@@ -114,33 +114,138 @@ int cgen_fp_ops::gesf (cgen_fpu*, SF x, SF y)
   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);
@@ -149,31 +254,80 @@ SF cgen_fp_ops::floatsisf (cgen_fpu* fpu, SI 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);
 
index ca6a6da..16d66f6 100644 (file)
@@ -46,8 +46,8 @@ public:
   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);
@@ -56,44 +56,47 @@ public:
   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);
 
index ed1082a..bec5621 100644 (file)
@@ -1,6 +1,6 @@
 // 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.
 
@@ -754,6 +754,12 @@ namespace sidutil
   }
 
   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);
@@ -765,6 +771,12 @@ namespace sidutil
     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) ? "-" : "+");
index ed3632c..f70f52a 100644 (file)
@@ -1,6 +1,6 @@
 // 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.
 
@@ -259,8 +259,10 @@ namespace sidutil
       // 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;