@@ -84,16 +84,16 @@ DEF_SEM(MOVDQx, D dst, S src) {
8484 return memory;
8585}
8686
87- template <typename D, typename S>
88- DEF_SEM (MOVLPS, D dst, S src) {
87+ template <typename D, typename S, typename ... Fs >
88+ DEF_SEM (MOVLPS, D dst, Fs... _nop_fillers, S src) {
8989 auto src_vec = FReadV32 (src);
9090 auto low1 = FExtractV32 (src_vec, 0 );
9191 auto low2 = FExtractV32 (src_vec, 1 );
9292 FWriteV32 (dst, FInsertV32 (FInsertV32 (FReadV32 (dst), 0 , low1), 1 , low2));
9393 return memory;
9494}
9595
96- DEF_SEM (MOVLHPS, V128W dst, V128 src) {
96+ DEF_SEM (MOVLHPS, V128W dst, V128 _noop_read, V128 src) {
9797 auto res = FReadV32 (dst);
9898 auto src1 = FReadV32 (src);
9999 res = FInsertV32 (res, 2 , FExtractV32 (src1, 0 ));
@@ -102,7 +102,7 @@ DEF_SEM(MOVLHPS, V128W dst, V128 src) {
102102 return memory;
103103}
104104
105- DEF_SEM (MOVHLPS, V128W dst, V128 src) {
105+ DEF_SEM (MOVHLPS, V128W dst, V128 _nop_read, V128 src) {
106106 auto res = FReadV32 (dst);
107107 auto src1 = FReadV32 (src);
108108 res = FInsertV32 (res, 0 , FExtractV32 (src1, 2 ));
@@ -111,8 +111,8 @@ DEF_SEM(MOVHLPS, V128W dst, V128 src) {
111111 return memory;
112112}
113113
114- template <typename D, typename S>
115- DEF_SEM (MOVLPD, D dst, S src) {
114+ template <typename D, typename S, typename ... Fs >
115+ DEF_SEM (MOVLPD, D dst, Fs... fargs, S src) {
116116 FWriteV64 (dst, FInsertV64 (FReadV64 (dst), 0 , FExtractV64 (FReadV64 (src), 0 )));
117117 return memory;
118118}
@@ -466,8 +466,8 @@ DEF_ISEL(VMOVDQA_MEMqq_YMMqq) = MOVDQx<MV256W, VV256>;
466466DEF_ISEL (VMOVDQA_YMMqq_YMMqq_7F) = MOVDQx<VV256W, VV256>;
467467#endif // HAS_FEATURE_AVX
468468
469- DEF_ISEL (MOVLPS_MEMq_XMMps ) = MOVLPS<MV64W, V128>;
470- DEF_ISEL (MOVLPS_XMMq_MEMq) = MOVLPS<V128W, MV64>;
469+ DEF_ISEL (MOVLPS_MEMq_XMMq ) = MOVLPS<MV64W, V128>;
470+ DEF_ISEL (MOVLPS_XMMq_MEMq) = MOVLPS<V128W, MV64, V128 >;
471471IF_AVX (DEF_ISEL(VMOVLPS_MEMq_XMMq) = MOVLPS<MV64W, VV128>;)
472472IF_AVX (DEF_ISEL(VMOVLPS_XMMdq_XMMdq_MEMq) = VMOVLPS;)
473473
@@ -487,7 +487,7 @@ IF_AVX(DEF_ISEL(VMOVLHPS_XMMdq_XMMdq_XMMdq) = VMOVLHPS;)
487487# endif // HAS_FEATURE_AVX512
488488#endif // HAS_FEATURE_AVX
489489
490- DEF_ISEL (MOVLPD_XMMsd_MEMq) = MOVLPD<V128W, MV64>;
490+ DEF_ISEL (MOVLPD_XMMsd_MEMq) = MOVLPD<V128W, MV64, V128 >;
491491DEF_ISEL (MOVLPD_MEMq_XMMsd) = MOVLPD<MV64W, V128>;
492492IF_AVX (DEF_ISEL(VMOVLPD_MEMq_XMMq) = MOVLPD<MV64W, VV128>;)
493493IF_AVX (DEF_ISEL(VMOVLPD_XMMdq_XMMdq_MEMq) = VMOVLPD;)
@@ -585,7 +585,8 @@ DEF_ISEL(MOVNTSS_MEMd_XMMd) = MOVSS_MEM<MV32W, V128>;
585585
586586namespace {
587587
588- DEF_SEM (MOVHPD, V128W dst, MV64 src) {
588+ // NOTE(Ian): Latest xed adds a read operand referring to the read of lower bits.
589+ DEF_SEM (MOVHPD, V128W dst, V128 _nop_read, MV64 src) {
589590 FWriteV64 (dst, FInsertV64 (FReadV64 (dst), 1 , FExtractV64 (FReadV64 (src), 0 )));
590591 return memory;
591592}
@@ -616,7 +617,8 @@ IF_AVX(DEF_ISEL(VMOVHPD_MEMq_XMMdq) = MOVHPD_STORE;)
616617
617618namespace {
618619
619- DEF_SEM (MOVHPS, V128W dst, MV64 src) {
620+ // NOTE(Ian): Xed adds a read op for the bits read but not written to.
621+ DEF_SEM (MOVHPS, V128W dst, V128 _nop_read, MV64 src) {
620622 auto dst_vec = FReadV32 (dst);
621623 auto src_vec = FReadV32 (src);
622624 auto low_entry = FExtractV32 (src_vec, 0 );
0 commit comments