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 );
}
Ejemplo n.º 2
0
    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 );
}