Search in sources :

Example 26 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _dup.

protected void _dup() {
    // prestack: var0 (height = 1)
    // poststack: var1, var0
    // assignments: var1 = var0(initial)
    currentStack.assertHeights(DUP_HEIGHTS);
    int baseHeight = currentStack.height();
    save_stack(false);
    Expr var0 = pop();
    // var1 = var0
    Type var1Type = assign_stack(baseHeight, var0);
    // push var0
    push(load_stack(baseHeight - 1, var0.getType()));
    // push var1
    push(load_stack(baseHeight, var1Type));
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Example 27 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _arithmetic.

protected void _arithmetic(Operator op) {
    save_stack(false);
    Expr e = new ArithmeticExpr(pop(), pop(), op);
    int index = currentStack.height();
    Type type = assign_stack(index, e);
    push(load_stack(index, type));
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Example 28 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _dup2_x1.

protected void _dup2_x1() {
    Type topType = peek().getType();
    int baseHeight = currentStack.height();
    save_stack(false);
    if (topType.getSize() == 2) {
        // prestack: var2, var0 (height = 3)
        // poststack: var3, var2, var0
        // assignments: var0 = var2(initial)
        // assignemnts: var2 = var0(initial)
        // assignments: var3 = var2(initial)
        currentStack.assertHeights(DUP2_X1_64_HEIGHTS);
        Expr var2 = pop();
        Expr var0 = pop();
        // var4 = var0(initial)
        Type var4Type = assign_stack(baseHeight + 1, var0);
        // var3 = var2(initial)
        Type var3Type = assign_stack(baseHeight - 0, var2);
        // var0 = var2(initial)
        Type var0Type = assign_stack(baseHeight - 3, var2);
        // var2 = var4 = var0(initial)
        Type var2Type = assign_stack(baseHeight - 1, load_stack(baseHeight + 1, var4Type));
        // push var0
        push(load_stack(baseHeight - 3, var0Type));
        // push var2
        push(load_stack(baseHeight - 1, var2Type));
        // push var3
        push(load_stack(baseHeight - 0, var3Type));
    } else {
        // prestack: var2, var1, var0 (height = 3)
        // poststack: var4, var3, var2, var1, var0
        // assignments: var0 = var1(initial)
        // assignments: var1 = var2(initial)
        // assignments: var2 = var0(initial)
        // assignments: var3 = var1(initial)
        // assignments: var4 = var2(initial)
        currentStack.assertHeights(DUP2_X1_32_HEIGHTS);
        Expr var2 = pop();
        Expr var1 = pop();
        Expr var0 = pop();
        // var5 = var0(initial)
        Type var5Type = assign_stack(baseHeight + 2, var0);
        // var0 = var1(initial)
        Type var0Type = assign_stack(baseHeight - 3, var1);
        // var1 = var2(initial)
        Type var1Type = assign_stack(baseHeight - 2, var2);
        // var3 = var1(initial)
        Type var3Type = assign_stack(baseHeight + 0, var1);
        // var4 = var2(initial)
        Type var4Type = assign_stack(baseHeight + 1, var2);
        // var2 = var5 = var0(initial)
        Type var2Type = assign_stack(baseHeight - 1, load_stack(baseHeight + 2, var5Type));
        // push var0
        push(load_stack(baseHeight - 3, var0Type));
        // push var1
        push(load_stack(baseHeight - 2, var1Type));
        // push var2
        push(load_stack(baseHeight - 1, var2Type));
        // push var3
        push(load_stack(baseHeight + 0, var3Type));
        // push var4
        push(load_stack(baseHeight + 1, var4Type));
    }
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Example 29 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _dup2.

protected void _dup2() {
    int baseHeight = currentStack.height();
    save_stack(false);
    if (peek().getType().getSize() == 2) {
        // prestack: var0 (height = 2)
        // poststack: var2, var0
        // assignments: var2 = var0
        Expr var0 = pop();
        // var2 = var0
        Type var2Type = assign_stack(baseHeight, var0);
        // push var0
        push(load_stack(baseHeight - 2, var0.getType()));
        // push var2
        push(load_stack(baseHeight, var2Type));
    } else {
        // prestack: var1, var0 (height = 2)
        // poststack: var3, var2, var1, var0
        // assignments: var2 = var0(initial)
        // assignments: var3 = var1(initial)
        currentStack.assertHeights(DUP2_32_HEIGHTS);
        Expr var1 = pop();
        Expr var0 = pop();
        // var2 = var0
        Type var2Type = assign_stack(baseHeight + 0, var0);
        // var3 = var1
        Type var3Type = assign_stack(baseHeight + 1, var1);
        // push var0
        push(load_stack(baseHeight - 2, var0.getType()));
        // push var1
        push(load_stack(baseHeight - 1, var1.getType()));
        // push var2
        push(load_stack(baseHeight + 0, var2Type));
        // push var3
        push(load_stack(baseHeight + 1, var3Type));
    }
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Example 30 with Expr

use of org.mapleir.ir.code.Expr in project maple-ir by LLVM-but-worse.

the class GenerationPass method _swap.

protected void _swap() {
    // prestack: var1, var0 (height = 2)
    // poststack: var1, var0
    // assignments: var0 = var1 (initial)
    // assignments: var1 = var0 (initial)
    currentStack.assertHeights(SWAP_HEIGHTS);
    int baseHeight = currentStack.height();
    save_stack(false);
    Expr var1 = pop();
    Expr var0 = pop();
    // var2 = var0
    Type var2Type = assign_stack(baseHeight + 0, var0);
    // var3 = var1
    Type var3Type = assign_stack(baseHeight + 1, var1);
    // var0 = var3 = var1(initial)
    Type var0Type = assign_stack(baseHeight - 2, load_stack(baseHeight + 1, var3Type));
    // var1 = var2 = var0(initial)
    Type var1Type = assign_stack(baseHeight - 1, load_stack(baseHeight + 0, var2Type));
    // push var0
    push(load_stack(baseHeight - 2, var0Type));
    // push var1
    push(load_stack(baseHeight - 1, var1Type));
}
Also used : Type(org.objectweb.asm.Type) ComparisonType(org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType) ValueComparisonType(org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType) ArrayType(org.mapleir.ir.TypeUtils.ArrayType) InvocationExpr(org.mapleir.ir.code.expr.invoke.InvocationExpr) Expr(org.mapleir.ir.code.Expr)

Aggregations

Expr (org.mapleir.ir.code.Expr)87 VarExpr (org.mapleir.ir.code.expr.VarExpr)46 InvocationExpr (org.mapleir.ir.code.expr.invoke.InvocationExpr)45 BasicBlock (org.mapleir.ir.cfg.BasicBlock)32 PhiExpr (org.mapleir.ir.code.expr.PhiExpr)31 Stmt (org.mapleir.ir.code.Stmt)29 ConstantExpr (org.mapleir.ir.code.expr.ConstantExpr)26 AbstractCopyStmt (org.mapleir.ir.code.stmt.copy.AbstractCopyStmt)26 Local (org.mapleir.ir.locals.Local)22 Type (org.objectweb.asm.Type)21 VersionedLocal (org.mapleir.ir.locals.impl.VersionedLocal)20 CopyPhiStmt (org.mapleir.ir.code.stmt.copy.CopyPhiStmt)19 InitialisedObjectExpr (org.mapleir.ir.code.expr.invoke.InitialisedObjectExpr)17 ComparisonType (org.mapleir.ir.code.stmt.ConditionalJumpStmt.ComparisonType)14 CopyVarStmt (org.mapleir.ir.code.stmt.copy.CopyVarStmt)14 ValueComparisonType (org.mapleir.ir.code.expr.ComparisonExpr.ValueComparisonType)13 ArrayType (org.mapleir.ir.TypeUtils.ArrayType)12 HashSet (java.util.HashSet)11 ArithmeticExpr (org.mapleir.ir.code.expr.ArithmeticExpr)11 ControlFlowGraph (org.mapleir.ir.cfg.ControlFlowGraph)9