modified ei_predux_min/max to actually use altivec instructions

This commit is contained in:
Konstantinos A. Margaritis 2009-02-12 21:58:44 +00:00
parent 3b12f48aa3
commit ad2bf14dbb

View File

@ -363,38 +363,38 @@ inline int ei_predux_mul(const v4i& a)
inline float ei_predux_min(const v4f& a) inline float ei_predux_min(const v4f& a)
{ {
EIGEN_ALIGN_128 float aux[4]; v4f b, c, res;
ei_pstore(aux, a); b = vec_min(a, vec_sld(a, a, 4));
register float aux0 = aux[0]<aux[1] ? aux[0] : aux[1]; c = vec_min(a, vec_sld(b, b, 4));
register float aux2 = aux[2]<aux[3] ? aux[2] : aux[3]; res = vec_min(a, vec_sld(c, c, 4));
return aux0<aux2 ? aux0 : aux2; return ei_pfirst(res);
} }
inline int ei_predux_min(const v4i& a) inline int ei_predux_min(const v4i& a)
{ {
EIGEN_ALIGN_128 int aux[4]; v4i b, c, res;
ei_pstore(aux, a); b = vec_min(a, vec_sld(a, a, 4));
register int aux0 = aux[0]<aux[1] ? aux[0] : aux[1]; c = vec_min(a, vec_sld(b, b, 4));
register int aux2 = aux[2]<aux[3] ? aux[2] : aux[3]; res = vec_min(a, vec_sld(c, c, 4));
return aux0<aux2 ? aux0 : aux2; return ei_pfirst(res);
} }
inline float ei_predux_max(const v4f& a) inline float ei_predux_max(const v4f& a)
{ {
EIGEN_ALIGN_128 float aux[4]; v4f b, c, res;
ei_pstore(aux, a); b = vec_max(a, vec_sld(a, a, 4));
register float aux0 = aux[0]>aux[1] ? aux[0] : aux[1]; c = vec_max(a, vec_sld(b, b, 4));
register float aux2 = aux[2]>aux[3] ? aux[2] : aux[3]; res = vec_max(a, vec_sld(c, c, 4));
return aux0>aux2 ? aux0 : aux2; return ei_pfirst(res);
} }
inline int ei_predux_max(const v4i& a) inline int ei_predux_max(const v4i& a)
{ {
EIGEN_ALIGN_128 int aux[4]; v4i b, c, res;
ei_pstore(aux, a); b = vec_max(a, vec_sld(a, a, 4));
register int aux0 = aux[0]>aux[1] ? aux[0] : aux[1]; c = vec_max(a, vec_sld(b, b, 4));
register int aux2 = aux[2]>aux[3] ? aux[2] : aux[3]; res = vec_max(a, vec_sld(c, c, 4));
return aux0>aux2 ? aux0 : aux2; return ei_pfirst(res);
} }