blob: 8b928aaebac5e075cb2f07621305b040505ae7bb [file] [log] [blame]
package com.android.tools.r8.ir.desugar.backports;
import com.android.tools.r8.cf.code.CfArithmeticBinop;
import com.android.tools.r8.cf.code.CfInstruction;
import com.android.tools.r8.cf.code.CfInvoke;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.ir.code.NumericType;
import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.FullMethodInvokeRewriter;
import com.android.tools.r8.ir.desugar.BackportedMethodRewriter.MethodInvokeRewriter;
import com.android.tools.r8.ir.desugar.LocalStackAllocator;
import java.util.Collection;
import java.util.Collections;
import org.objectweb.asm.Opcodes;
public final class NumericMethodRewrites {
public static MethodInvokeRewriter rewriteToInvokeMath() {
return (invoke, factory) -> {
DexMethod method = invoke.getMethod();
return new CfInvoke(
Opcodes.INVOKESTATIC,
factory.createMethod(factory.mathType, method.proto, method.name),
false);
};
}
public static MethodInvokeRewriter rewriteToAddInstruction() {
return (invoke, factory) -> {
NumericType numericType = NumericType.fromDexType(invoke.getMethod().getReturnType());
return new CfArithmeticBinop(CfArithmeticBinop.Opcode.Add, numericType);
};
}
public static MethodInvokeRewriter rewriteAsIdentity() {
return new FullMethodInvokeRewriter() {
@Override
public Collection<CfInstruction> rewrite(
CfInvoke invoke, DexItemFactory factory, LocalStackAllocator localStackAllocator) {
// The invoke consumes the stack value and pushes another assumed to be the same.
return Collections.emptyList();
}
};
}
private NumericMethodRewrites() {
}
}