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

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

Introduction

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

Prototype

public void dup2() 

Source Link

Document

Generates a DUP2 instruction.

Usage

From source file:com.changingbits.Builder.java

License:Apache License

private void buildCounterAsm(GeneratorAdapter gen, Node node, boolean sawOutputs) {

    sawOutputs |= node.outputs != null;//ww  w .  j  a  v  a2 s.  c  o m

    if (node.left != null) {
        assert node.left.end + 1 == node.right.start;
        // Recurse on either left or right
        Label labelLeft = new Label();
        Label labelEnd = new Label();
        gen.loadArg(0);
        gen.push(node.left.end);

        gen.ifCmp(Type.LONG_TYPE, GeneratorAdapter.LE, labelLeft);
        buildCounterAsm(gen, node.right, sawOutputs);
        gen.goTo(labelEnd);
        gen.visitLabel(labelLeft);
        buildCounterAsm(gen, node.left, sawOutputs);
        gen.visitLabel(labelEnd);
    } else if (sawOutputs) {
        // leaf: elementaryCounts[node.leafIndex]++
        gen.loadThis();
        gen.getField(BASE_LONG_RANGE_COUNTER_TYPE, "elementaryCounts", INT_ARRAY_TYPE);
        gen.push(node.leafIndex);
        gen.dup2();
        gen.arrayLoad(Type.INT_TYPE);
        gen.push(1);
        gen.visitInsn(Opcodes.IADD);
        gen.arrayStore(Type.INT_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);//w w w.j  a  v a2s .  c  o 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;
}