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