Example usage for org.objectweb.asm.commons GeneratorAdapter math

List of usage examples for org.objectweb.asm.commons GeneratorAdapter math

Introduction

In this page you can find the example usage for org.objectweb.asm.commons GeneratorAdapter math.

Prototype

public void math(final int op, final Type type) 

Source Link

Document

Generates the instruction to do the specified mathematical or logical operation.

Usage

From source file:io.datakernel.codegen.ExpressionFor.java

License:Apache License

@Override
public Type load(Context ctx) {
    GeneratorAdapter g = ctx.getGeneratorAdapter();
    Label labelLoop = new Label();
    Label labelExit = new Label();

    VarLocal len = newLocal(ctx, Type.INT_TYPE);
    add(length, start).load(ctx);/*from  w ww. j ava 2 s  .  c  om*/
    len.store(ctx);

    start.load(ctx);
    VarLocal varPosition = newLocal(ctx, Type.INT_TYPE);
    varPosition.store(ctx);

    g.mark(labelLoop);

    varPosition.load(ctx);
    len.load(ctx);

    g.ifCmp(Type.INT_TYPE, GeneratorAdapter.GE, labelExit);

    this.forVar.forVar(varPosition).load(ctx);

    varPosition.load(ctx);
    g.push(1);
    g.math(GeneratorAdapter.ADD, Type.INT_TYPE);
    varPosition.store(ctx);

    g.goTo(labelLoop);
    g.mark(labelExit);

    return Type.VOID_TYPE;
}

From source file:io.datakernel.codegen.ExpressionHash.java

License:Apache License

@Override
public Type load(Context ctx) {
    GeneratorAdapter g = ctx.getGeneratorAdapter();

    int resultVar = g.newLocal(INT_TYPE);

    boolean firstIteration = true;

    for (Expression argument : this.arguments) {
        if (firstIteration) {
            g.push(0);//from  w w  w  .j a  v a2 s .co m
            firstIteration = false;
        } else {
            g.push(31);
            g.loadLocal(resultVar);
            g.math(IMUL, INT_TYPE);
        }

        Type fieldType = argument.load(ctx);

        if (isPrimitiveType(fieldType)) {
            if (fieldType.getSort() == Type.LONG) {
                g.dup2();
                g.push(32);
                g.visitInsn(LUSHR);
                g.visitInsn(LXOR);
                g.visitInsn(L2I);
            }
            if (fieldType.getSort() == Type.FLOAT) {
                g.invokeStatic(getType(Float.class), getMethod("int floatToRawIntBits (float)"));
            }
            if (fieldType.getSort() == Type.DOUBLE) {
                g.invokeStatic(getType(Double.class), getMethod("long doubleToRawLongBits (double)"));
                g.dup2();
                g.push(32);
                g.visitInsn(LUSHR);
                g.visitInsn(LXOR);
                g.visitInsn(L2I);
            }
            g.visitInsn(IADD);
        } else {
            int tmpVar = g.newLocal(fieldType);
            g.storeLocal(tmpVar);
            g.loadLocal(tmpVar);
            Label ifNullLabel = g.newLabel();
            g.ifNull(ifNullLabel);
            g.loadLocal(tmpVar);
            g.invokeVirtual(fieldType, getMethod("int hashCode()"));
            g.visitInsn(IADD);
            g.mark(ifNullLabel);
        }

        g.storeLocal(resultVar);
    }

    if (firstIteration) {
        g.push(0);
    } else {
        g.loadLocal(resultVar);
    }

    return INT_TYPE;
}

From source file:io.datakernel.codegen.ExpressionNeg.java

License:Apache License

@Override
public Type load(Context ctx) {
    GeneratorAdapter g = ctx.getGeneratorAdapter();
    int sort = arg.type(ctx).getSort();
    arg.load(ctx);//from w w w.j  av a 2 s  .  c o m

    if (sort == Type.DOUBLE || sort == Type.FLOAT || sort == Type.LONG || sort == Type.INT) {
        g.math(GeneratorAdapter.NEG, arg.type(ctx));
        return arg.type(ctx);
    }
    if (sort == Type.BYTE || sort == Type.SHORT || sort == Type.CHAR) {
        g.cast(arg.type(ctx), INT_TYPE);
        g.math(GeneratorAdapter.NEG, INT_TYPE);
        return arg.type(ctx);
    }

    if (sort == Type.BOOLEAN) {
        Label labelTrue = new Label();
        Label labelExit = new Label();
        g.push(true);
        g.ifCmp(BOOLEAN_TYPE, GeneratorAdapter.EQ, labelTrue);
        g.push(true);
        g.goTo(labelExit);

        g.mark(labelTrue);
        g.push(false);

        g.mark(labelExit);
        return INT_TYPE;
    }

    throw new RuntimeException(format("%s is not primitive. %s",
            getJavaType(ctx.getClassLoader(), arg.type(ctx)), exceptionInGeneratedClass(ctx)));
}