This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Reduce memory usage of sreal


Hi,
this patch reduces memory use of sreal by converting m_sig from int64_t to
int32_t.  This requires me to reduce SREAL_PART_BITS from 32 to 31 so there is
space for sign. There is comment "SREAL_PART_BITS has to be an even number."
but I found no reason for that comment. It is possible that I missed something
obvious but I read the normalization and operations and didn't noticed anything
that would rely on this.

Of course we need 2*SREAL_PART_BITS for temporary calcuations so perhaps at
some time SREAL_PART_BITS meant that.

There is some effect on code of tramp3d but manual inspection of dumps did not
show anything important, just small differences in roundoff errors.

Bootstrapped/regtested x86_64-linux, OK?

Honza

	* sreal.h (SREAL_PART_BITS): Change to 31; remove seemingly unnecessary
	comment that it has to be even number.
	(class sreal): Change m_sig type to int32_t.
	* sreal.c (sreal::dump, sreal::to_int, opreator+, operator-): Use
	int64_t for temporary calculations.
	(sreal_verify_basics): Drop one bit from minimum and maximum.
Index: sreal.h
===================================================================
--- sreal.h	(revision 263952)
+++ sreal.h	(working copy)
@@ -20,8 +20,7 @@ along with GCC; see the file COPYING3.
 #ifndef GCC_SREAL_H
 #define GCC_SREAL_H
 
-/* SREAL_PART_BITS has to be an even number.  */
-#define SREAL_PART_BITS 32
+#define SREAL_PART_BITS 31
 
 #define UINT64_BITS	64
 
@@ -137,7 +136,7 @@ private:
   static sreal signedless_plus (const sreal &a, const sreal &b, bool negative);
   static sreal signedless_minus (const sreal &a, const sreal &b, bool negative);
 
-  int64_t m_sig;			/* Significant.  */
+  int32_t m_sig;			/* Significant.  */
   signed int m_exp;			/* Exponent.  */
 };
 
Index: sreal.c
===================================================================
--- sreal.c	(revision 263952)
+++ sreal.c	(working copy)
@@ -64,7 +64,7 @@ along with GCC; see the file COPYING3.
 void
 sreal::dump (FILE *file) const
 {
-  fprintf (file, "(%" PRIi64 " * 2^%d)", m_sig, m_exp);
+  fprintf (file, "(%" PRIi64 " * 2^%d)", (int64_t)m_sig, m_exp);
 }
 
 DEBUG_FUNCTION void
@@ -114,7 +114,7 @@ sreal::to_int () const
   if (m_exp >= SREAL_PART_BITS)
     return sign * INTTYPE_MAXIMUM (int64_t);
   if (m_exp > 0)
-    return sign * (SREAL_ABS (m_sig) << m_exp);
+    return sign * (SREAL_ABS ((int64_t)m_sig) << m_exp);
   if (m_exp < 0)
     return m_sig >> -m_exp;
   return m_sig;
@@ -167,7 +167,7 @@ sreal::operator+ (const sreal &other) co
       bb = &tmp;
     }
 
-  r_sig = a_p->m_sig + bb->m_sig;
+  r_sig = a_p->m_sig + (int64_t)bb->m_sig;
   sreal r (r_sig, r_exp);
   return r;
 }
@@ -211,7 +211,7 @@ sreal::operator- (const sreal &other) co
       bb = &tmp;
     }
 
-  r_sig = sign * ((int64_t) a_p->m_sig - bb->m_sig);
+  r_sig = sign * ((int64_t) a_p->m_sig - (int64_t)bb->m_sig);
   sreal r (r_sig, r_exp);
   return r;
 }
@@ -277,15 +277,15 @@ namespace selftest {
 static void
 sreal_verify_basics (void)
 {
-  sreal minimum = INT_MIN;
-  sreal maximum = INT_MAX;
+  sreal minimum = INT_MIN/2;
+  sreal maximum = INT_MAX/2;
 
   sreal seven = 7;
   sreal minus_two = -2;
   sreal minus_nine = -9;
 
-  ASSERT_EQ (INT_MIN, minimum.to_int ());
-  ASSERT_EQ (INT_MAX, maximum.to_int ());
+  ASSERT_EQ (INT_MIN/2, minimum.to_int ());
+  ASSERT_EQ (INT_MAX/2, maximum.to_int ());
 
   ASSERT_FALSE (minus_two < minus_two);
   ASSERT_FALSE (seven < seven);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]