}
case TOINT: {
if (VmUtils.verifyAssertions()) VmUtils._assert(!isstatic);
final WordItem addr = vstack.popRef();
addr.load(ec);
X86Register r = addr.getRegister();
if (os.isCode64()) {
r = pool.getRegisterInSameGroup(r, JvmType.INT);
// We just take the lower 32-bit, so no actual mov's needed.
}
addr.release(ec);
L1AHelper.requestRegister(ec, r);
final IntItem result = (IntItem) ifac.createReg(ec, JvmType.INT, r);
pool.transferOwnerTo(r, result);
vstack.push(result);
break;
}
case TOWORD:
case TOADDRESS:
case TOOFFSET:
case TOOBJECT:
case TOOBJECTREFERENCE:
case TOEXTENT: {
if (VmUtils.verifyAssertions()) VmUtils._assert(!isstatic);
final WordItem addr = vstack.popRef();
vstack.push(addr);
break;
}
case TOLONG: {
if (VmUtils.verifyAssertions()) VmUtils._assert(!isstatic);
final WordItem addr = vstack.popRef();
addr.load(ec);
final X86Register.GPR r = addr.getRegister();
addr.release(ec);
L1AHelper.requestRegister(ec, r);
final LongItem result;
if (os.isCode32()) {
final X86Register.GPR msb = (X86Register.GPR) L1AHelper.requestRegister(ec, JvmType.INT,
false);
result = (LongItem) ifac.createReg(ec, JvmType.LONG, r,
msb);
os.writeXOR(msb, msb);
pool.transferOwnerTo(msb, result);
} else {
result = (LongItem) ifac.createReg(ec, JvmType.LONG, (GPR64) r);
}
pool.transferOwnerTo(r, result);
vstack.push(result);
break;
}
case MAX: {
if (VmUtils.verifyAssertions()) VmUtils._assert(isstatic);
final RefItem result = (RefItem) L1AHelper.requestWordRegister(ec,
JvmType.REFERENCE, false);
final GPR r = result.getRegister();
os.writeMOV_Const(r, -1);
vstack.push(result);
break;
}
case ONE: {
if (VmUtils.verifyAssertions()) VmUtils._assert(isstatic);
final RefItem result = (RefItem) L1AHelper.requestWordRegister(ec,
JvmType.REFERENCE, false);
final GPR r = result.getRegister();
os.writeMOV_Const(r, 1);
vstack.push(result);
break;
}
case ZERO:
case NULLREFERENCE: {
if (VmUtils.verifyAssertions()) VmUtils._assert(isstatic);
final RefItem result = ifac.createAConst(ec, null);
vstack.push(result);
break;
}
case SIZE: {
if (VmUtils.verifyAssertions()) VmUtils._assert(isstatic);
final IntItem result = ifac.createIConst(ec, slotSize);
vstack.push(result);
break;
}
case ISMAX: {
if (VmUtils.verifyAssertions()) VmUtils._assert(!isstatic);
final WordItem addr = vstack.popRef();
addr.load(ec);
final IntItem result = (IntItem) L1AHelper.requestWordRegister(ec, JvmType.INT, true);
final GPR addrr = addr.getRegister();
final GPR resultr = result.getRegister();
os.writeXOR(resultr, resultr);
os.writeCMP_Const(addrr, -1);
os.writeSETCC(resultr, X86Constants.JE);
addr.release(ec);
vstack.push(result);
break;
}
case ISZERO:
case ISNULL: {
// Just convert to int
if (VmUtils.verifyAssertions()) VmUtils._assert(!isstatic);
final WordItem addr = vstack.popRef();
addr.load(ec);
final IntItem result = (IntItem) L1AHelper.requestWordRegister(ec, JvmType.INT, true);
final GPR addrr = addr.getRegister();
final GPR resultr = result.getRegister();
os.writeXOR(resultr, resultr);
os.writeTEST(addrr, addrr);
os.writeSETCC(resultr, X86Constants.JZ);
addr.release(ec);
vstack.push(result);
break;
}
case EQUALS:
case EQ:
case NE:
case LT:
case LE:
case GE:
case GT:
case SLT:
case SLE:
case SGE:
case SGT: {
// addr .. other
if (VmUtils.verifyAssertions()) VmUtils._assert(!isstatic);
final RefItem other = vstack.popRef();
final RefItem addr = vstack.popRef();
other.load(ec);
addr.load(ec);
final IntItem result = (IntItem) L1AHelper.requestWordRegister(ec, JvmType.INT, true);
final GPR resultr = result.getRegister();
os.writeXOR(resultr, resultr);
os.writeCMP(addr.getRegister(), other.getRegister());
os.writeSETCC(resultr, methodToCC(mcode));
other.release(ec);
addr.release(ec);
vstack.push(result);
break;
}
case FROMINT:
case FROMINTSIGNEXTEND:
case FROMINTZEROEXTEND: {
if (VmUtils.verifyAssertions()) VmUtils._assert(isstatic);
final WordItem addr = vstack.popInt();
addr.load(ec);
GPR r = addr.getRegister();
if (os.isCode64()) {
final GPR64 newR = (GPR64) pool.getRegisterInSameGroup(r, JvmType.REFERENCE);
if (mcode == FROMINTZEROEXTEND) {
// Moving the register to itself in 32-bit mode, will
// zero extend the top 32-bits.
os.writeMOV(BITS32, r, r);
} else {
// Sign extend
os.writeMOVSXD(newR, (GPR32) r);
}
r = newR;
}
addr.release(ec);
vstack.push(L1AHelper.requestWordRegister(ec, JvmType.REFERENCE, r));
break;
}
case FROMADDRESS:
case FROMOBJECT: {
if (VmUtils.verifyAssertions()) VmUtils._assert(isstatic);
final RefItem obj = vstack.popRef();
// Do nothing
vstack.push(obj);
break;
}
case FROMLONG: {
if (VmUtils.verifyAssertions()) VmUtils._assert(isstatic);
final LongItem addr = vstack.popLong();
addr.load(ec);
final X86Register r;
if (os.isCode32()) {
r = addr.getLsbRegister(ec);
} else {
r = addr.getRegister(ec);
}