Index: vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (revision 518618) +++ vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (working copy) @@ -1280,13 +1280,16 @@ Opnd * opnd=getOpnd(i); if (opnd->isPlacedIn(regKind)) gpTotalRegUsage |= getRegMask(opnd->getRegName()); - } #ifdef _EM64T_ - //FIXME!! - gpTotalRegUsage |= getRegMask(RegName_R15); - gpTotalRegUsage |= getRegMask(RegName_R13); - gpTotalRegUsage |= getRegMask(RegName_R14); + if(opnd->isPlacedIn(OpndKind_Imm)) { + Opnd::RuntimeInfo * ri=opnd->getRuntimeInfo(); + if( ri && ri->getKind() == Opnd::RuntimeInfo::Kind_MethodDirectAddr) { + // r14 is used on EM64T when offset for immediate call does not fit into 32 bits + gpTotalRegUsage |= getRegMask(RegName_R14); + } + } #endif + } } //_________________________________________________________________________________________________ uint32 IRManager::getTotalRegUsage(OpndKind regKind)const { Index: vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp (revision 518618) +++ vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp (working copy) @@ -233,25 +233,9 @@ RegName indexReg = pindex == NULL ? RegName_Null : pindex->getRegName(); #ifdef _EM64T_ // adapter: all PTR types go as 64 bits - const RegName TMP_BASE = RegName_R13; - bool is_ptr = is_ptr_type(p->getType()); - if (pindex== NULL && pbase == NULL) { - // have only displacement - load displacement to register - RegName reg = (RegName)(TMP_BASE + args.count()); - OPNDS tmp(reg, OPND(OpndSize_64, pdisp->getImmValue())); - stream = (uint8*)EncoderBase::encode((char*)stream, Mnemonic_MOV, tmp); - OPND mem(sz, reg, 0); - args.add(mem); - } - else { - EncoderBase::Operand o(is_ptr ? OpndSize_64 : sz, - baseReg, indexReg, - NULL == pscale ? 0 : (unsigned char)pscale->getImmValue(), - disp - ); - args.add(o); - } -#else + assert(pindex != NULL || pbase != NULL); + sz = is_ptr_type(p->getType()) ? OpndSize_64 : sz; +#endif EncoderBase::Operand o(sz, baseReg, indexReg, @@ -260,7 +244,6 @@ ); args.add( o ); -#endif } break; default: Index: vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (revision 518618) +++ vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (working copy) @@ -1788,13 +1788,9 @@ #ifndef _EM64T_ Opnd * addr=irManager.newImmOpnd(fieldRefType, Opnd::RuntimeInfo::Kind_StaticFieldAddress, fieldDesc); #else - Opnd * addr; - if(!fieldRefType->isReference()) { - addr = irManager.newOpnd(fieldRefType); - appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, addr, irManager.newImmOpnd(fieldRefType, Opnd::RuntimeInfo::Kind_StaticFieldAddress, fieldDesc))); - } else { - addr = irManager.newImmOpnd(irManager.getTypeFromTag(Type::CompressedObject), Opnd::RuntimeInfo::Kind_StaticFieldAddress, fieldDesc); - } + Opnd* immOp = irManager.newImmOpnd(fieldRefType, Opnd::RuntimeInfo::Kind_StaticFieldAddress, fieldDesc); + Opnd* addr = irManager.newOpnd(typeManager.getUnmanagedPtrType(fieldRefType)); + appendInsts(irManager.newCopyPseudoInst(Mnemonic_MOV, addr, immOp)); #endif return addr; }