Index: vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (revision 520266) +++ vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (working copy) @@ -1281,12 +1281,6 @@ if (opnd->isPlacedIn(regKind)) gpTotalRegUsage |= getRegMask(opnd->getRegName()); } -#ifdef _EM64T_ - //FIXME!! - gpTotalRegUsage |= getRegMask(RegName_R15); - gpTotalRegUsage |= getRegMask(RegName_R13); - gpTotalRegUsage |= getRegMask(RegName_R14); -#endif } //_________________________________________________________________________________________________ uint32 IRManager::getTotalRegUsage(OpndKind regKind)const { @@ -1662,8 +1656,10 @@ void IRManager::finalizeCallSites() { + MethodDesc& md = getMethodDesc(); #ifdef _EM64T_ - if (!getMethodDesc().isStatic()) { + if (!md.isStatic() + && (md.isSynchronized() || md.isMethodClassIsLikelyExceptionType())) { Type* thisType = entryPointInst->getOpnd(0)->getType(); entryPointInst->thisOpnd = newMemOpnd(thisType, MemOpndKind_StackAutoLayout, getRegOpnd(STACK_REG), 0); entryPointInst->getBasicBlock()->appendInst(newCopyPseudoInst(Mnemonic_MOV, entryPointInst->thisOpnd, entryPointInst->getOpnd(0))); Index: vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32Encoder.cpp (revision 520266) +++ 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/Ia32StackInfo.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32StackInfo.cpp (revision 520266) +++ vm/jitrino/src/codegenerator/ia32/Ia32StackInfo.cpp (working copy) @@ -338,10 +338,15 @@ void StackInfo::registerInsts(IRManager& irm) { - if (!irm.getMethodDesc().isStatic()) { + MethodDesc& md = irm.getMethodDesc(); + if (!md.isStatic()) { #ifdef _EM64T_ - EntryPointPseudoInst * entryPointInst = irm.getEntryPointInst(); - offsetOfThis = (uint32)entryPointInst->thisOpnd->getMemOpndSubOpnd(MemOpndSubOpndKind_Displacement)->getImmValue(); + if ((md.isSynchronized() || md.isMethodClassIsLikelyExceptionType())) { + EntryPointPseudoInst * entryPointInst = irm.getEntryPointInst(); + offsetOfThis = (uint32)entryPointInst->thisOpnd->getMemOpndSubOpnd(MemOpndSubOpndKind_Displacement)->getImmValue(); + } else { + offsetOfThis = 0; + } #else EntryPointPseudoInst * entryPointInst = irm.getEntryPointInst(); offsetOfThis = (uint32)entryPointInst->getOpnd(0)->getMemOpndSubOpnd(MemOpndSubOpndKind_Displacement)->getImmValue(); Index: vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32InstCodeSelector.cpp (revision 520266) +++ 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; } Index: vm/jitrino/src/codegenerator/ia32/Ia32CodeEmitter.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32CodeEmitter.cpp (revision 520266) +++ vm/jitrino/src/codegenerator/ia32/Ia32CodeEmitter.cpp (working copy) @@ -520,7 +520,7 @@ Type* targetType = irManager->getTypeManager().getInt64Type(); Opnd* targetVal = irManager->newImmOpnd(targetType,(int64)targetCodeStartAddr); - Opnd* targetReg = irManager->newRegOpnd(targetType, RegName_R14); + Opnd* targetReg = irManager->newRegOpnd(targetType, RegName_R11); Inst* movInst = irManager->newInst(Mnemonic_MOV, targetReg, targetVal); @@ -605,12 +605,12 @@ /* EncoderBase::Operands args; args.clear(); - args.add(RegName_R14); + args.add(RegName_R11); // direct call is relative, but call use an absolute address to jump args.add(EncoderBase::Operand(OpndSize_64, (int64)targetAddr)); char * ip = EncoderBase::encode((char*)callAddr, Mnemonic_MOV, args); args.clear(); - args.add(RegName_R14); + args.add(RegName_R11); EncoderBase::encode(ip, Mnemonic_CALL, args); */ } else