Index: trunk/vm/jitrino/src/jet/cg_instr.cpp =================================================================== --- trunk/vm/jitrino/src/jet/cg_instr.cpp (revision 594020) +++ trunk/vm/jitrino/src/jet/cg_instr.cpp (working copy) @@ -123,6 +123,18 @@ //JVMTI helper takes field handle, method handle, byte code location, pointer //to reference for fields or NULL for statics, pointer to field value +#ifndef _EM64T_ + // Workaround since do_mov do not put jlong on stack in gen_args on ia32 + const CallSig cs_ti_fmodif(CCONV_HELPERS, jobj, jobj, i32, i32, jobj, jobj); + Val vlocation((jlong)m_pc); + Val vlocationHi((jlong)0); +#else + const CallSig cs_ti_fmodif(CCONV_HELPERS, jobj, jobj, i64, jobj, jobj); + Val vlocation((jlong)m_pc); +#endif + + rlock(cs_ti_fmodif); + AR fieldValBaseAr = valloc(jobj); Val fieldValPtr = Val(jobj, fieldValBaseAr); rlock(fieldValPtr); @@ -141,18 +153,7 @@ Opnd stackTop(jobj, m_base, voff(m_stack.unused())); lea(fieldValPtr.as_opnd(), stackTop); } - runlock(fieldValPtr); -#ifndef _EM64T_ - // Workaround since do_mov do not put jlong on stack in gen_args on ia32 - const CallSig cs_ti_fmodif(CCONV_HELPERS, jobj, jobj, i32, i32, jobj, jobj); - Val vlocation((jlong)m_pc); - Val vlocationHi((jlong)0); -#else - const CallSig cs_ti_fmodif(CCONV_HELPERS, jobj, jobj, i64, jobj, jobj); - Val vlocation((jlong)m_pc); -#endif - Val vfield(jobj, fld); Val vmeth(jobj, m_method); Val vobject = Val(jobj, NULL); @@ -173,9 +174,10 @@ gen_gc_stack(-1, true); // 3. Call VM - rlock(cs_ti_fmodif); AR gr = valloc(jobj); call( is_set(DBG_CHECK_STACK), gr, rt_helper_ti_field_modification, cs_ti_fmodif, cs_ti_fmodif.count()); + + runlock(fieldValPtr); runlock(cs_ti_fmodif); //Restore operand stack state and scratch registers