Use the gvec infrastructure to achieve the desired functionality. Signed-off-by: Jan Bobek <jan.bo...@gmail.com> --- target/i386/ops_sse.h | 2 -- target/i386/ops_sse_header.h | 1 - target/i386/translate.c | 27 +++++++++++++++++++++++++-- 3 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/target/i386/ops_sse.h b/target/i386/ops_sse.h index b3ba23287d..8b4ac9115e 100644 --- a/target/i386/ops_sse.h +++ b/target/i386/ops_sse.h @@ -354,7 +354,6 @@ static inline int satsw(int x) #define FMAXSW(a, b) ((int16_t)(a) > (int16_t)(b)) ? (a) : (b) #define FANDN(a, b) ((~(a)) & (b)) -#define FOR(a, b) ((a) | (b)) #define FXOR(a, b) ((a) ^ (b)) #define FCMPGTB(a, b) ((int8_t)(a) > (int8_t)(b) ? -1 : 0) @@ -397,7 +396,6 @@ SSE_HELPER_W(helper_pminsw, FMINSW) SSE_HELPER_W(helper_pmaxsw, FMAXSW) SSE_HELPER_Q(helper_pandn, FANDN) -SSE_HELPER_Q(helper_por, FOR) SSE_HELPER_Q(helper_pxor, FXOR) SSE_HELPER_B(helper_pcmpgtb, FCMPGTB) diff --git a/target/i386/ops_sse_header.h b/target/i386/ops_sse_header.h index 63b4376389..6a732ee489 100644 --- a/target/i386/ops_sse_header.h +++ b/target/i386/ops_sse_header.h @@ -87,7 +87,6 @@ SSE_HELPER_W(pminsw, FMINSW) SSE_HELPER_W(pmaxsw, FMAXSW) SSE_HELPER_Q(pandn, FANDN) -SSE_HELPER_Q(por, FOR) SSE_HELPER_Q(pxor, FXOR) SSE_HELPER_B(pcmpgtb, FCMPGTB) diff --git a/target/i386/translate.c b/target/i386/translate.c index 3821733a4e..28cd84432d 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -2758,7 +2758,7 @@ static const SSEFunc_0_epp sse_op_table1[256][4] = { [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 */ - [0x56] = { gen_helper_por_xmm, gen_helper_por_xmm }, /* orps, orpd */ + [0x56] = { SSE_TOMBSTONE, SSE_TOMBSTONE }, /* orps, orpd */ [0x57] = { gen_helper_pxor_xmm, gen_helper_pxor_xmm }, /* xorps, xorpd */ [0x58] = SSE_FOP(add), [0x59] = SSE_FOP(mul), @@ -2841,7 +2841,7 @@ static const SSEFunc_0_epp sse_op_table1[256][4] = { [0xe8] = MMX_OP2(psubsb), [0xe9] = MMX_OP2(psubsw), [0xea] = MMX_OP2(pminsw), - [0xeb] = MMX_OP2(por), + [0xeb] = { SSE_TOMBSTONE, SSE_TOMBSTONE }, [0xec] = MMX_OP2(paddsb), [0xed] = MMX_OP2(paddsw), [0xee] = MMX_OP2(pmaxsw), @@ -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_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) +#define gen_vpor_ymm(env, s, modrm) gen_gvec_ld_modrm_vymm((env), (s), (modrm), MO_64, tcg_gen_gvec_or, 0123) +#define gen_orps_xmm gen_por_xmm +#define gen_vorps_xmm gen_vpor_xmm +#define gen_vorps_ymm gen_vpor_ymm +#define gen_orpd_xmm gen_por_xmm +#define gen_vorpd_xmm gen_vpor_xmm +#define gen_vorpd_ymm gen_vpor_ymm + static void gen_sse(CPUX86State *env, DisasContext *s, int b) { int b1, op1_offset, op2_offset, is_xmm, val; @@ -3278,6 +3289,18 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b) case 0x54 | M_0F | P_66: gen_andpd_xmm(env, s, modrm); return; 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 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; + case 0xeb | M_0F | P_66 | VEX_256: gen_vpor_ymm(env, s, modrm); return; + case 0x56 | M_0F: gen_orps_xmm(env, s, modrm); return; + case 0x56 | M_0F | VEX_128: gen_vorps_xmm(env, s, modrm); return; + case 0x56 | M_0F | VEX_256: gen_vorps_ymm(env, s, modrm); return; + case 0x56 | M_0F | P_66: gen_orpd_xmm(env, s, modrm); return; + case 0x56 | M_0F | P_66 | VEX_128: gen_vorpd_xmm(env, s, modrm); return; + case 0x56 | M_0F | P_66 | VEX_256: gen_vorpd_ymm(env, s, modrm); return; + default: break; } -- 2.20.1