* @param reg register to load the item to
*/
final void loadTo(EmitterContext ec, X86Register.GPR reg) {
if (VmUtils.verifyAssertions())
VmUtils._assert(reg != null, "Reg != null");
final X86Assembler os = ec.getStream();
final X86RegisterPool pool = ec.getGPRPool();
final VirtualStack stack = ec.getVStack();
final X86CompilerHelper helper = ec.getHelper();
if (VmUtils.verifyAssertions()) {
VmUtils._assert(!pool.isFree(reg), "reg not free");
}
switch (getKind()) {
case Kind.GPR:
if (this.gpr != reg) {
os.writeMOV(reg.getSize(), reg, this.gpr);
cleanup(ec);
}
break;
case Kind.LOCAL:
os.writeMOV(reg.getSize(), reg, helper.BP, getOffsetToFP(ec));
break;
case Kind.CONSTANT:
loadToConstant(ec, os, reg);
break;
case Kind.FPUSTACK:
// Make sure this item is on top of the FPU stack
FPUHelper.fxch(os, stack.fpuStack, this);
stack.fpuStack.pop(this);
// Convert & move to new space on normal stack
os.writeLEA(helper.SP, helper.SP, -helper.SLOTSIZE);
popFromFPU(os, helper.SP, 0);
os.writePOP(reg);
break;
case Kind.STACK:
// TODO: make sure 'this' is on top of stack
// TODO: implemen it for 64 bits
if (!stack.operandStack.isTos(this)) {
int stack_loc = stack.operandStack.stackLocation(this);
if (stack_loc < 0)
throw new StackException("Item not found on stack");
stack.operandStack.makeTop(stack_loc);
//todo test it
os.writeMOV(org.jnode.vm.x86.compiler.X86CompilerConstants.BITS32, reg, helper.SP, helper.SLOTSIZE);
os.writeXCHG(helper.SP, org.jnode.vm.x86.compiler.X86CompilerConstants.BITS32 * stack_loc, reg);
os.writeMOV(org.jnode.vm.x86.compiler.X86CompilerConstants.BITS32, helper.SP, helper.SLOTSIZE, reg);
}
if (VirtualStack.checkOperandStack) {
stack.operandStack.pop(this);
}
os.writePOP(reg);
break;
default:
throw new IllegalArgumentException("Invalid item kind");
}