Index: vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (revision 673668) +++ vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (working copy) @@ -1155,9 +1155,17 @@ return instList; }else{ #ifdef _EM64T_ - if((targetOpnd->getMemOpndKind() == MemOpndKind_StackAutoLayout) - && (sourceOpnd->isPlacedIn(OpndKind_Imm)) && (sourceOpnd->getSize() == OpndSize_64)) - return newMemMovSequence(targetOpnd, sourceOpnd, regUsageMask, false); + if(targetOpnd->isPlacedIn(OpndKind_Mem) + && sourceOpnd->isPlacedIn(OpndKind_Imm) + && sourceOpnd->getSize() == OpndSize_64) + { + int64 imm = sourceOpnd->getImmValue(); + if ((imm >= 0) && (imm <= INT_MAX)) { + return newInst(Mnemonic_MOV, targetOpnd, newImmOpnd(typeManager.getInt32Type(), imm)); + } else { + return newMemMovSequence(targetOpnd, sourceOpnd, regUsageMask, false); + } + } else #else assert(sourceByteSize<=4); Index: vm/jitrino/src/codegenerator/ia32/Ia32APIMagics.cpp =================================================================== --- vm/jitrino/src/codegenerator/ia32/Ia32APIMagics.cpp (revision 673668) +++ vm/jitrino/src/codegenerator/ia32/Ia32APIMagics.cpp (working copy) @@ -519,8 +519,6 @@ Opnd* srcAddr = addElemIndexWithLEA(src,srcPos,srcAddrRegName,currNode); Opnd* dstAddr = addElemIndexWithLEA(dst,dstPos,dstAddrRegName,currNode); - Opnd* one = irm->newImmOpnd(typeManager.getInt8Type(), 1); - Mnemonic mn = Mnemonic_NULL; Type* elemType = src->getType()->asArrayType()->getElementType(); OpndSize typeSize = IRManager::getTypeSize(elemType->tag); @@ -530,16 +528,23 @@ case OpndSize_32: mn = Mnemonic_MOVS32; break; case OpndSize_64: { - /** - * FIXME - * Currently JIT erroneously supposes that compressed mode is always on. - * So if type is object, it is actually compressed (32-bit sized). - * But IRManager::getTypeSize() "correctly" returns OpndSize_64. +#ifdef _EM64T_ + /** + * In compressed mode array elements are compressed (32-bit sized). + * But IRManager::getTypeSize() "correctly" (FIXME type system??) returns OpndSize_64. */ - if (!elemType->isObject()) { - currNode->appendInst(irm->newInstEx(Mnemonic_SHL, 1, counter, counter, one)); + if (irm->refsAreCompressed() && elemType->isObject()) { + mn = Mnemonic_MOVS32; + } else { + mn = Mnemonic_MOVS64; } +#else + assert(!elemType->isObject()); + // there are no MOVSQ on ia32, so double counter + Opnd* one = irm->newImmOpnd(typeManager.getInt8Type(), 1); + currNode->appendInst(irm->newInstEx(Mnemonic_SHL, 1, counter, counter, one)); mn = Mnemonic_MOVS32; +#endif // _EM64T_ } break; default: assert(0); mn = Mnemonic_MOVS32; break;