divmovti4.c (union qword_UTItype): New data type.
* 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
This commit is contained in:
parent
c187d33c80
commit
526ed6c241
@ -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.
|
||||
|
@ -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
|
||||
|
@ -23,6 +23,28 @@
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user