예제 #1
0
  /** {@inheritDoc} */
  @Override
  public void writeTo(AnnotatedOutput out, DalvInsn insn) {
    RegisterSpecList regs = insn.getRegisters();
    int cpi = ((CstInsn) insn).getIndex();

    write(out, opcodeUnit(insn, regs.get(0).getReg()), (short) cpi);
  }
예제 #2
0
  /** {@inheritDoc} */
  @Override
  public void writeTo(AnnotatedOutput out, DalvInsn insn) {
    RegisterSpecList regs = insn.getRegisters();
    int offset = ((TargetInsn) insn).getTargetOffset();

    write(out, opcodeUnit(insn, regs.get(0).getReg()), (short) offset, (short) (offset >> 16));
  }
예제 #3
0
  /** {@inheritDoc} */
  @Override
  public boolean isCompatible(DalvInsn insn) {
    RegisterSpecList regs = insn.getRegisters();

    return (insn instanceof TargetInsn)
        && (regs.size() == 1)
        && unsignedFitsInByte(regs.get(0).getReg());
  }
예제 #4
0
  /** {@inheritDoc} */
  @Override
  public boolean isCompatible(DalvInsn insn) {
    if (!((insn instanceof TargetInsn) && (insn.getRegisters().size() == 0))) {
      return false;
    }

    TargetInsn ti = (TargetInsn) insn;
    return ti.hasTargetOffset() ? branchFits(ti) : true;
  }
예제 #5
0
  /** {@inheritDoc} */
  @Override
  public boolean isCompatible(DalvInsn insn) {
    if (!(insn instanceof CstInsn)) {
      return false;
    }

    RegisterSpecList regs = insn.getRegisters();
    RegisterSpec reg;

    switch (regs.size()) {
      case 1:
        {
          reg = regs.get(0);
          break;
        }
      case 2:
        {
          /*
           * This format is allowed for ops that are effectively
           * 2-arg but where the two args are identical.
           */
          reg = regs.get(0);
          if (reg.getReg() != regs.get(1).getReg()) {
            return false;
          }
          break;
        }
      default:
        {
          return false;
        }
    }

    if (!unsignedFitsInByte(reg.getReg())) {
      return false;
    }

    CstInsn ci = (CstInsn) insn;
    int cpi = ci.getIndex();

    if (!unsignedFitsInShort(cpi)) {
      return false;
    }

    Constant cst = ci.getConstant();
    return (cst instanceof CstType) || (cst instanceof CstFieldRef) || (cst instanceof CstString);
  }
예제 #6
0
파일: Form21c.java 프로젝트: disigma/buck
  /** {@inheritDoc} */
  @Override
  public BitSet compatibleRegs(DalvInsn insn) {
    RegisterSpecList regs = insn.getRegisters();
    int sz = regs.size();
    BitSet bits = new BitSet(sz);
    boolean compat = unsignedFitsInByte(regs.get(0).getReg());

    if (sz == 1) {
      bits.set(0, compat);
    } else {
      if (regs.get(0).getReg() == regs.get(1).getReg()) {
        bits.set(0, compat);
        bits.set(1, compat);
      }
    }

    return bits;
  }
예제 #7
0
 /** {@inheritDoc} */
 @Override
 public String insnArgString(DalvInsn insn) {
   RegisterSpecList regs = insn.getRegisters();
   return regs.get(0).regString() + ", " + cstString(insn);
 }