2 * Copyright (C) 2007 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.dx.dex.code.form;
19 import com.android.dx.dex.code.CstInsn;
20 import com.android.dx.dex.code.DalvInsn;
21 import com.android.dx.dex.code.InsnFormat;
22 import com.android.dx.rop.code.RegisterSpec;
23 import com.android.dx.rop.code.RegisterSpecList;
24 import com.android.dx.rop.cst.Constant;
25 import com.android.dx.rop.cst.CstFieldRef;
26 import com.android.dx.rop.cst.CstString;
27 import com.android.dx.rop.cst.CstType;
28 import com.android.dx.util.AnnotatedOutput;
30 import java.util.BitSet;
33 * Instruction format {@code 21c}. See the instruction format spec
36 public final class Form21c extends InsnFormat {
37 /** {@code non-null;} unique instance of this class */
38 public static final InsnFormat THE_ONE = new Form21c();
41 * Constructs an instance. This class is not publicly
42 * instantiable. Use {@link #THE_ONE}.
45 // This space intentionally left blank.
50 public String insnArgString(DalvInsn insn) {
51 RegisterSpecList regs = insn.getRegisters();
52 return regs.get(0).regString() + ", " + cstString(insn);
57 public String insnCommentString(DalvInsn insn, boolean noteIndices) {
59 return cstComment(insn);
67 public int codeSize() {
73 public boolean isCompatible(DalvInsn insn) {
74 if (!(insn instanceof CstInsn)) {
78 RegisterSpecList regs = insn.getRegisters();
81 switch (regs.size()) {
88 * This format is allowed for ops that are effectively
89 * 2-arg but where the two args are identical.
92 if (reg.getReg() != regs.get(1).getReg()) {
102 if (!unsignedFitsInByte(reg.getReg())) {
106 CstInsn ci = (CstInsn) insn;
107 int cpi = ci.getIndex();
108 Constant cst = ci.getConstant();
110 if (! unsignedFitsInShort(cpi)) {
114 return (cst instanceof CstType) ||
115 (cst instanceof CstFieldRef) ||
116 (cst instanceof CstString);
121 public BitSet compatibleRegs(DalvInsn insn) {
122 RegisterSpecList regs = insn.getRegisters();
123 int sz = regs.size();
124 BitSet bits = new BitSet(sz);
125 boolean compat = unsignedFitsInByte(regs.get(0).getReg());
130 if (regs.get(0).getReg() == regs.get(1).getReg()) {
141 public void writeTo(AnnotatedOutput out, DalvInsn insn) {
142 RegisterSpecList regs = insn.getRegisters();
143 int cpi = ((CstInsn) insn).getIndex();
146 opcodeUnit(insn, regs.get(0).getReg()),