Exemplo n.º 1
0
static void __stdcall
comb_mask_1_simd(uint8_t* dstp, const uint8_t* srcp, const int dpitch,
                 const int spitch, const int cthresh, const int width,
                 const int height) noexcept
{
    const uint8_t* sc = srcp;
    const uint8_t* sb = sc + spitch;
    const uint8_t* sd = sc + spitch;

    const V cth = set1_i16<V>(static_cast<int16_t>(cthresh));
    const V all = cmpeq_i8(cth, cth);

    constexpr int step = sizeof(V) / 2;

    for (int y = 0; y < height; ++y) {
        for (int x = 0; x < width; x += step) {
            V xb = load_half<V>(sb + x);
            V xc = load_half<V>(sc + x);
            V xd = load_half<V>(sd + x);
            xb = sub_i16(xb, xc);
            xd = sub_i16(xd, xc);
            xc = andnot(mulhi(xb, xd), mullo(xb, xd));
            xc = cmpgt_u16(xc, cth, all);
            store_half(dstp + x, xc);
        }
        sb = sc;
        sc = sd;
        sd += (y < height - 2) ? spitch : -spitch;
        dstp += dpitch;
    }
}
Exemplo n.º 2
0
static bool operation(const ExpressionParser::Token::Type type, const T op1, const T op2, T & result, const bool signedcalc)
{
    result = 0;
    switch(type)
    {
    case ExpressionParser::Token::Type::OperatorUnarySub:
        result = op1 * ~0;
        return true;
    case ExpressionParser::Token::Type::OperatorNot:
        result = ~op1;
        return true;
    case ExpressionParser::Token::Type::OperatorMul:
        result = op1 * op2;
        return true;
    case ExpressionParser::Token::Type::OperatorHiMul:
        if(signedcalc)
            result = mulhi(op1, op2);
        else
            result = umulhi(op1, op2);
        return true;
    case ExpressionParser::Token::Type::OperatorDiv:
        if(op2 != 0)
        {
            result = op1 / op2;
            return true;
        }
        return false;
    case ExpressionParser::Token::Type::OperatorMod:
        if(op2 != 0)
        {
            result = op1 % op2;
            return true;
        }
        return false;
    case ExpressionParser::Token::Type::OperatorAdd:
        result = op1 + op2;
        return true;
    case ExpressionParser::Token::Type::OperatorSub:
        result = op1 - op2;
        return true;
    case ExpressionParser::Token::Type::OperatorShl:
        result = op1 << op2;
        return true;
    case ExpressionParser::Token::Type::OperatorShr:
        result = op1 >> op2;
        return true;
    case ExpressionParser::Token::Type::OperatorAnd:
        result = op1 & op2;
        return true;
    case ExpressionParser::Token::Type::OperatorXor:
        result = op1 ^ op2;
        return true;
    case ExpressionParser::Token::Type::OperatorOr:
        result = op1 | op2;
        return true;
    default:
        return false;
    }
}