1b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com/* 2b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * [The "BSD licence"] 300fc68adf2e39aeb9fed35293f2576bbe729ec4bJesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver (JesusFreke) 4b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * All rights reserved. 5b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * 6b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 7b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 8b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * are met: 9b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 10b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 11b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 12b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 13b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 14b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 15b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 16b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * 17b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com */ 28b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 29b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.compackage org.jf.baksmali.Adaptors.Format; 30b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 31754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruverimport org.jf.baksmali.Adaptors.MethodDefinition; 324f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruverimport org.jf.baksmali.Adaptors.MethodDefinition.InvalidSwitchPayload; 33b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.comimport org.jf.baksmali.Adaptors.MethodItem; 34e88723c666db87d414e126ac6d94d683d86ad28dBen Gruverimport org.jf.baksmali.Renderers.LongRenderer; 354f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruverimport org.jf.baksmali.baksmaliOptions; 364f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruverimport org.jf.dexlib2.Opcode; 37f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruverimport org.jf.dexlib2.ReferenceType; 38db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruverimport org.jf.dexlib2.VerificationError; 39f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile.InvalidItemIndex; 40754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruverimport org.jf.dexlib2.iface.instruction.*; 41db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruverimport org.jf.dexlib2.iface.instruction.formats.Instruction20bc; 424f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruverimport org.jf.dexlib2.iface.instruction.formats.Instruction31t; 432363e6e43ccd826a315b2f1feb1850a6ccd68f84Ben Gruverimport org.jf.dexlib2.iface.instruction.formats.UnknownInstruction; 44d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruverimport org.jf.dexlib2.iface.reference.FieldReference; 45d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruverimport org.jf.dexlib2.iface.reference.MethodReference; 46f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruverimport org.jf.dexlib2.iface.reference.Reference; 474f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruverimport org.jf.dexlib2.util.ReferenceUtil; 484f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruverimport org.jf.util.ExceptionWithContext; 494b72225e9d81201838f387171a68a832486903f9JesusFreke@JesusFreke.comimport org.jf.util.IndentingWriter; 5058d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smithimport org.jf.util.NumberUtils; 51b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 52754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruverimport javax.annotation.Nonnull; 536eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.comimport java.io.IOException; 547e9231a211bf00451229d88edb5c7fbd5085f73eJeff Smithimport java.util.Map; 55b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 56b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.compublic class InstructionMethodItem<T extends Instruction> extends MethodItem { 57754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver @Nonnull protected final MethodDefinition methodDef; 58754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver @Nonnull protected final T instruction; 59b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 60754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver public InstructionMethodItem(@Nonnull MethodDefinition methodDef, int codeAddress, @Nonnull T instruction) { 61b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com super(codeAddress); 62754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver this.methodDef = methodDef; 63b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com this.instruction = instruction; 64b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 65b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 66da69b22d6fe70d082b18858aea0d15ec383f1865JesusFreke@JesusFreke.com public double getSortOrder() { 67b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com //instructions should appear after everything except an "end try" label and .catch directive 68b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com return 100; 69b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 70b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 714f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver private boolean isAllowedOdex(@Nonnull Opcode opcode) { 724f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver baksmaliOptions options = methodDef.classDef.options; 734f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (options.allowOdex) { 744f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver return true; 754f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 764f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 774f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (methodDef.classDef.options.apiLevel >= 14) { 784f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver return false; 794f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 804f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 814f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver return opcode.isOdexedInstanceVolatile() || opcode.isOdexedStaticVolatile() || 824f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver opcode == Opcode.THROW_VERIFICATION_ERROR; 834f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 844f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 85b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com @Override 860b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com public boolean writeTo(IndentingWriter writer) throws IOException { 874f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver Opcode opcode = instruction.getOpcode(); 884f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver String verificationErrorName = null; 894f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver String referenceString = null; 904f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 914f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver boolean commentOutInstruction = false; 924f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 934f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (instruction instanceof Instruction20bc) { 944f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver int verificationError = ((Instruction20bc)instruction).getVerificationError(); 954f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver verificationErrorName = VerificationError.getVerificationErrorName(verificationError); 964f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (verificationErrorName == null) { 974f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("#was invalid verification error type: "); 984f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.printSignedIntAsDec(verificationError); 994f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("\n"); 1004f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver verificationErrorName = "generic-error"; 1014f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1024f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1034f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 104f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver if (instruction instanceof ReferenceInstruction) { 1054f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver ReferenceInstruction referenceInstruction = (ReferenceInstruction)instruction; 106f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver try { 1074f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver Reference reference = referenceInstruction.getReference(); 108d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruver 109d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruver String classContext = null; 110d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruver if (methodDef.classDef.options.useImplicitReferences) { 111d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruver classContext = methodDef.method.getDefiningClass(); 112d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruver } 113d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruver 114d33fd6773cc3e527b4dbb79245796d556b7facdeBen Gruver referenceString = ReferenceUtil.getReferenceString(reference, classContext); 1154f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver assert referenceString != null; 116f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver } catch (InvalidItemIndex ex) { 1174f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("#"); 1184f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write(ex.getMessage()); 1194f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("\n"); 1204f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver commentOutInstruction = true; 121f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver 1224f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver referenceString = String.format("%s@%d", 1234f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver ReferenceType.toString(referenceInstruction.getReferenceType()), 1244f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver ex.getInvalidIndex()); 1254f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } catch (ReferenceType.InvalidReferenceTypeException ex) { 1264f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("#invalid reference type: "); 1274f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.printSignedIntAsDec(ex.getReferenceType()); 1284f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver commentOutInstruction = true; 1294f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 1304f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver referenceString = "invalid_reference"; 131f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver } 132f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver } 133f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver 1344f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (instruction instanceof Instruction31t) { 1354f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver Opcode payloadOpcode; 1364f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver switch (instruction.getOpcode()) { 1374f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver case PACKED_SWITCH: 1384f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver payloadOpcode = Opcode.PACKED_SWITCH_PAYLOAD; 1394f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 1404f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver case SPARSE_SWITCH: 1414f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver payloadOpcode = Opcode.SPARSE_SWITCH_PAYLOAD; 1424f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 1434f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver case FILL_ARRAY_DATA: 1444f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver payloadOpcode = Opcode.ARRAY_PAYLOAD; 1454f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 1464f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver default: 1474f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver throw new ExceptionWithContext("Invalid 31t opcode: %s", instruction.getOpcode()); 1484f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1494f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 1504f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver try { 1514f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver methodDef.findSwitchPayload(this.codeAddress + ((Instruction31t)instruction).getCodeOffset(), 1524f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver payloadOpcode); 1534f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } catch (InvalidSwitchPayload ex) { 1544f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("#invalid payload reference"); 1554f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver commentOutInstruction = true; 1564f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1574f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1584f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 1594f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (opcode.odexOnly()) { 1604f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (!isAllowedOdex(opcode)) { 1614f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("#disallowed odex opcode\n"); 1624f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver commentOutInstruction = true; 1634f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1644f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1654f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 1664f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (commentOutInstruction) { 1674f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("#"); 1684f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 1694f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 170754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver switch (instruction.getOpcode().format) { 1716eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format10t: 1726eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 1736eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 1746eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeTargetLabel(writer); 1754f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 1766eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format10x: 1772363e6e43ccd826a315b2f1feb1850a6ccd68f84Ben Gruver if (instruction instanceof UnknownInstruction) { 178a9ce1cf3ecff57b00c14bf86b2c688823c918a05Ben Gruver writer.write("#unknown opcode: 0x"); 1792363e6e43ccd826a315b2f1feb1850a6ccd68f84Ben Gruver writer.printUnsignedLongAsHex(((UnknownInstruction)instruction).getOriginalOpcode()); 180a9ce1cf3ecff57b00c14bf86b2c688823c918a05Ben Gruver writer.write('\n'); 1812363e6e43ccd826a315b2f1feb1850a6ccd68f84Ben Gruver } 1826eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 1834f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 1846eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format11n: 1856eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 1866eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 1876eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 1886eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 1896eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeLiteral(writer); 1904f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 1916eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format11x: 1926eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 1936eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 1946eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 1954f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 1966eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format12x: 1976eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 1986eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 1996eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2006eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2016eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeSecondRegister(writer); 2024f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 203db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver case Format20bc: 204bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver writeOpcode(writer); 205bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver writer.write(' '); 2064f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write(verificationErrorName); 207bbe539f2d2cdfdd814fcdc0057dcdf454ae153d3Ben Gruver writer.write(", "); 2084f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write(referenceString); 2094f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2106eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format20t: 2116eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format30t: 2126eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2136eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2146eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeTargetLabel(writer); 2154f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2166eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format21c: 2176eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format31c: 2186eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2196eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2206eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2216eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2224f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write(referenceString); 2234f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 224754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver case Format21ih: 225754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver case Format21lh: 2266eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format21s: 2276eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format31i: 2286eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format51l: 2296eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2306eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2316eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2326eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2336eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeLiteral(writer); 23458d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith if (instruction.getOpcode().setsWideRegister()) { 2350b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith writeCommentIfLikelyDouble(writer); 23658d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } else { 2370b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith boolean isResourceId = writeCommentIfResourceId(writer); 2380b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith if (!isResourceId) writeCommentIfLikelyFloat(writer); 23958d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } 2404f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2416eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format21t: 2426eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format31t: 2436eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2446eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2456eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2466eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2476eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeTargetLabel(writer); 2484f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2496eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format22b: 2506eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format22s: 2516eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2526eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2536eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2546eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2556eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeSecondRegister(writer); 2566eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2576eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeLiteral(writer); 2584f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2596eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format22c: 2606eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2616eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2626eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2636eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2646eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeSecondRegister(writer); 2656eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2664f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write(referenceString); 2674f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 268e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver case Format22cs: 2696eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2706eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2716eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2726eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2736eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeSecondRegister(writer); 2746eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2756eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFieldOffset(writer); 2764f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2776eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format22t: 2786eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2796eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2806eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2816eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2826eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeSecondRegister(writer); 2836eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2846eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeTargetLabel(writer); 2854f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2866eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format22x: 2876eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format32x: 2886eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2896eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2906eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2916eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2926eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeSecondRegister(writer); 2934f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 2946eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format23x: 2956eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 2966eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 2976eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeFirstRegister(writer); 2986eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 2996eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeSecondRegister(writer); 3006eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 3016eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeThirdRegister(writer); 3024f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 3036eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format35c: 3046eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 3056eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 3066eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeInvokeRegisters(writer); 3076eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 3084f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write(referenceString); 3094f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 3102a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver case Format35mi: 311b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writeOpcode(writer); 312b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writer.write(' '); 313b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writeInvokeRegisters(writer); 314b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writer.write(", "); 315b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writeInlineIndex(writer); 3164f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 3176eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format35ms: 3186eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 3196eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 3206eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeInvokeRegisters(writer); 3216eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 3226eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeVtableIndex(writer); 3234f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 3246eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format3rc: 3256eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 3266eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 3276eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeInvokeRangeRegisters(writer); 3286eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 3294f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write(referenceString); 3304f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 33161277b50b39015efe38c9cc5c79b31f6dd35c1f6Ben Gruver case Format3rmi: 332b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writeOpcode(writer); 333b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writer.write(' '); 334b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writeInvokeRangeRegisters(writer); 335b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writer.write(", "); 336b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver writeInlineIndex(writer); 3374f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 3386eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com case Format3rms: 3396eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeOpcode(writer); 3406eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(' '); 3416eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeInvokeRangeRegisters(writer); 3426eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 3436eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeVtableIndex(writer); 3444f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver break; 3454f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver default: 3464f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver assert false; 3474f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver return false; 3484f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver } 3494f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 3504f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver if (commentOutInstruction) { 3514f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver writer.write("\nnop"); 3520c65e0f4f54ead8fd2832c954d516367b3556ae3JesusFreke@JesusFreke.com } 3534f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver 3544f2620415d505a35d2d14b866cde10a54b1b7c8cBen Gruver return true; 355b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 356b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 3570b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeOpcode(IndentingWriter writer) throws IOException { 358754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writer.write(instruction.getOpcode().name); 359b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 360b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 3610b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeTargetLabel(IndentingWriter writer) throws IOException { 362db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver //this method is overridden by OffsetInstructionMethodItem, and should only be called for the formats that 3636eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com //have a target 3646eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com throw new RuntimeException(); 3656eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 366b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 3670b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeRegister(IndentingWriter writer, int registerNumber) throws IOException { 368754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver methodDef.registerFormatter.writeTo(writer, registerNumber); 369b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 370b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 3710b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeFirstRegister(IndentingWriter writer) throws IOException { 372754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, ((OneRegisterInstruction)instruction).getRegisterA()); 3736eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 374b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 3750b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeSecondRegister(IndentingWriter writer) throws IOException { 3766eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, ((TwoRegisterInstruction)instruction).getRegisterB()); 377b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 378b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 3790b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeThirdRegister(IndentingWriter writer) throws IOException { 380754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, ((ThreeRegisterInstruction) instruction).getRegisterC()); 381b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 382b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 3830b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeInvokeRegisters(IndentingWriter writer) throws IOException { 3846eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com FiveRegisterInstruction instruction = (FiveRegisterInstruction)this.instruction; 385754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver final int regCount = instruction.getRegisterCount(); 3866eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 3876eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write('{'); 3886eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com switch (regCount) { 389b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com case 1: 390754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, instruction.getRegisterC()); 3916eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com break; 392b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com case 2: 393754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, instruction.getRegisterC()); 3946eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 395754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, instruction.getRegisterD()); 3966eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com break; 397b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com case 3: 398754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, instruction.getRegisterC()); 399754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writer.write(", "); 4006eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterD()); 4016eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 4026eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterE()); 4036eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com break; 404b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com case 4: 405754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, instruction.getRegisterC()); 406754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writer.write(", "); 4076eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterD()); 4086eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 4096eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterE()); 4106eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 4116eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterF()); 4126eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com break; 413b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com case 5: 414754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writeRegister(writer, instruction.getRegisterC()); 415754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver writer.write(", "); 4166eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterD()); 4176eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 4186eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterE()); 4196eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 4206eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterF()); 4216eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write(", "); 4226eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writeRegister(writer, instruction.getRegisterG()); 4236eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com break; 424b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 4256eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write('}'); 426b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 427b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 4280b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeInvokeRangeRegisters(IndentingWriter writer) throws IOException { 4296eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com RegisterRangeInstruction instruction = (RegisterRangeInstruction)this.instruction; 4306eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com 431754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver int regCount = instruction.getRegisterCount(); 4326eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com if (regCount == 0) { 4336eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write("{}"); 4346eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } else { 4356eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com int startRegister = instruction.getStartRegister(); 436754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver methodDef.registerFormatter.writeRegisterRange(writer, startRegister, startRegister+regCount-1); 4376eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 4386eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com } 439b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 4400b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeLiteral(IndentingWriter writer) throws IOException { 441754b3c4dc009b7a02e39001560c3f0fd6a7cc2c0Ben Gruver LongRenderer.writeSignedIntOrLongTo(writer, ((WideLiteralInstruction)instruction).getWideLiteral()); 442b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 443b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com 4440b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith protected void writeCommentIfLikelyFloat(IndentingWriter writer) throws IOException { 4450b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith writeCommentIfLikelyFloat(writer, ((NarrowLiteralInstruction)instruction).getNarrowLiteral()); 44658d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } 44758d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith 4480b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith protected void writeCommentIfLikelyFloat(IndentingWriter writer, int val) throws IOException { 44958d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith if (NumberUtils.isLikelyFloat(val)) { 45058d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write(" # "); 45158d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith float fval = Float.intBitsToFloat(val); 45258d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith if (fval == Float.POSITIVE_INFINITY) 45358d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Float.POSITIVE_INFINITY"); 45458d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (fval == Float.NEGATIVE_INFINITY) 45558d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Float.NEGATIVE_INFINITY"); 45658d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (fval == Float.NaN) 45758d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Float.NaN"); 45858d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (fval == Float.MAX_VALUE) 45958d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Float.MAX_VALUE"); 46058d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (fval == (float)Math.PI) 46158d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("(float)Math.PI"); 46258d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (fval == (float)Math.E) 46358d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("(float)Math.E"); 46458d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else { 46558d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write(Float.toString(fval)); 46658d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write('f'); 46758d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } 46858d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } 46958d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } 47058d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith 4710b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith protected void writeCommentIfLikelyDouble(IndentingWriter writer) throws IOException { 4720b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith writeCommentIfLikelyDouble(writer, ((WideLiteralInstruction)instruction).getWideLiteral()); 473eb0b009971653400809fa43c51d2ce99cb5c52b9Jeff Smith } 474eb0b009971653400809fa43c51d2ce99cb5c52b9Jeff Smith 4750b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith protected void writeCommentIfLikelyDouble(IndentingWriter writer, long val) throws IOException { 47658d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith if (NumberUtils.isLikelyDouble(val)) { 47758d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write(" # "); 47858d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith double dval = Double.longBitsToDouble(val); 47958d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith if (dval == Double.POSITIVE_INFINITY) 48058d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Double.POSITIVE_INFINITY"); 48158d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (dval == Double.NEGATIVE_INFINITY) 48258d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Double.NEGATIVE_INFINITY"); 48358d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (dval == Double.NaN) 48458d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Double.NaN"); 48558d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (dval == Double.MAX_VALUE) 48658d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Double.MAX_VALUE"); 48758d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (dval == Math.PI) 48858d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Math.PI"); 48958d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else if (dval == Math.E) 49058d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write("Math.E"); 49158d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith else 49258d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith writer.write(Double.toString(dval)); 49358d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } 49458d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith } 49558d2efb8e51db3f5cec63256030db3d3f98789e7Jeff Smith 4960b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith protected boolean writeCommentIfResourceId(IndentingWriter writer) throws IOException { 4970b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith return writeCommentIfResourceId(writer, ((NarrowLiteralInstruction)instruction).getNarrowLiteral()); 498eb0b009971653400809fa43c51d2ce99cb5c52b9Jeff Smith } 499eb0b009971653400809fa43c51d2ce99cb5c52b9Jeff Smith 5000b836342e21b4de21d1d452d5b43b54a364a35c6Jeff Smith protected boolean writeCommentIfResourceId(IndentingWriter writer, int val) throws IOException { 501eb0b009971653400809fa43c51d2ce99cb5c52b9Jeff Smith Map<Integer,String> resourceIds = methodDef.classDef.options.resourceIds; 50220b7bbf63e7c689316b8fbc28ecd1212ab4fe6b9Jeff Smith String resource = resourceIds.get(Integer.valueOf(val)); 50320b7bbf63e7c689316b8fbc28ecd1212ab4fe6b9Jeff Smith if (resource != null) { 5047e9231a211bf00451229d88edb5c7fbd5085f73eJeff Smith writer.write(" # "); 50520b7bbf63e7c689316b8fbc28ecd1212ab4fe6b9Jeff Smith writer.write(resource); 5069cc35b2d05c6d97cc753b9cc956ea93a8b176c19Jeff Smith return true; 5077e9231a211bf00451229d88edb5c7fbd5085f73eJeff Smith } 5089cc35b2d05c6d97cc753b9cc956ea93a8b176c19Jeff Smith return false; 5097e9231a211bf00451229d88edb5c7fbd5085f73eJeff Smith } 510e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver 511e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver protected void writeFieldOffset(IndentingWriter writer) throws IOException { 5126eae34831fee1f116f3a453bdc5e143d68e05e03JesusFreke@JesusFreke.com writer.write("field@0x"); 513e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver writer.printUnsignedLongAsHex(((FieldOffsetInstruction)instruction).getFieldOffset()); 514b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com } 5150c65e0f4f54ead8fd2832c954d516367b3556ae3JesusFreke@JesusFreke.com 516b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver protected void writeInlineIndex(IndentingWriter writer) throws IOException { 5172a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver writer.write("inline@"); 5182a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver writer.printSignedIntAsDec(((InlineIndexInstruction)instruction).getInlineIndex()); 5192a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver } 520b0c62b9781751e4d04d2ddb4458940d545cc8bb2Ben Gruver 5210b2f7d6a57e90424b3ee455c041aab3996c05f2cJesusFreke@JesusFreke.com protected void writeVtableIndex(IndentingWriter writer) throws IOException { 5228a151ae671f6d5c99d55779005580834b49187f0Ben Gruver writer.write("vtable@"); 5238a151ae671f6d5c99d55779005580834b49187f0Ben Gruver writer.printSignedIntAsDec(((VtableIndexInstruction)instruction).getVtableIndex()); 5248a151ae671f6d5c99d55779005580834b49187f0Ben Gruver } 525b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com} 526