11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
20910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
40910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * you may not use this file except in compliance with the License.
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * You may obtain a copy of the License at
70910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *
80910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * See the License for the specific language governing permissions and
140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * limitations under the License.
150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpackage com.android.dexgen.dex.code.form;
180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectimport com.android.dexgen.dex.code.DalvInsn;
20137a4ca42423bbb6d683067ea544c9a48f18f06cDerek Sollenbergerimport com.android.dexgen.dex.code.InsnFormat;
210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectimport com.android.dexgen.dex.code.SimpleInsn;
220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectimport com.android.dexgen.rop.code.RegisterSpecList;
230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectimport com.android.dexgen.util.AnnotatedOutput;
240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
2540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger/**
26f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed * Instruction format {@code 22x}. See the instruction format spec
270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * for details.
280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */
290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectpublic final class Form22x extends InsnFormat {
300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** {@code non-null;} unique instance of this class */
3140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    public static final InsnFormat THE_ONE = new Form22x();
3240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger
3340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    /**
3440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger     * Constructs an instance. This class is not publicly
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     * instantiable. Use {@link #THE_ONE}.
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    private Form22x() {
380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        // This space intentionally left blank.
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** {@inheritDoc} */
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    @Override
430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    public String insnArgString(DalvInsn insn) {
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        RegisterSpecList regs = insn.getRegisters();
4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        return regs.get(0).regString() + ", " + regs.get(1).regString();
4640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger    }
4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** {@inheritDoc} */
4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger    @Override
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public String insnCommentString(DalvInsn insn, boolean noteIndices) {
5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger        // This format has no comment.
520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return "";
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /** {@inheritDoc} */
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    @Override
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public int codeSize() {
580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return 2;
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    /** {@inheritDoc} */
620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    @Override
63f294d10d594ac335ea3bd09caec89004d41edc5cMike Reed    public boolean isCompatible(DalvInsn insn) {
640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        RegisterSpecList regs = insn.getRegisters();
650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project
660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project        return (insn instanceof SimpleInsn) &&
670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            (regs.size() == 2) &&
680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            unsignedFitsInByte(regs.get(0).getReg()) &&
690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project            unsignedFitsInShort(regs.get(1).getReg());
700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project    }
71
72    /** {@inheritDoc} */
73    @Override
74    public InsnFormat nextUp() {
75        return Form23x.THE_ONE;
76    }
77
78    /** {@inheritDoc} */
79    @Override
80    public void writeTo(AnnotatedOutput out, DalvInsn insn) {
81        RegisterSpecList regs = insn.getRegisters();
82        write(out,
83              opcodeUnit(insn, regs.get(0).getReg()),
84              (short) regs.get(1).getReg());
85    }
86}
87