|  | // 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); | 
|  | case ConstMethodHandle.OPCODE: | 
|  | return new ConstMethodHandle(high, stream, mapping); | 
|  | case ConstMethodType.OPCODE: | 
|  | return new ConstMethodType(high, stream, mapping); | 
|  | default: | 
|  | throw new IllegalArgumentException("Illegal Opcode: 0x" + Integer.toString(opcode, 16)); | 
|  | } | 
|  | } | 
|  | } |