divmovti4.c (union qword_UTItype): New data type.
authorUlrich Weigand <uweigand@de.ibm.com>
Wed, 27 Apr 2011 13:10:17 +0000 (13:10 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Wed, 27 Apr 2011 13:10:17 +0000 (13:10 +0000)
* config/spu/divmovti4.c (union qword_UTItype): New data type.
(si_from_UTItype, si_to_UTItype): New functions.
(__udivmodti4): Use them to implement type-punning.
* config/spu/multi3.c (union qword_TItype): New data type.
(si_from_TItype, si_to_TItype): New functions.
(__multi3): Use them to implement type-punning.

From-SVN: r173029

gcc/ChangeLog
gcc/config/spu/divmodti4.c
gcc/config/spu/multi3.c

index db5ecd013040675f994125944058cf9db25d9687..f2b75b07e91df90e7a098fc9889de47cf8e94643 100644 (file)
@@ -1,3 +1,12 @@
+2011-04-27  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * config/spu/divmovti4.c (union qword_UTItype): New data type.
+       (si_from_UTItype, si_to_UTItype): New functions.
+       (__udivmodti4): Use them to implement type-punning.
+       * config/spu/multi3.c (union qword_TItype): New data type.
+       (si_from_TItype, si_to_TItype): New functions.
+       (__multi3): Use them to implement type-punning.
+
 2011-04-27  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        * config/spu/spu.c (spu_expand_epilogue): Do not emit barrier.
index 8f70616bcb79f4e6c7737b784ff1c8052614c679..57c975c6b3c5aab2ad730d0a46d9ea583ea36089 100644 (file)
@@ -29,6 +29,28 @@ UTItype __udivti3 (UTItype u, UTItype v);
 UTItype __umodti3 (UTItype u, UTItype v);
 UTItype __udivmodti4 (UTItype u, UTItype v, UTItype *w);
 
+union qword_UTItype
+  {
+    qword q;
+    UTItype t;
+  };
+  
+inline static qword
+si_from_UTItype (UTItype t)
+{ 
+  union qword_UTItype u;
+  u.t = t;
+  return u.q;
+}
+
+inline static UTItype
+si_to_UTItype (qword q)
+{ 
+  union qword_UTItype u;
+  u.q = q;
+  return u.t;
+}
+
 inline static unsigned int
 count_leading_zeros (UTItype x)
 {
@@ -67,8 +89,8 @@ __udivmodti4 (UTItype num, UTItype den, UTItype * rp)
 {
   qword shift =
     si_from_uint (count_leading_zeros (den) - count_leading_zeros (num));
-  qword n0 = *(qword *) & num;
-  qword d0 = *(qword *) & den;
+  qword n0 = si_from_UTItype (num);
+  qword d0 = si_from_UTItype (den);
   qword bit = si_andi (si_fsmbi (1), 1);
   qword r0 = si_il (0);
   qword m1 = si_fsmbi (0x000f);
@@ -101,8 +123,8 @@ __udivmodti4 (UTItype num, UTItype den, UTItype * rp)
     }
   while (si_to_uint (si_orx (bit)));
   if (rp)
-    *rp = *(UTItype *) & n0;
-  return *(UTItype *) & r0;
+    *rp = si_to_UTItype (n0);
+  return si_to_UTItype (r0);
 }
 
 UTItype
index e7d76802decd723c289ee93025d9a975725166c5..b8b0e90ee252ac4658b00433eca70eef19cc4fac 100644 (file)
 
 typedef int TItype __attribute__ ((mode (TI)));
 
+union qword_TItype
+  {
+    qword q;
+    TItype t;
+  };
+  
+inline static qword
+si_from_TItype (TItype t)
+{ 
+  union qword_TItype u;
+  u.t = t;
+  return u.q;
+}
+
+inline static TItype
+si_to_TItype (qword q)
+{ 
+  union qword_TItype u;
+  u.q = q;
+  return u.t;
+}
+
 /* A straight forward vectorization and unrolling of
  *   short l[8], r[8];
  *   TItype total = 0;
@@ -33,8 +55,8 @@ typedef int TItype __attribute__ ((mode (TI)));
 TItype
 __multi3 (TItype l, TItype r)
 {
-  qword u = *(qword *) & l;
-  qword v = *(qword *) & r;
+  qword u = si_from_TItype (l);
+  qword v = si_from_TItype (r);
   qword splat0 = si_shufb (v, v, si_ilh (0x0001));
   qword splat1 = si_shufb (v, v, si_ilh (0x0203));
   qword splat2 = si_shufb (v, v, si_ilh (0x0405));
@@ -93,5 +115,5 @@ __multi3 (TItype l, TItype r)
   total = si_cgx (total10, carry, total);
   total = si_shlqbyi (total, 4);
   total = si_addx (total10, carry, total);
-  return *(TItype *) & total;
+  return si_to_TItype (total);
 }