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; } }
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; } }