X-Git-Url: https://repo.jachan.dev/qemu.git/blobdiff_plain/b8b6a50b552e1ddb9f0c563cbfb6f67aa0330b64..a9c87304b76d1d61687d585516abb4c6e0ae809e:/target-i386/ops_sse_header.h diff --git a/target-i386/ops_sse_header.h b/target-i386/ops_sse_header.h index f8e01f42c9..64c5857cf4 100644 --- a/target-i386/ops_sse_header.h +++ b/target-i386/ops_sse_header.h @@ -1,5 +1,5 @@ /* - * MMX/3DNow!/SSE/SSE2/SSE3/PNI support + * MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4/PNI support * * Copyright (c) 2005 Fabrice Bellard * @@ -14,241 +14,337 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * License along with this library; if not, see . */ #if SHIFT == 0 #define Reg MMXReg #define SUFFIX _mmx #else -#define Reg XMMReg +#define Reg ZMMReg #define SUFFIX _xmm #endif -void glue(helper_psrlw, SUFFIX)(Reg *d, Reg *s); -void glue(helper_psraw, SUFFIX)(Reg *d, Reg *s); -void glue(helper_psllw, SUFFIX)(Reg *d, Reg *s); -void glue(helper_psrld, SUFFIX)(Reg *d, Reg *s); -void glue(helper_psrad, SUFFIX)(Reg *d, Reg *s); -void glue(helper_pslld, SUFFIX)(Reg *d, Reg *s); -void glue(helper_psrlq, SUFFIX)(Reg *d, Reg *s); -void glue(helper_psllq, SUFFIX)(Reg *d, Reg *s); +#define dh_alias_Reg ptr +#define dh_alias_ZMMReg ptr +#define dh_alias_MMXReg ptr +#define dh_ctype_Reg Reg * +#define dh_ctype_ZMMReg ZMMReg * +#define dh_ctype_MMXReg MMXReg * +#define dh_is_signed_Reg dh_is_signed_ptr +#define dh_is_signed_ZMMReg dh_is_signed_ptr +#define dh_is_signed_MMXReg dh_is_signed_ptr + +DEF_HELPER_3(glue(psrlw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psraw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psllw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psrld, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psrad, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pslld, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psrlq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psllq, SUFFIX), void, env, Reg, Reg) #if SHIFT == 1 -void glue(helper_psrldq, SUFFIX)(Reg *d, Reg *s); -void glue(helper_pslldq, SUFFIX)(Reg *d, Reg *s); +DEF_HELPER_3(glue(psrldq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pslldq, SUFFIX), void, env, Reg, Reg) #endif #define SSE_HELPER_B(name, F)\ - void glue(name, SUFFIX) (Reg *d, Reg *s); + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) #define SSE_HELPER_W(name, F)\ - void glue(name, SUFFIX) (Reg *d, Reg *s); + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) #define SSE_HELPER_L(name, F)\ - void glue(name, SUFFIX) (Reg *d, Reg *s); + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) #define SSE_HELPER_Q(name, F)\ - void glue(name, SUFFIX) (Reg *d, Reg *s); + DEF_HELPER_3(glue(name, SUFFIX), void, env, Reg, Reg) -SSE_HELPER_B(helper_paddb, FADD); -SSE_HELPER_W(helper_paddw, FADD); -SSE_HELPER_L(helper_paddl, FADD); -SSE_HELPER_Q(helper_paddq, FADD); +SSE_HELPER_B(paddb, FADD) +SSE_HELPER_W(paddw, FADD) +SSE_HELPER_L(paddl, FADD) +SSE_HELPER_Q(paddq, FADD) -SSE_HELPER_B(helper_psubb, FSUB); -SSE_HELPER_W(helper_psubw, FSUB); -SSE_HELPER_L(helper_psubl, FSUB); -SSE_HELPER_Q(helper_psubq, FSUB); +SSE_HELPER_B(psubb, FSUB) +SSE_HELPER_W(psubw, FSUB) +SSE_HELPER_L(psubl, FSUB) +SSE_HELPER_Q(psubq, FSUB) -SSE_HELPER_B(helper_paddusb, FADDUB); -SSE_HELPER_B(helper_paddsb, FADDSB); -SSE_HELPER_B(helper_psubusb, FSUBUB); -SSE_HELPER_B(helper_psubsb, FSUBSB); +SSE_HELPER_B(paddusb, FADDUB) +SSE_HELPER_B(paddsb, FADDSB) +SSE_HELPER_B(psubusb, FSUBUB) +SSE_HELPER_B(psubsb, FSUBSB) -SSE_HELPER_W(helper_paddusw, FADDUW); -SSE_HELPER_W(helper_paddsw, FADDSW); -SSE_HELPER_W(helper_psubusw, FSUBUW); -SSE_HELPER_W(helper_psubsw, FSUBSW); +SSE_HELPER_W(paddusw, FADDUW) +SSE_HELPER_W(paddsw, FADDSW) +SSE_HELPER_W(psubusw, FSUBUW) +SSE_HELPER_W(psubsw, FSUBSW) -SSE_HELPER_B(helper_pminub, FMINUB); -SSE_HELPER_B(helper_pmaxub, FMAXUB); +SSE_HELPER_B(pminub, FMINUB) +SSE_HELPER_B(pmaxub, FMAXUB) -SSE_HELPER_W(helper_pminsw, FMINSW); -SSE_HELPER_W(helper_pmaxsw, FMAXSW); +SSE_HELPER_W(pminsw, FMINSW) +SSE_HELPER_W(pmaxsw, FMAXSW) -SSE_HELPER_Q(helper_pand, FAND); -SSE_HELPER_Q(helper_pandn, FANDN); -SSE_HELPER_Q(helper_por, FOR); -SSE_HELPER_Q(helper_pxor, FXOR); +SSE_HELPER_Q(pand, FAND) +SSE_HELPER_Q(pandn, FANDN) +SSE_HELPER_Q(por, FOR) +SSE_HELPER_Q(pxor, FXOR) -SSE_HELPER_B(helper_pcmpgtb, FCMPGTB); -SSE_HELPER_W(helper_pcmpgtw, FCMPGTW); -SSE_HELPER_L(helper_pcmpgtl, FCMPGTL); +SSE_HELPER_B(pcmpgtb, FCMPGTB) +SSE_HELPER_W(pcmpgtw, FCMPGTW) +SSE_HELPER_L(pcmpgtl, FCMPGTL) -SSE_HELPER_B(helper_pcmpeqb, FCMPEQ); -SSE_HELPER_W(helper_pcmpeqw, FCMPEQ); -SSE_HELPER_L(helper_pcmpeql, FCMPEQ); +SSE_HELPER_B(pcmpeqb, FCMPEQ) +SSE_HELPER_W(pcmpeqw, FCMPEQ) +SSE_HELPER_L(pcmpeql, FCMPEQ) -SSE_HELPER_W(helper_pmullw, FMULLW); +SSE_HELPER_W(pmullw, FMULLW) #if SHIFT == 0 -SSE_HELPER_W(helper_pmulhrw, FMULHRW); +SSE_HELPER_W(pmulhrw, FMULHRW) #endif -SSE_HELPER_W(helper_pmulhuw, FMULHUW); -SSE_HELPER_W(helper_pmulhw, FMULHW); +SSE_HELPER_W(pmulhuw, FMULHUW) +SSE_HELPER_W(pmulhw, FMULHW) -SSE_HELPER_B(helper_pavgb, FAVG); -SSE_HELPER_W(helper_pavgw, FAVG); +SSE_HELPER_B(pavgb, FAVG) +SSE_HELPER_W(pavgw, FAVG) -void glue(helper_pmuludq, SUFFIX) (Reg *d, Reg *s); -void glue(helper_pmaddwd, SUFFIX) (Reg *d, Reg *s); +DEF_HELPER_3(glue(pmuludq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaddwd, SUFFIX), void, env, Reg, Reg) -void glue(helper_psadbw, SUFFIX) (Reg *d, Reg *s); -void glue(helper_maskmov, SUFFIX) (Reg *d, Reg *s, target_ulong a0); -void glue(helper_movl_mm_T0, SUFFIX) (Reg *d, uint32_t val); +DEF_HELPER_3(glue(psadbw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(maskmov, SUFFIX), void, env, Reg, Reg, tl) +DEF_HELPER_2(glue(movl_mm_T0, SUFFIX), void, Reg, i32) #ifdef TARGET_X86_64 -void glue(helper_movq_mm_T0, SUFFIX) (Reg *d, uint64_t val); +DEF_HELPER_2(glue(movq_mm_T0, SUFFIX), void, Reg, i64) #endif #if SHIFT == 0 -void glue(helper_pshufw, SUFFIX) (Reg *d, Reg *s, int order); +DEF_HELPER_3(glue(pshufw, SUFFIX), void, Reg, Reg, int) #else -void helper_shufps(Reg *d, Reg *s, int order); -void helper_shufpd(Reg *d, Reg *s, int order); -void glue(helper_pshufd, SUFFIX) (Reg *d, Reg *s, int order); -void glue(helper_pshuflw, SUFFIX) (Reg *d, Reg *s, int order); -void glue(helper_pshufhw, SUFFIX) (Reg *d, Reg *s, int order); +DEF_HELPER_3(shufps, void, Reg, Reg, int) +DEF_HELPER_3(shufpd, void, Reg, Reg, int) +DEF_HELPER_3(glue(pshufd, SUFFIX), void, Reg, Reg, int) +DEF_HELPER_3(glue(pshuflw, SUFFIX), void, Reg, Reg, int) +DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int) #endif #if SHIFT == 1 /* FPU ops */ /* XXX: not accurate */ -#define SSE_HELPER_S(name, F)\ - void helper_ ## name ## ps (Reg *d, Reg *s); \ - void helper_ ## name ## ss (Reg *d, Reg *s); \ - void helper_ ## name ## pd (Reg *d, Reg *s); \ - void helper_ ## name ## sd (Reg *d, Reg *s); - -SSE_HELPER_S(add, FPU_ADD); -SSE_HELPER_S(sub, FPU_SUB); -SSE_HELPER_S(mul, FPU_MUL); -SSE_HELPER_S(div, FPU_DIV); -SSE_HELPER_S(min, FPU_MIN); -SSE_HELPER_S(max, FPU_MAX); -SSE_HELPER_S(sqrt, FPU_SQRT); - - -void helper_cvtps2pd(Reg *d, Reg *s); -void helper_cvtpd2ps(Reg *d, Reg *s); -void helper_cvtss2sd(Reg *d, Reg *s); -void helper_cvtsd2ss(Reg *d, Reg *s); -void helper_cvtdq2ps(Reg *d, Reg *s); -void helper_cvtdq2pd(Reg *d, Reg *s); -void helper_cvtpi2ps(XMMReg *d, MMXReg *s); -void helper_cvtpi2pd(XMMReg *d, MMXReg *s); -void helper_cvtsi2ss(XMMReg *d, uint32_t val); -void helper_cvtsi2sd(XMMReg *d, uint32_t val); +#define SSE_HELPER_S(name, F) \ + DEF_HELPER_3(name ## ps, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## pd, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## sd, void, env, Reg, Reg) + +SSE_HELPER_S(add, FPU_ADD) +SSE_HELPER_S(sub, FPU_SUB) +SSE_HELPER_S(mul, FPU_MUL) +SSE_HELPER_S(div, FPU_DIV) +SSE_HELPER_S(min, FPU_MIN) +SSE_HELPER_S(max, FPU_MAX) +SSE_HELPER_S(sqrt, FPU_SQRT) + + +DEF_HELPER_3(cvtps2pd, void, env, Reg, Reg) +DEF_HELPER_3(cvtpd2ps, void, env, Reg, Reg) +DEF_HELPER_3(cvtss2sd, void, env, Reg, Reg) +DEF_HELPER_3(cvtsd2ss, void, env, Reg, Reg) +DEF_HELPER_3(cvtdq2ps, void, env, Reg, Reg) +DEF_HELPER_3(cvtdq2pd, void, env, Reg, Reg) +DEF_HELPER_3(cvtpi2ps, void, env, ZMMReg, MMXReg) +DEF_HELPER_3(cvtpi2pd, void, env, ZMMReg, MMXReg) +DEF_HELPER_3(cvtsi2ss, void, env, ZMMReg, i32) +DEF_HELPER_3(cvtsi2sd, void, env, ZMMReg, i32) #ifdef TARGET_X86_64 -void helper_cvtsq2ss(XMMReg *d, uint64_t val); -void helper_cvtsq2sd(XMMReg *d, uint64_t val); +DEF_HELPER_3(cvtsq2ss, void, env, ZMMReg, i64) +DEF_HELPER_3(cvtsq2sd, void, env, ZMMReg, i64) #endif -void helper_cvtps2dq(XMMReg *d, XMMReg *s); -void helper_cvtpd2dq(XMMReg *d, XMMReg *s); -void helper_cvtps2pi(MMXReg *d, XMMReg *s); -void helper_cvtpd2pi(MMXReg *d, XMMReg *s); -int32_t helper_cvtss2si(XMMReg *s); -int32_t helper_cvtsd2si(XMMReg *s); +DEF_HELPER_3(cvtps2dq, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(cvtpd2dq, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(cvtps2pi, void, env, MMXReg, ZMMReg) +DEF_HELPER_3(cvtpd2pi, void, env, MMXReg, ZMMReg) +DEF_HELPER_2(cvtss2si, s32, env, ZMMReg) +DEF_HELPER_2(cvtsd2si, s32, env, ZMMReg) #ifdef TARGET_X86_64 -int64_t helper_cvtss2sq(XMMReg *s); -int64_t helper_cvtsd2sq(XMMReg *s); +DEF_HELPER_2(cvtss2sq, s64, env, ZMMReg) +DEF_HELPER_2(cvtsd2sq, s64, env, ZMMReg) #endif -void helper_cvttps2dq(XMMReg *d, XMMReg *s); -void helper_cvttpd2dq(XMMReg *d, XMMReg *s); -void helper_cvttps2pi(MMXReg *d, XMMReg *s); -void helper_cvttpd2pi(MMXReg *d, XMMReg *s); -int32_t helper_cvttss2si(XMMReg *s); -int32_t helper_cvttsd2si(XMMReg *s); +DEF_HELPER_3(cvttps2dq, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(cvttpd2dq, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(cvttps2pi, void, env, MMXReg, ZMMReg) +DEF_HELPER_3(cvttpd2pi, void, env, MMXReg, ZMMReg) +DEF_HELPER_2(cvttss2si, s32, env, ZMMReg) +DEF_HELPER_2(cvttsd2si, s32, env, ZMMReg) #ifdef TARGET_X86_64 -int64_t helper_cvttss2sq(XMMReg *s); -int64_t helper_cvttsd2sq(XMMReg *s); +DEF_HELPER_2(cvttss2sq, s64, env, ZMMReg) +DEF_HELPER_2(cvttsd2sq, s64, env, ZMMReg) #endif -void helper_rsqrtps(XMMReg *d, XMMReg *s); -void helper_rsqrtss(XMMReg *d, XMMReg *s); -void helper_rcpps(XMMReg *d, XMMReg *s); -void helper_rcpss(XMMReg *d, XMMReg *s); -void helper_haddps(XMMReg *d, XMMReg *s); -void helper_haddpd(XMMReg *d, XMMReg *s); -void helper_hsubps(XMMReg *d, XMMReg *s); -void helper_hsubpd(XMMReg *d, XMMReg *s); -void helper_addsubps(XMMReg *d, XMMReg *s); -void helper_addsubpd(XMMReg *d, XMMReg *s); - -#define SSE_HELPER_CMP(name, F)\ - void helper_ ## name ## ps (Reg *d, Reg *s); \ - void helper_ ## name ## ss (Reg *d, Reg *s); \ - void helper_ ## name ## pd (Reg *d, Reg *s); \ - void helper_ ## name ## sd (Reg *d, Reg *s); - -SSE_HELPER_CMP(cmpeq, FPU_CMPEQ); -SSE_HELPER_CMP(cmplt, FPU_CMPLT); -SSE_HELPER_CMP(cmple, FPU_CMPLE); -SSE_HELPER_CMP(cmpunord, FPU_CMPUNORD); -SSE_HELPER_CMP(cmpneq, FPU_CMPNEQ); -SSE_HELPER_CMP(cmpnlt, FPU_CMPNLT); -SSE_HELPER_CMP(cmpnle, FPU_CMPNLE); -SSE_HELPER_CMP(cmpord, FPU_CMPORD); - -void helper_ucomiss(Reg *d, Reg *s); -void helper_comiss(Reg *d, Reg *s); -void helper_ucomisd(Reg *d, Reg *s); -void helper_comisd(Reg *d, Reg *s); -uint32_t helper_movmskps(Reg *s); -uint32_t helper_movmskpd(Reg *s); +DEF_HELPER_3(rsqrtps, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(rsqrtss, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(rcpps, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(rcpss, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(extrq_r, void, env, ZMMReg, ZMMReg) +DEF_HELPER_4(extrq_i, void, env, ZMMReg, int, int) +DEF_HELPER_3(insertq_r, void, env, ZMMReg, ZMMReg) +DEF_HELPER_4(insertq_i, void, env, ZMMReg, int, int) +DEF_HELPER_3(haddps, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(haddpd, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(hsubps, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(hsubpd, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(addsubps, void, env, ZMMReg, ZMMReg) +DEF_HELPER_3(addsubpd, void, env, ZMMReg, ZMMReg) + +#define SSE_HELPER_CMP(name, F) \ + DEF_HELPER_3(name ## ps, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## ss, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## pd, void, env, Reg, Reg) \ + DEF_HELPER_3(name ## sd, void, env, Reg, Reg) + +SSE_HELPER_CMP(cmpeq, FPU_CMPEQ) +SSE_HELPER_CMP(cmplt, FPU_CMPLT) +SSE_HELPER_CMP(cmple, FPU_CMPLE) +SSE_HELPER_CMP(cmpunord, FPU_CMPUNORD) +SSE_HELPER_CMP(cmpneq, FPU_CMPNEQ) +SSE_HELPER_CMP(cmpnlt, FPU_CMPNLT) +SSE_HELPER_CMP(cmpnle, FPU_CMPNLE) +SSE_HELPER_CMP(cmpord, FPU_CMPORD) + +DEF_HELPER_3(ucomiss, void, env, Reg, Reg) +DEF_HELPER_3(comiss, void, env, Reg, Reg) +DEF_HELPER_3(ucomisd, void, env, Reg, Reg) +DEF_HELPER_3(comisd, void, env, Reg, Reg) +DEF_HELPER_2(movmskps, i32, env, Reg) +DEF_HELPER_2(movmskpd, i32, env, Reg) #endif -uint32_t glue(helper_pmovmskb, SUFFIX)(Reg *s); -void glue(helper_packsswb, SUFFIX) (Reg *d, Reg *s); -void glue(helper_packuswb, SUFFIX) (Reg *d, Reg *s); -void glue(helper_packssdw, SUFFIX) (Reg *d, Reg *s); -#define UNPCK_OP(base_name, base) \ - void glue(helper_punpck ## base_name ## bw, SUFFIX) (Reg *d, Reg *s); \ - void glue(helper_punpck ## base_name ## wd, SUFFIX) (Reg *d, Reg *s); \ - void glue(helper_punpck ## base_name ## dq, SUFFIX) (Reg *d, Reg *s); +DEF_HELPER_2(glue(pmovmskb, SUFFIX), i32, env, Reg) +DEF_HELPER_3(glue(packsswb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(packuswb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(packssdw, SUFFIX), void, env, Reg, Reg) +#define UNPCK_OP(base_name, base) \ + DEF_HELPER_3(glue(punpck ## base_name ## bw, SUFFIX), void, env, Reg, Reg) \ + DEF_HELPER_3(glue(punpck ## base_name ## wd, SUFFIX), void, env, Reg, Reg) \ + DEF_HELPER_3(glue(punpck ## base_name ## dq, SUFFIX), void, env, Reg, Reg) -UNPCK_OP(l, 0); -UNPCK_OP(h, 1); +UNPCK_OP(l, 0) +UNPCK_OP(h, 1) #if SHIFT == 1 -void glue(helper_punpcklqdq, SUFFIX) (Reg *d, Reg *s); -void glue(helper_punpckhqdq, SUFFIX) (Reg *d, Reg *s); +DEF_HELPER_3(glue(punpcklqdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(punpckhqdq, SUFFIX), void, env, Reg, Reg) #endif /* 3DNow! float ops */ #if SHIFT == 0 -void helper_pi2fd(MMXReg *d, MMXReg *s); -void helper_pi2fw(MMXReg *d, MMXReg *s); -void helper_pf2id(MMXReg *d, MMXReg *s); -void helper_pf2iw(MMXReg *d, MMXReg *s); -void helper_pfacc(MMXReg *d, MMXReg *s); -void helper_pfadd(MMXReg *d, MMXReg *s); -void helper_pfcmpeq(MMXReg *d, MMXReg *s); -void helper_pfcmpge(MMXReg *d, MMXReg *s); -void helper_pfcmpgt(MMXReg *d, MMXReg *s); -void helper_pfmax(MMXReg *d, MMXReg *s); -void helper_pfmin(MMXReg *d, MMXReg *s); -void helper_pfmul(MMXReg *d, MMXReg *s); -void helper_pfnacc(MMXReg *d, MMXReg *s); -void helper_pfpnacc(MMXReg *d, MMXReg *s); -void helper_pfrcp(MMXReg *d, MMXReg *s); -void helper_pfrsqrt(MMXReg *d, MMXReg *s); -void helper_pfsub(MMXReg *d, MMXReg *s); -void helper_pfsubr(MMXReg *d, MMXReg *s); -void helper_pswapd(MMXReg *d, MMXReg *s); +DEF_HELPER_3(pi2fd, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pi2fw, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pf2id, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pf2iw, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfacc, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfadd, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfcmpeq, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfcmpge, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfcmpgt, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfmax, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfmin, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfmul, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfnacc, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfpnacc, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfrcp, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfrsqrt, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfsub, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pfsubr, void, env, MMXReg, MMXReg) +DEF_HELPER_3(pswapd, void, env, MMXReg, MMXReg) +#endif + +/* SSSE3 op helpers */ +DEF_HELPER_3(glue(phaddw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phaddd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phaddsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phsubw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phsubd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phsubsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pabsb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pabsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pabsd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaddubsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmulhrsw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pshufb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psignb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psignw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(psignd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(palignr, SUFFIX), void, env, Reg, Reg, s32) + +/* SSE4.1 op helpers */ +#if SHIFT == 1 +DEF_HELPER_3(glue(pblendvb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(blendvps, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(blendvpd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(ptest, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxbw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxbd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxbq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxwd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxwq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovsxdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxbw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxbd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxbq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxwd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxwq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmovzxdq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmuldq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pcmpeqq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(packusdw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminsb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminsd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminuw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pminud, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxsb, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxsd, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxuw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmaxud, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(pmulld, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(phminposuw, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(roundps, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(roundpd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(roundss, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(roundsd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(blendps, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(blendpd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pblendw, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(dpps, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(dppd, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(mpsadbw, SUFFIX), void, env, Reg, Reg, i32) +#endif + +/* SSE4.2 op helpers */ +#if SHIFT == 1 +DEF_HELPER_3(glue(pcmpgtq, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(pcmpestri, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pcmpestrm, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pcmpistri, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pcmpistrm, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_3(crc32, tl, i32, tl, i32) +DEF_HELPER_3(popcnt, tl, env, tl, i32) +#endif + +/* AES-NI op helpers */ +#if SHIFT == 1 +DEF_HELPER_3(glue(aesdec, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesdeclast, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesenc, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesenclast, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_3(glue(aesimc, SUFFIX), void, env, Reg, Reg) +DEF_HELPER_4(glue(aeskeygenassist, SUFFIX), void, env, Reg, Reg, i32) +DEF_HELPER_4(glue(pclmulqdq, SUFFIX), void, env, Reg, Reg, i32) #endif #undef SHIFT