Use the gvec infrastructure to achieve the desired functionality. Signed-off-by: Jan Bobek <jan.bo...@gmail.com> --- target/i386/ops_sse.h | 4 ---- target/i386/ops_sse_header.h | 2 -- target/i386/translate.c | 26 ++++++++++++++++++++++++-- 3 files changed, 24 insertions(+), 8 deletions(-)
diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index 68dbeda047..84562a4536 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -353,8 +353,6 @@ static inline int satsw(int x) #define FMAXUB(a, b) ((a) > (b)) ? (a) : (b) #define FMAXSW(a, b) ((int16_t)(a) > (int16_t)(b)) ? (a) : (b) -#define FANDN(a, b) ((~(a)) & (b)) - #define FCMPGTB(a, b) ((int8_t)(a) > (int8_t)(b) ? -1 : 0) #define FCMPGTW(a, b) ((int16_t)(a) > (int16_t)(b) ? -1 : 0) #define FCMPGTL(a, b) ((int32_t)(a) > (int32_t)(b) ? -1 : 0) @@ -394,8 +392,6 @@ SSE_HELPER_B(helper_pmaxub, FMAXUB) SSE_HELPER_W(helper_pminsw, FMINSW) SSE_HELPER_W(helper_pmaxsw, FMAXSW) -SSE_HELPER_Q(helper_pandn, FANDN) - SSE_HELPER_B(helper_pcmpgtb, FCMPGTB) SSE_HELPER_W(helper_pcmpgtw, FCMPGTW) SSE_HELPER_L(helper_pcmpgtl, FCMPGTL) diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index a98b9f8f3f..abd00ca69d 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -86,8 +86,6 @@ SSE_HELPER_B(pmaxub, FMAXUB) SSE_HELPER_W(pminsw, FMINSW) SSE_HELPER_W(pmaxsw, FMAXSW) -SSE_HELPER_Q(pandn, FANDN) - SSE_HELPER_B(pcmpgtb, FCMPGTB) SSE_HELPER_W(pcmpgtw, FCMPGTW) SSE_HELPER_L(pcmpgtl, FCMPGTL) diff --git a/target/i386/translate.c b/target/i386/translate.c index cfe285e3e5..69e9514679 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -2757,7 +2757,7 @@ static const SSEFunc_0_epp sse_op_table1[256][4] = { [0x52] = { gen_helper_rsqrtps, NULL, gen_helper_rsqrtss, NULL }, [0x53] = { gen_helper_rcpps, NULL, gen_helper_rcpss, NULL }, [0x54] = { SSE_TOMBSTONE, SSE_TOMBSTONE }, /* andps, andpd */ - [0x55] = { gen_helper_pandn_xmm, gen_helper_pandn_xmm }, /* andnps, andnpd */ + [0x55] = { SSE_TOMBSTONE, SSE_TOMBSTONE }, /* andnps, andnpd */ [0x56] = { SSE_TOMBSTONE, SSE_TOMBSTONE }, /* orps, orpd */ [0x57] = { SSE_TOMBSTONE, SSE_TOMBSTONE }, /* xorps, xorpd */ [0x58] = SSE_FOP(add), @@ -2829,7 +2829,7 @@ static const SSEFunc_0_epp sse_op_table1[256][4] = { [0xdc] = MMX_OP2(paddusb), [0xdd] = MMX_OP2(paddusw), [0xde] = MMX_OP2(pmaxub), - [0xdf] = MMX_OP2(pandn), + [0xdf] = { SSE_TOMBSTONE, SSE_TOMBSTONE }, [0xe0] = MMX_OP2(pavgb), [0xe1] = MMX_OP2(psraw), [0xe2] = MMX_OP2(psrad), @@ -3177,6 +3177,17 @@ static inline void gen_gvec_ld_modrm_3(CPUX86State *env, DisasContext *s, #define gen_vandpd_xmm gen_vpand_xmm #define gen_vandpd_ymm gen_vpand_ymm +#define gen_pandn_mm(env, s, modrm) gen_gvec_ld_modrm_mm ((env), (s), (modrm), MO_64, tcg_gen_gvec_andc, 0121) +#define gen_pandn_xmm(env, s, modrm) gen_gvec_ld_modrm_xmm ((env), (s), (modrm), MO_64, tcg_gen_gvec_andc, 0121) +#define gen_vpandn_xmm(env, s, modrm) gen_gvec_ld_modrm_vxmm((env), (s), (modrm), MO_64, tcg_gen_gvec_andc, 0132) +#define gen_vpandn_ymm(env, s, modrm) gen_gvec_ld_modrm_vymm((env), (s), (modrm), MO_64, tcg_gen_gvec_andc, 0132) +#define gen_andnps_xmm gen_pandn_xmm +#define gen_vandnps_xmm gen_vpandn_xmm +#define gen_vandnps_ymm gen_vpandn_ymm +#define gen_andnpd_xmm gen_pandn_xmm +#define gen_vandnpd_xmm gen_vpandn_xmm +#define gen_vandnpd_ymm gen_vpandn_ymm + #define gen_por_mm(env, s, modrm) gen_gvec_ld_modrm_mm ((env), (s), (modrm), MO_64, tcg_gen_gvec_or, 0112) #define gen_por_xmm(env, s, modrm) gen_gvec_ld_modrm_xmm ((env), (s), (modrm), MO_64, tcg_gen_gvec_or, 0112) #define gen_vpor_xmm(env, s, modrm) gen_gvec_ld_modrm_vxmm((env), (s), (modrm), MO_64, tcg_gen_gvec_or, 0123) @@ -3301,6 +3312,17 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b) case 0x54 | M_0F | P_66 | VEX_128: gen_vandpd_xmm(env, s, modrm); return; case 0x54 | M_0F | P_66 | VEX_256: gen_vandpd_ymm(env, s, modrm); return; + case 0xdf | M_0F: gen_pandn_mm(env, s, modrm); return; + case 0xdf | M_0F | P_66: gen_pandn_xmm(env, s, modrm); return; + case 0xdf | M_0F | P_66 | VEX_128: gen_vpandn_xmm(env, s, modrm); return; + case 0xdf | M_0F | P_66 | VEX_256: gen_vpandn_ymm(env, s, modrm); return; + case 0x55 | M_0F: gen_andnps_xmm(env, s, modrm); return; + case 0x55 | M_0F | VEX_128: gen_vandnps_xmm(env, s, modrm); return; + case 0x55 | M_0F | VEX_256: gen_vandnps_ymm(env, s, modrm); return; + case 0x55 | M_0F | P_66: gen_andnpd_xmm(env, s, modrm); return; + case 0x55 | M_0F | P_66 | VEX_128: gen_vandnpd_xmm(env, s, modrm); return; + case 0x55 | M_0F | P_66 | VEX_256: gen_vandnpd_ymm(env, s, modrm); return; + case 0xeb | M_0F: gen_por_mm(env, s, modrm); return; case 0xeb | M_0F | P_66: gen_por_xmm(env, s, modrm); return; case 0xeb | M_0F | P_66 | VEX_128: gen_vpor_xmm(env, s, modrm); return; -- 2.20.1