The MOVHLPS instruction has a special operand: it reads the high quadword of the source operand (hence it requires the full double-quadword width), but if the operand is indirect, only 64-bits are read from memory. Introduce UdqMq operand to address this case.
Signed-off-by: Jan Bobek <jan.bo...@gmail.com> --- target/i386/translate.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/target/i386/translate.c b/target/i386/translate.c index 97614e5941..5802b324f0 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -4876,6 +4876,11 @@ INSNOP_LDST(UqMq, Uq, Mq, offsetof(CPUX86State, xmm_t0), gen_ldq_env_A0(s, reg + offsetof(ZMMReg, ZMM_Q(0)))), (assert(ptr == s->A0), gen_stq_env_A0(s, reg + offsetof(ZMMReg, ZMM_Q(0))))) +INSNOP_LDST(UdqMq, Udq, Mq, offsetof(CPUX86State, xmm_t0), + (assert(ptr == s->A0), + gen_ldq_env_A0(s, reg + offsetof(ZMMReg, ZMM_Q(0)))), + (assert(ptr == s->A0), + gen_stq_env_A0(s, reg + offsetof(ZMMReg, ZMM_Q(0))))) INSNOP_LDST(UdqMdq, Udq, Mdq, offsetof(CPUX86State, xmm_t0), (assert(ptr == s->A0), gen_ldo_env_A0(s, reg)), (assert(ptr == s->A0), gen_sto_env_A0(s, reg))) -- 2.20.1