Index: vm/port/src/encoder/ia32_em64t/encoder.inl =================================================================== --- vm/port/src/encoder/ia32_em64t/encoder.inl (revision 603895) +++ vm/port/src/encoder/ia32_em64t/encoder.inl (working copy) @@ -83,7 +83,12 @@ } inline static void add_xmm(EncoderBase::Operands & args, const XMM_Opnd & xmm, bool dbl) { - return args.add((RegName)( (dbl ? RegName_XMM0D : RegName_XMM0S) + xmm.get_idx())); + // Gregory - + // XMM registers indexes in Reg_No enum are shifted by xmm0_reg, their indexes + // don't start with 0, so it is necessary to subtract xmm0_reg index from + // xmm.get_idx() value + return args.add((RegName)( (dbl ? RegName_XMM0D : RegName_XMM0S) + xmm.get_idx() - + xmm0_reg)); } inline static void add_fp(EncoderBase::Operands & args, unsigned i, bool dbl) { Index: vm/port/src/encoder/ia32_em64t/enc_base.h =================================================================== --- vm/port/src/encoder/ia32_em64t/enc_base.h (revision 603895) +++ vm/port/src/encoder/ia32_em64t/enc_base.h (working copy) @@ -617,6 +617,9 @@ if (RegName_R8L <= reg && reg <= RegName_R15L) { return true; } + if (RegName_XMM8 <= reg && reg <= RegName_XMM15) { + return true; + } if (RegName_XMM8D <= reg && reg <= RegName_XMM15D) { return true; }