Example #1
0
  /** @see org.jnode.vm.x86.compiler.l1a.Item#clone() */
  protected Item clone(EmitterContext ec) {
    final WordItem res;
    final X86Assembler os = ec.getStream();

    switch (getKind()) {
      case Kind.GPR:
        res = L1AHelper.requestWordRegister(ec, getType(), false);
        final GPR r = res.getRegister();
        os.writeMOV(gpr.getSize(), r, gpr);
        break;

      case Kind.LOCAL:
        res = (WordItem) factory.createLocal(getType(), getOffsetToFP(ec));
        break;

      case Kind.CONSTANT:
        res = cloneConstant(ec);
        break;

      case Kind.FPUSTACK:
        // TODO
        notImplemented();
        res = null;
        break;

      case Kind.STACK:
        os.writePUSH(X86Register.ESP, 0);
        res = (WordItem) factory.createStack(getType());
        if (VirtualStack.checkOperandStack) {
          final ItemStack operandStack = ec.getVStack().operandStack;
          operandStack.pop(this);
          operandStack.push(this);
          operandStack.push(res);
        }
        break;

      default:
        throw new IllegalArgumentException("Invalid item kind");
    }
    return res;
  }