Ejemplo n.º 1
0
bool GroupElemJac::IsValid() const {
    if (IsInfinity())
        return false;
    // y^2 = x^3 + 7
    // (Y/Z^3)^2 = (X/Z^2)^3 + 7
    // Y^2 / Z^6 = X^3 / Z^6 + 7
    // Y^2 = X^3 + 7*Z^6
    FieldElem y2; y2.SetSquare(y);
    FieldElem x3; x3.SetSquare(x); x3.SetMult(x3,x);
    FieldElem z2; z2.SetSquare(z);
    FieldElem z6; z6.SetSquare(z2); z6.SetMult(z6,z2);
    z6 *= 7;
    x3 += z6;
    y2.Normalize();
    x3.Normalize();
    return y2 == x3;
}
Ejemplo n.º 2
0
	static bool IsInfinity(FloatConstant* value) {
		return IsInfinity(value->Value(), value->GetType()->GetSubtype());
	}
Ejemplo n.º 3
0
static void OutputConstantUnion(TInfoSink& out, const TIntermTyped* node, const TConstUnionArray& constUnion, int depth)
{
    int size = node->getType().computeNumComponents();

    for (int i = 0; i < size; i++) {
        OutputTreeText(out, node, depth);
        switch (constUnion[i].getType()) {
        case EbtBool:
            if (constUnion[i].getBConst())
                out.debug << "true";
            else
                out.debug << "false";

            out.debug << " (" << "const bool" << ")";

            out.debug << "\n";
            break;
        case EbtFloat:
        case EbtDouble:
#ifdef AMD_EXTENSIONS
        case EbtFloat16:
#endif
            {
                const double value = constUnion[i].getDConst();
                // Print infinities and NaNs in a portable way.
                if (IsInfinity(value)) {
                    if (value < 0)
                        out.debug << "-1.#INF\n";
                    else
                        out.debug << "+1.#INF\n";
                } else if (IsNan(value))
                    out.debug << "1.#IND\n";
                else {
                    const int maxSize = 300;
                    char buf[maxSize];
                    snprintf(buf, maxSize, "%f", value);

                    out.debug << buf << "\n";
                }
            }
            break;
        case EbtInt:
            {
                const int maxSize = 300;
                char buf[maxSize];
                snprintf(buf, maxSize, "%d (%s)", constUnion[i].getIConst(), "const int");

                out.debug << buf << "\n";
            }
            break;
        case EbtUint:
            {
                const int maxSize = 300;
                char buf[maxSize];
                snprintf(buf, maxSize, "%u (%s)", constUnion[i].getUConst(), "const uint");

                out.debug << buf << "\n";
            }
            break;
        case EbtInt64:
            {
                const int maxSize = 300;
                char buf[maxSize];
                snprintf(buf, maxSize, "%lld (%s)", constUnion[i].getI64Const(), "const int64_t");

                out.debug << buf << "\n";
            }
            break;
        case EbtUint64:
            {
                const int maxSize = 300;
                char buf[maxSize];
                snprintf(buf, maxSize, "%llu (%s)", constUnion[i].getU64Const(), "const uint64_t");

                out.debug << buf << "\n";
            }
            break;
        default:
            out.info.message(EPrefixInternalError, "Unknown constant", node->getLoc());
            break;
        }
    }
}