blob: 8637ccab6f9fbb5276a4c6c6ed107a29954217a3 [file] [log] [blame]
// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.code;
import com.android.tools.r8.graph.OffsetToObjectMapping;
abstract class BaseInstructionFactory {
static Instruction create(int high, int opcode, BytecodeStream stream,
OffsetToObjectMapping mapping) {
switch (opcode) {
case 0x0:
return Nop.create(high, stream);
case Move.OPCODE:
return new Move(high, stream);
case MoveFrom16.OPCODE:
return new MoveFrom16(high, stream);
case Move16.OPCODE:
return new Move16(high, stream);
case MoveWide.OPCODE:
return new MoveWide(high, stream);
case MoveWideFrom16.OPCODE:
return new MoveWideFrom16(high, stream);
case MoveWide16.OPCODE:
return new MoveWide16(high, stream);
case MoveObject.OPCODE:
return new MoveObject(high, stream);
case MoveObjectFrom16.OPCODE:
return new MoveObjectFrom16(high, stream);
case MoveObject16.OPCODE:
return new MoveObject16(high, stream);
case MoveResult.OPCODE:
return new MoveResult(high, stream);
case MoveResultWide.OPCODE:
return new MoveResultWide(high, stream);
case MoveResultObject.OPCODE:
return new MoveResultObject(high, stream);
case MoveException.OPCODE:
return new MoveException(high, stream);
case ReturnVoid.OPCODE:
return new ReturnVoid(high, stream);
case Return.OPCODE:
return new Return(high, stream);
case ReturnWide.OPCODE:
return new ReturnWide(high, stream);
case ReturnObject.OPCODE:
return new ReturnObject(high, stream);
case Const4.OPCODE:
return new Const4(high, stream);
case Const16.OPCODE:
return new Const16(high, stream);
case Const.OPCODE:
return new Const(high, stream);
case ConstHigh16.OPCODE:
return new ConstHigh16(high, stream);
case ConstWide16.OPCODE:
return new ConstWide16(high, stream);
case ConstWide32.OPCODE:
return new ConstWide32(high, stream);
case ConstWide.OPCODE:
return new ConstWide(high, stream);
case ConstWideHigh16.OPCODE:
return new ConstWideHigh16(high, stream);
case ConstString.OPCODE:
return new ConstString(high, stream, mapping);
case ConstStringJumbo.OPCODE:
return new ConstStringJumbo(high, stream, mapping);
case ConstClass.OPCODE:
return new ConstClass(high, stream, mapping);
case MonitorEnter.OPCODE:
return new MonitorEnter(high, stream);
case MonitorExit.OPCODE:
return new MonitorExit(high, stream);
case CheckCast.OPCODE:
return new CheckCast(high, stream, mapping);
case InstanceOf.OPCODE:
return new InstanceOf(high, stream, mapping);
case ArrayLength.OPCODE:
return new ArrayLength(high, stream);
case NewInstance.OPCODE:
return new NewInstance(high, stream, mapping);
case NewArray.OPCODE:
return new NewArray(high, stream, mapping);
case FilledNewArray.OPCODE:
return new FilledNewArray(high, stream, mapping);
case FilledNewArrayRange.OPCODE:
return new FilledNewArrayRange(high, stream, mapping);
case FillArrayData.OPCODE:
return new FillArrayData(high, stream);
case Throw.OPCODE:
return new Throw(high, stream);
case Goto.OPCODE:
return new Goto(high, stream);
case Goto16.OPCODE:
return new Goto16(high, stream);
case Goto32.OPCODE:
return new Goto32(high, stream);
case PackedSwitch.OPCODE:
return new PackedSwitch(high, stream);
case SparseSwitch.OPCODE:
return new SparseSwitch(high, stream);
case CmplFloat.OPCODE:
return new CmplFloat(high, stream);
case CmpgFloat.OPCODE:
return new CmpgFloat(high, stream);
case CmplDouble.OPCODE:
return new CmplDouble(high, stream);
case CmpgDouble.OPCODE:
return new CmpgDouble(high, stream);
case CmpLong.OPCODE:
return new CmpLong(high, stream);
case IfEq.OPCODE:
return new IfEq(high, stream);
case IfNe.OPCODE:
return new IfNe(high, stream);
case IfLt.OPCODE:
return new IfLt(high, stream);
case IfGe.OPCODE:
return new IfGe(high, stream);
case IfGt.OPCODE:
return new IfGt(high, stream);
case IfLe.OPCODE:
return new IfLe(high, stream);
case IfEqz.OPCODE:
return new IfEqz(high, stream);
case IfNez.OPCODE:
return new IfNez(high, stream);
case IfLtz.OPCODE:
return new IfLtz(high, stream);
case IfGez.OPCODE:
return new IfGez(high, stream);
case IfGtz.OPCODE:
return new IfGtz(high, stream);
case IfLez.OPCODE:
return new IfLez(high, stream);
case Aget.OPCODE:
return new Aget(high, stream);
case AgetWide.OPCODE:
return new AgetWide(high, stream);
case AgetObject.OPCODE:
return new AgetObject(high, stream);
case AgetBoolean.OPCODE:
return new AgetBoolean(high, stream);
case AgetByte.OPCODE:
return new AgetByte(high, stream);
case AgetChar.OPCODE:
return new AgetChar(high, stream);
case AgetShort.OPCODE:
return new AgetShort(high, stream);
case Aput.OPCODE:
return new Aput(high, stream);
case AputWide.OPCODE:
return new AputWide(high, stream);
case AputObject.OPCODE:
return new AputObject(high, stream);
case AputBoolean.OPCODE:
return new AputBoolean(high, stream);
case AputByte.OPCODE:
return new AputByte(high, stream);
case AputChar.OPCODE:
return new AputChar(high, stream);
case AputShort.OPCODE:
return new AputShort(high, stream);
case Iget.OPCODE:
return new Iget(high, stream, mapping);
case IgetWide.OPCODE:
return new IgetWide(high, stream, mapping);
case IgetObject.OPCODE:
return new IgetObject(high, stream, mapping);
case IgetBoolean.OPCODE:
return new IgetBoolean(high, stream, mapping);
case IgetByte.OPCODE:
return new IgetByte(high, stream, mapping);
case IgetChar.OPCODE:
return new IgetChar(high, stream, mapping);
case IgetShort.OPCODE:
return new IgetShort(high, stream, mapping);
case Iput.OPCODE:
return new Iput(high, stream, mapping);
case IputWide.OPCODE:
return new IputWide(high, stream, mapping);
case IputObject.OPCODE:
return new IputObject(high, stream, mapping);
case IputBoolean.OPCODE:
return new IputBoolean(high, stream, mapping);
case IputByte.OPCODE:
return new IputByte(high, stream, mapping);
case IputChar.OPCODE:
return new IputChar(high, stream, mapping);
case IputShort.OPCODE:
return new IputShort(high, stream, mapping);
case Sget.OPCODE:
return new Sget(high, stream, mapping);
case SgetWide.OPCODE:
return new SgetWide(high, stream, mapping);
case SgetObject.OPCODE:
return new SgetObject(high, stream, mapping);
case SgetBoolean.OPCODE:
return new SgetBoolean(high, stream, mapping);
case SgetByte.OPCODE:
return new SgetByte(high, stream, mapping);
case SgetChar.OPCODE:
return new SgetChar(high, stream, mapping);
case SgetShort.OPCODE:
return new SgetShort(high, stream, mapping);
case Sput.OPCODE:
return new Sput(high, stream, mapping);
case SputWide.OPCODE:
return new SputWide(high, stream, mapping);
case SputObject.OPCODE:
return new SputObject(high, stream, mapping);
case SputBoolean.OPCODE:
return new SputBoolean(high, stream, mapping);
case SputByte.OPCODE:
return new SputByte(high, stream, mapping);
case SputChar.OPCODE:
return new SputChar(high, stream, mapping);
case SputShort.OPCODE:
return new SputShort(high, stream, mapping);
case InvokeVirtual.OPCODE:
return new InvokeVirtual(high, stream, mapping);
case InvokeSuper.OPCODE:
return new InvokeSuper(high, stream, mapping);
case InvokeDirect.OPCODE:
return new InvokeDirect(high, stream, mapping);
case InvokeStatic.OPCODE:
return new InvokeStatic(high, stream, mapping);
case InvokeInterface.OPCODE:
return new InvokeInterface(high, stream, mapping);
case InvokeVirtualRange.OPCODE:
return new InvokeVirtualRange(high, stream, mapping);
case InvokeSuperRange.OPCODE:
return new InvokeSuperRange(high, stream, mapping);
case InvokeDirectRange.OPCODE:
return new InvokeDirectRange(high, stream, mapping);
case InvokeStaticRange.OPCODE:
return new InvokeStaticRange(high, stream, mapping);
case InvokeInterfaceRange.OPCODE:
return new InvokeInterfaceRange(high, stream, mapping);
case NegInt.OPCODE:
return new NegInt(high, stream);
case NotInt.OPCODE:
return new NotInt(high, stream);
case NegLong.OPCODE:
return new NegLong(high, stream);
case NotLong.OPCODE:
return new NotLong(high, stream);
case NegFloat.OPCODE:
return new NegFloat(high, stream);
case NegDouble.OPCODE:
return new NegDouble(high, stream);
case IntToLong.OPCODE:
return new IntToLong(high, stream);
case IntToFloat.OPCODE:
return new IntToFloat(high, stream);
case IntToDouble.OPCODE:
return new IntToDouble(high, stream);
case LongToInt.OPCODE:
return new LongToInt(high, stream);
case LongToFloat.OPCODE:
return new LongToFloat(high, stream);
case LongToDouble.OPCODE:
return new LongToDouble(high, stream);
case FloatToInt.OPCODE:
return new FloatToInt(high, stream);
case FloatToLong.OPCODE:
return new FloatToLong(high, stream);
case FloatToDouble.OPCODE:
return new FloatToDouble(high, stream);
case DoubleToInt.OPCODE:
return new DoubleToInt(high, stream);
case DoubleToLong.OPCODE:
return new DoubleToLong(high, stream);
case DoubleToFloat.OPCODE:
return new DoubleToFloat(high, stream);
case IntToByte.OPCODE:
return new IntToByte(high, stream);
case IntToChar.OPCODE:
return new IntToChar(high, stream);
case IntToShort.OPCODE:
return new IntToShort(high, stream);
case AddInt.OPCODE:
return new AddInt(high, stream);
case SubInt.OPCODE:
return new SubInt(high, stream);
case MulInt.OPCODE:
return new MulInt(high, stream);
case DivInt.OPCODE:
return new DivInt(high, stream);
case RemInt.OPCODE:
return new RemInt(high, stream);
case AndInt.OPCODE:
return new AndInt(high, stream);
case OrInt.OPCODE:
return new OrInt(high, stream);
case XorInt.OPCODE:
return new XorInt(high, stream);
case ShlInt.OPCODE:
return new ShlInt(high, stream);
case ShrInt.OPCODE:
return new ShrInt(high, stream);
case UshrInt.OPCODE:
return new UshrInt(high, stream);
case AddLong.OPCODE:
return new AddLong(high, stream);
case SubLong.OPCODE:
return new SubLong(high, stream);
case MulLong.OPCODE:
return new MulLong(high, stream);
case DivLong.OPCODE:
return new DivLong(high, stream);
case RemLong.OPCODE:
return new RemLong(high, stream);
case AndLong.OPCODE:
return new AndLong(high, stream);
case OrLong.OPCODE:
return new OrLong(high, stream);
case XorLong.OPCODE:
return new XorLong(high, stream);
case ShlLong.OPCODE:
return new ShlLong(high, stream);
case ShrLong.OPCODE:
return new ShrLong(high, stream);
case UshrLong.OPCODE:
return new UshrLong(high, stream);
case AddFloat.OPCODE:
return new AddFloat(high, stream);
case SubFloat.OPCODE:
return new SubFloat(high, stream);
case MulFloat.OPCODE:
return new MulFloat(high, stream);
case DivFloat.OPCODE:
return new DivFloat(high, stream);
case RemFloat.OPCODE:
return new RemFloat(high, stream);
case AddDouble.OPCODE:
return new AddDouble(high, stream);
case SubDouble.OPCODE:
return new SubDouble(high, stream);
case MulDouble.OPCODE:
return new MulDouble(high, stream);
case DivDouble.OPCODE:
return new DivDouble(high, stream);
case RemDouble.OPCODE:
return new RemDouble(high, stream);
case AddInt2Addr.OPCODE:
return new AddInt2Addr(high, stream);
case SubInt2Addr.OPCODE:
return new SubInt2Addr(high, stream);
case MulInt2Addr.OPCODE:
return new MulInt2Addr(high, stream);
case DivInt2Addr.OPCODE:
return new DivInt2Addr(high, stream);
case RemInt2Addr.OPCODE:
return new RemInt2Addr(high, stream);
case AndInt2Addr.OPCODE:
return new AndInt2Addr(high, stream);
case OrInt2Addr.OPCODE:
return new OrInt2Addr(high, stream);
case XorInt2Addr.OPCODE:
return new XorInt2Addr(high, stream);
case ShlInt2Addr.OPCODE:
return new ShlInt2Addr(high, stream);
case ShrInt2Addr.OPCODE:
return new ShrInt2Addr(high, stream);
case UshrInt2Addr.OPCODE:
return new UshrInt2Addr(high, stream);
case AddLong2Addr.OPCODE:
return new AddLong2Addr(high, stream);
case SubLong2Addr.OPCODE:
return new SubLong2Addr(high, stream);
case MulLong2Addr.OPCODE:
return new MulLong2Addr(high, stream);
case DivLong2Addr.OPCODE:
return new DivLong2Addr(high, stream);
case RemLong2Addr.OPCODE:
return new RemLong2Addr(high, stream);
case AndLong2Addr.OPCODE:
return new AndLong2Addr(high, stream);
case OrLong2Addr.OPCODE:
return new OrLong2Addr(high, stream);
case XorLong2Addr.OPCODE:
return new XorLong2Addr(high, stream);
case ShlLong2Addr.OPCODE:
return new ShlLong2Addr(high, stream);
case ShrLong2Addr.OPCODE:
return new ShrLong2Addr(high, stream);
case UshrLong2Addr.OPCODE:
return new UshrLong2Addr(high, stream);
case AddFloat2Addr.OPCODE:
return new AddFloat2Addr(high, stream);
case SubFloat2Addr.OPCODE:
return new SubFloat2Addr(high, stream);
case MulFloat2Addr.OPCODE:
return new MulFloat2Addr(high, stream);
case DivFloat2Addr.OPCODE:
return new DivFloat2Addr(high, stream);
case RemFloat2Addr.OPCODE:
return new RemFloat2Addr(high, stream);
case AddDouble2Addr.OPCODE:
return new AddDouble2Addr(high, stream);
case SubDouble2Addr.OPCODE:
return new SubDouble2Addr(high, stream);
case MulDouble2Addr.OPCODE:
return new MulDouble2Addr(high, stream);
case DivDouble2Addr.OPCODE:
return new DivDouble2Addr(high, stream);
case RemDouble2Addr.OPCODE:
return new RemDouble2Addr(high, stream);
case AddIntLit16.OPCODE:
return new AddIntLit16(high, stream);
case RsubInt.OPCODE:
return new RsubInt(high, stream);
case MulIntLit16.OPCODE:
return new MulIntLit16(high, stream);
case DivIntLit16.OPCODE:
return new DivIntLit16(high, stream);
case RemIntLit16.OPCODE:
return new RemIntLit16(high, stream);
case AndIntLit16.OPCODE:
return new AndIntLit16(high, stream);
case OrIntLit16.OPCODE:
return new OrIntLit16(high, stream);
case XorIntLit16.OPCODE:
return new XorIntLit16(high, stream);
case AddIntLit8.OPCODE:
return new AddIntLit8(high, stream);
case RsubIntLit8.OPCODE:
return new RsubIntLit8(high, stream);
case MulIntLit8.OPCODE:
return new MulIntLit8(high, stream);
case DivIntLit8.OPCODE:
return new DivIntLit8(high, stream);
case RemIntLit8.OPCODE:
return new RemIntLit8(high, stream);
case AndIntLit8.OPCODE:
return new AndIntLit8(high, stream);
case OrIntLit8.OPCODE:
return new OrIntLit8(high, stream);
case XorIntLit8.OPCODE:
return new XorIntLit8(high, stream);
case ShlIntLit8.OPCODE:
return new ShlIntLit8(high, stream);
case ShrIntLit8.OPCODE:
return new ShrIntLit8(high, stream);
case UshrIntLit8.OPCODE:
return new UshrIntLit8(high, stream);
case InvokePolymorphic.OPCODE:
return new InvokePolymorphic(high, stream, mapping);
case InvokePolymorphicRange.OPCODE:
return new InvokePolymorphicRange(high, stream, mapping);
case InvokeCustom.OPCODE:
return new InvokeCustom(high, stream, mapping);
case InvokeCustomRange.OPCODE:
return new InvokeCustomRange(high, stream, mapping);
default:
throw new IllegalArgumentException("Illegal Opcode: 0x" + Integer.toString(opcode, 16));
}
}
}