// 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)); } } }