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