inline TYPE VECTOR_CMOV( TYPE a, TYPE b, TYPE c, TYPE d){ TYPE z = VECTOR_EQUAL ( a, b ); // return _mm_blendv_epi8( d, c, z ); TYPE g = VECTOR_AND ( c, z ); TYPE h = VECTOR_ANDNOT( z, d ); return VECTOR_OR ( g, h ); }
VECTOR a = (r1*r1 - r2*r2 + d*d) / (d + d); VECTOR v = r1*r1 - a*a; VECTOR h = VECTOR_SQRT(v); VECTOR dx = (p2x - p1x) / d; VECTOR dy = (p2y - p1y) / d; VECTOR p3x = p1x + a * dx; VECTOR p3y = p1y + a * dy; dx *= h; dy *= h; VECTOR p4x = p3x + dy; VECTOR p4y = p3y - dx; VECTOR two_sol = VECTOR_OR(VECTOR_NE(p3x, p4x), VECTOR_NE(p3y, p4y)); retx[0] = p4x; rety[0] = p4y; p4x = p3x - dy; p4y = p3y + dx; retx[1] = p4x; rety[1] = p4y; static const VECTOR ones = VECTOR_CONST_BROADCAST(1.0f); VECTOR result = VECTOR_AND(ones, one_sol) + VECTOR_AND(ones, two_sol); return result; }
// // ON INVERSE LE SIGNE DE LA DONNEE EN FONCTION DU SIGNE // inline TYPE VECTOR_invSIGN2( TYPE a, TYPE z){ TYPE g = VECTOR_AND ( a, z ); TYPE h = VECTOR_ANDNOT( VECTOR_NEG(a), z ); return VECTOR_OR ( g, h ); }