00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #if SHIFT == 0
00021 #define Reg MMXReg
00022 #define SUFFIX _mmx
00023 #else
00024 #define Reg XMMReg
00025 #define SUFFIX _xmm
00026 #endif
00027
00028 #define dh_alias_Reg ptr
00029 #define dh_alias_XMMReg ptr
00030 #define dh_alias_MMXReg ptr
00031 #define dh_ctype_Reg Reg *
00032 #define dh_ctype_XMMReg XMMReg *
00033 #define dh_ctype_MMXReg MMXReg *
00034
00035 DEF_HELPER_2(glue(psrlw, SUFFIX), void, Reg, Reg)
00036 DEF_HELPER_2(glue(psraw, SUFFIX), void, Reg, Reg)
00037 DEF_HELPER_2(glue(psllw, SUFFIX), void, Reg, Reg)
00038 DEF_HELPER_2(glue(psrld, SUFFIX), void, Reg, Reg)
00039 DEF_HELPER_2(glue(psrad, SUFFIX), void, Reg, Reg)
00040 DEF_HELPER_2(glue(pslld, SUFFIX), void, Reg, Reg)
00041 DEF_HELPER_2(glue(psrlq, SUFFIX), void, Reg, Reg)
00042 DEF_HELPER_2(glue(psllq, SUFFIX), void, Reg, Reg)
00043
00044 #if SHIFT == 1
00045 DEF_HELPER_2(glue(psrldq, SUFFIX), void, Reg, Reg)
00046 DEF_HELPER_2(glue(pslldq, SUFFIX), void, Reg, Reg)
00047 #endif
00048
00049 #define SSE_HELPER_B(name, F)\
00050 DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
00051
00052 #define SSE_HELPER_W(name, F)\
00053 DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
00054
00055 #define SSE_HELPER_L(name, F)\
00056 DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
00057
00058 #define SSE_HELPER_Q(name, F)\
00059 DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
00060
00061 SSE_HELPER_B(paddb, FADD)
00062 SSE_HELPER_W(paddw, FADD)
00063 SSE_HELPER_L(paddl, FADD)
00064 SSE_HELPER_Q(paddq, FADD)
00065
00066 SSE_HELPER_B(psubb, FSUB)
00067 SSE_HELPER_W(psubw, FSUB)
00068 SSE_HELPER_L(psubl, FSUB)
00069 SSE_HELPER_Q(psubq, FSUB)
00070
00071 SSE_HELPER_B(paddusb, FADDUB)
00072 SSE_HELPER_B(paddsb, FADDSB)
00073 SSE_HELPER_B(psubusb, FSUBUB)
00074 SSE_HELPER_B(psubsb, FSUBSB)
00075
00076 SSE_HELPER_W(paddusw, FADDUW)
00077 SSE_HELPER_W(paddsw, FADDSW)
00078 SSE_HELPER_W(psubusw, FSUBUW)
00079 SSE_HELPER_W(psubsw, FSUBSW)
00080
00081 SSE_HELPER_B(pminub, FMINUB)
00082 SSE_HELPER_B(pmaxub, FMAXUB)
00083
00084 SSE_HELPER_W(pminsw, FMINSW)
00085 SSE_HELPER_W(pmaxsw, FMAXSW)
00086
00087 SSE_HELPER_Q(pand, FAND)
00088 SSE_HELPER_Q(pandn, FANDN)
00089 SSE_HELPER_Q(por, FOR)
00090 SSE_HELPER_Q(pxor, FXOR)
00091
00092 SSE_HELPER_B(pcmpgtb, FCMPGTB)
00093 SSE_HELPER_W(pcmpgtw, FCMPGTW)
00094 SSE_HELPER_L(pcmpgtl, FCMPGTL)
00095
00096 SSE_HELPER_B(pcmpeqb, FCMPEQ)
00097 SSE_HELPER_W(pcmpeqw, FCMPEQ)
00098 SSE_HELPER_L(pcmpeql, FCMPEQ)
00099
00100 SSE_HELPER_W(pmullw, FMULLW)
00101 #if SHIFT == 0
00102 SSE_HELPER_W(pmulhrw, FMULHRW)
00103 #endif
00104 SSE_HELPER_W(pmulhuw, FMULHUW)
00105 SSE_HELPER_W(pmulhw, FMULHW)
00106
00107 SSE_HELPER_B(pavgb, FAVG)
00108 SSE_HELPER_W(pavgw, FAVG)
00109
00110 DEF_HELPER_2(glue(pmuludq, SUFFIX), void, Reg, Reg)
00111 DEF_HELPER_2(glue(pmaddwd, SUFFIX), void, Reg, Reg)
00112
00113 DEF_HELPER_2(glue(psadbw, SUFFIX), void, Reg, Reg)
00114 DEF_HELPER_3(glue(maskmov, SUFFIX), void, Reg, Reg, tl)
00115 DEF_HELPER_2(glue(movl_mm_T0, SUFFIX), void, Reg, i32)
00116 #ifdef TARGET_X86_64
00117 DEF_HELPER_2(glue(movq_mm_T0, SUFFIX), void, Reg, i64)
00118 #endif
00119
00120 #if SHIFT == 0
00121 DEF_HELPER_3(glue(pshufw, SUFFIX), void, Reg, Reg, int)
00122 #else
00123 DEF_HELPER_3(shufps, void, Reg, Reg, int)
00124 DEF_HELPER_3(shufpd, void, Reg, Reg, int)
00125 DEF_HELPER_3(glue(pshufd, SUFFIX), void, Reg, Reg, int)
00126 DEF_HELPER_3(glue(pshuflw, SUFFIX), void, Reg, Reg, int)
00127 DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int)
00128 #endif
00129
00130 #if SHIFT == 1
00131
00132
00133
00134 #define SSE_HELPER_S(name, F)\
00135 DEF_HELPER_2(name ## ps , void, Reg, Reg) \
00136 DEF_HELPER_2(name ## ss , void, Reg, Reg) \
00137 DEF_HELPER_2(name ## pd , void, Reg, Reg) \
00138 DEF_HELPER_2(name ## sd , void, Reg, Reg)
00139
00140 SSE_HELPER_S(add, FPU_ADD)
00141 SSE_HELPER_S(sub, FPU_SUB)
00142 SSE_HELPER_S(mul, FPU_MUL)
00143 SSE_HELPER_S(div, FPU_DIV)
00144 SSE_HELPER_S(min, FPU_MIN)
00145 SSE_HELPER_S(max, FPU_MAX)
00146 SSE_HELPER_S(sqrt, FPU_SQRT)
00147
00148
00149 DEF_HELPER_2(cvtps2pd, void, Reg, Reg)
00150 DEF_HELPER_2(cvtpd2ps, void, Reg, Reg)
00151 DEF_HELPER_2(cvtss2sd, void, Reg, Reg)
00152 DEF_HELPER_2(cvtsd2ss, void, Reg, Reg)
00153 DEF_HELPER_2(cvtdq2ps, void, Reg, Reg)
00154 DEF_HELPER_2(cvtdq2pd, void, Reg, Reg)
00155 DEF_HELPER_2(cvtpi2ps, void, XMMReg, MMXReg)
00156 DEF_HELPER_2(cvtpi2pd, void, XMMReg, MMXReg)
00157 DEF_HELPER_2(cvtsi2ss, void, XMMReg, i32)
00158 DEF_HELPER_2(cvtsi2sd, void, XMMReg, i32)
00159
00160 #ifdef TARGET_X86_64
00161 DEF_HELPER_2(cvtsq2ss, void, XMMReg, i64)
00162 DEF_HELPER_2(cvtsq2sd, void, XMMReg, i64)
00163 #endif
00164
00165 DEF_HELPER_2(cvtps2dq, void, XMMReg, XMMReg)
00166 DEF_HELPER_2(cvtpd2dq, void, XMMReg, XMMReg)
00167 DEF_HELPER_2(cvtps2pi, void, MMXReg, XMMReg)
00168 DEF_HELPER_2(cvtpd2pi, void, MMXReg, XMMReg)
00169 DEF_HELPER_1(cvtss2si, s32, XMMReg)
00170 DEF_HELPER_1(cvtsd2si, s32, XMMReg)
00171 #ifdef TARGET_X86_64
00172 DEF_HELPER_1(cvtss2sq, s64, XMMReg)
00173 DEF_HELPER_1(cvtsd2sq, s64, XMMReg)
00174 #endif
00175
00176 DEF_HELPER_2(cvttps2dq, void, XMMReg, XMMReg)
00177 DEF_HELPER_2(cvttpd2dq, void, XMMReg, XMMReg)
00178 DEF_HELPER_2(cvttps2pi, void, MMXReg, XMMReg)
00179 DEF_HELPER_2(cvttpd2pi, void, MMXReg, XMMReg)
00180 DEF_HELPER_1(cvttss2si, s32, XMMReg)
00181 DEF_HELPER_1(cvttsd2si, s32, XMMReg)
00182 #ifdef TARGET_X86_64
00183 DEF_HELPER_1(cvttss2sq, s64, XMMReg)
00184 DEF_HELPER_1(cvttsd2sq, s64, XMMReg)
00185 #endif
00186
00187 DEF_HELPER_2(rsqrtps, void, XMMReg, XMMReg)
00188 DEF_HELPER_2(rsqrtss, void, XMMReg, XMMReg)
00189 DEF_HELPER_2(rcpps, void, XMMReg, XMMReg)
00190 DEF_HELPER_2(rcpss, void, XMMReg, XMMReg)
00191 DEF_HELPER_2(haddps, void, XMMReg, XMMReg)
00192 DEF_HELPER_2(haddpd, void, XMMReg, XMMReg)
00193 DEF_HELPER_2(hsubps, void, XMMReg, XMMReg)
00194 DEF_HELPER_2(hsubpd, void, XMMReg, XMMReg)
00195 DEF_HELPER_2(addsubps, void, XMMReg, XMMReg)
00196 DEF_HELPER_2(addsubpd, void, XMMReg, XMMReg)
00197
00198 #define SSE_HELPER_CMP(name, F)\
00199 DEF_HELPER_2( name ## ps , void, Reg, Reg) \
00200 DEF_HELPER_2( name ## ss , void, Reg, Reg) \
00201 DEF_HELPER_2( name ## pd , void, Reg, Reg) \
00202 DEF_HELPER_2( name ## sd , void, Reg, Reg)
00203
00204 SSE_HELPER_CMP(cmpeq, FPU_CMPEQ)
00205 SSE_HELPER_CMP(cmplt, FPU_CMPLT)
00206 SSE_HELPER_CMP(cmple, FPU_CMPLE)
00207 SSE_HELPER_CMP(cmpunord, FPU_CMPUNORD)
00208 SSE_HELPER_CMP(cmpneq, FPU_CMPNEQ)
00209 SSE_HELPER_CMP(cmpnlt, FPU_CMPNLT)
00210 SSE_HELPER_CMP(cmpnle, FPU_CMPNLE)
00211 SSE_HELPER_CMP(cmpord, FPU_CMPORD)
00212
00213 DEF_HELPER_2(ucomiss, void, Reg, Reg)
00214 DEF_HELPER_2(comiss, void, Reg, Reg)
00215 DEF_HELPER_2(ucomisd, void, Reg, Reg)
00216 DEF_HELPER_2(comisd, void, Reg, Reg)
00217 DEF_HELPER_1(movmskps, i32, Reg)
00218 DEF_HELPER_1(movmskpd, i32, Reg)
00219 #endif
00220
00221 DEF_HELPER_1(glue(pmovmskb, SUFFIX), i32, Reg)
00222 DEF_HELPER_2(glue(packsswb, SUFFIX), void, Reg, Reg)
00223 DEF_HELPER_2(glue(packuswb, SUFFIX), void, Reg, Reg)
00224 DEF_HELPER_2(glue(packssdw, SUFFIX), void, Reg, Reg)
00225 #define UNPCK_OP(base_name, base) \
00226 DEF_HELPER_2(glue(punpck ## base_name ## bw, SUFFIX) , void, Reg, Reg) \
00227 DEF_HELPER_2(glue(punpck ## base_name ## wd, SUFFIX) , void, Reg, Reg) \
00228 DEF_HELPER_2(glue(punpck ## base_name ## dq, SUFFIX) , void, Reg, Reg)
00229
00230 UNPCK_OP(l, 0)
00231 UNPCK_OP(h, 1)
00232
00233 #if SHIFT == 1
00234 DEF_HELPER_2(glue(punpcklqdq, SUFFIX), void, Reg, Reg)
00235 DEF_HELPER_2(glue(punpckhqdq, SUFFIX), void, Reg, Reg)
00236 #endif
00237
00238
00239 #if SHIFT == 0
00240 DEF_HELPER_2(pi2fd, void, MMXReg, MMXReg)
00241 DEF_HELPER_2(pi2fw, void, MMXReg, MMXReg)
00242 DEF_HELPER_2(pf2id, void, MMXReg, MMXReg)
00243 DEF_HELPER_2(pf2iw, void, MMXReg, MMXReg)
00244 DEF_HELPER_2(pfacc, void, MMXReg, MMXReg)
00245 DEF_HELPER_2(pfadd, void, MMXReg, MMXReg)
00246 DEF_HELPER_2(pfcmpeq, void, MMXReg, MMXReg)
00247 DEF_HELPER_2(pfcmpge, void, MMXReg, MMXReg)
00248 DEF_HELPER_2(pfcmpgt, void, MMXReg, MMXReg)
00249 DEF_HELPER_2(pfmax, void, MMXReg, MMXReg)
00250 DEF_HELPER_2(pfmin, void, MMXReg, MMXReg)
00251 DEF_HELPER_2(pfmul, void, MMXReg, MMXReg)
00252 DEF_HELPER_2(pfnacc, void, MMXReg, MMXReg)
00253 DEF_HELPER_2(pfpnacc, void, MMXReg, MMXReg)
00254 DEF_HELPER_2(pfrcp, void, MMXReg, MMXReg)
00255 DEF_HELPER_2(pfrsqrt, void, MMXReg, MMXReg)
00256 DEF_HELPER_2(pfsub, void, MMXReg, MMXReg)
00257 DEF_HELPER_2(pfsubr, void, MMXReg, MMXReg)
00258 DEF_HELPER_2(pswapd, void, MMXReg, MMXReg)
00259 #endif
00260
00261
00262 DEF_HELPER_2(glue(phaddw, SUFFIX), void, Reg, Reg)
00263 DEF_HELPER_2(glue(phaddd, SUFFIX), void, Reg, Reg)
00264 DEF_HELPER_2(glue(phaddsw, SUFFIX), void, Reg, Reg)
00265 DEF_HELPER_2(glue(phsubw, SUFFIX), void, Reg, Reg)
00266 DEF_HELPER_2(glue(phsubd, SUFFIX), void, Reg, Reg)
00267 DEF_HELPER_2(glue(phsubsw, SUFFIX), void, Reg, Reg)
00268 DEF_HELPER_2(glue(pabsb, SUFFIX), void, Reg, Reg)
00269 DEF_HELPER_2(glue(pabsw, SUFFIX), void, Reg, Reg)
00270 DEF_HELPER_2(glue(pabsd, SUFFIX), void, Reg, Reg)
00271 DEF_HELPER_2(glue(pmaddubsw, SUFFIX), void, Reg, Reg)
00272 DEF_HELPER_2(glue(pmulhrsw, SUFFIX), void, Reg, Reg)
00273 DEF_HELPER_2(glue(pshufb, SUFFIX), void, Reg, Reg)
00274 DEF_HELPER_2(glue(psignb, SUFFIX), void, Reg, Reg)
00275 DEF_HELPER_2(glue(psignw, SUFFIX), void, Reg, Reg)
00276 DEF_HELPER_2(glue(psignd, SUFFIX), void, Reg, Reg)
00277 DEF_HELPER_3(glue(palignr, SUFFIX), void, Reg, Reg, s32)
00278
00279
00280 #if SHIFT == 1
00281 DEF_HELPER_2(glue(pblendvb, SUFFIX), void, Reg, Reg)
00282 DEF_HELPER_2(glue(blendvps, SUFFIX), void, Reg, Reg)
00283 DEF_HELPER_2(glue(blendvpd, SUFFIX), void, Reg, Reg)
00284 DEF_HELPER_2(glue(ptest, SUFFIX), void, Reg, Reg)
00285 DEF_HELPER_2(glue(pmovsxbw, SUFFIX), void, Reg, Reg)
00286 DEF_HELPER_2(glue(pmovsxbd, SUFFIX), void, Reg, Reg)
00287 DEF_HELPER_2(glue(pmovsxbq, SUFFIX), void, Reg, Reg)
00288 DEF_HELPER_2(glue(pmovsxwd, SUFFIX), void, Reg, Reg)
00289 DEF_HELPER_2(glue(pmovsxwq, SUFFIX), void, Reg, Reg)
00290 DEF_HELPER_2(glue(pmovsxdq, SUFFIX), void, Reg, Reg)
00291 DEF_HELPER_2(glue(pmovzxbw, SUFFIX), void, Reg, Reg)
00292 DEF_HELPER_2(glue(pmovzxbd, SUFFIX), void, Reg, Reg)
00293 DEF_HELPER_2(glue(pmovzxbq, SUFFIX), void, Reg, Reg)
00294 DEF_HELPER_2(glue(pmovzxwd, SUFFIX), void, Reg, Reg)
00295 DEF_HELPER_2(glue(pmovzxwq, SUFFIX), void, Reg, Reg)
00296 DEF_HELPER_2(glue(pmovzxdq, SUFFIX), void, Reg, Reg)
00297 DEF_HELPER_2(glue(pmuldq, SUFFIX), void, Reg, Reg)
00298 DEF_HELPER_2(glue(pcmpeqq, SUFFIX), void, Reg, Reg)
00299 DEF_HELPER_2(glue(packusdw, SUFFIX), void, Reg, Reg)
00300 DEF_HELPER_2(glue(pminsb, SUFFIX), void, Reg, Reg)
00301 DEF_HELPER_2(glue(pminsd, SUFFIX), void, Reg, Reg)
00302 DEF_HELPER_2(glue(pminuw, SUFFIX), void, Reg, Reg)
00303 DEF_HELPER_2(glue(pminud, SUFFIX), void, Reg, Reg)
00304 DEF_HELPER_2(glue(pmaxsb, SUFFIX), void, Reg, Reg)
00305 DEF_HELPER_2(glue(pmaxsd, SUFFIX), void, Reg, Reg)
00306 DEF_HELPER_2(glue(pmaxuw, SUFFIX), void, Reg, Reg)
00307 DEF_HELPER_2(glue(pmaxud, SUFFIX), void, Reg, Reg)
00308 DEF_HELPER_2(glue(pmulld, SUFFIX), void, Reg, Reg)
00309 DEF_HELPER_2(glue(phminposuw, SUFFIX), void, Reg, Reg)
00310 DEF_HELPER_3(glue(roundps, SUFFIX), void, Reg, Reg, i32)
00311 DEF_HELPER_3(glue(roundpd, SUFFIX), void, Reg, Reg, i32)
00312 DEF_HELPER_3(glue(roundss, SUFFIX), void, Reg, Reg, i32)
00313 DEF_HELPER_3(glue(roundsd, SUFFIX), void, Reg, Reg, i32)
00314 DEF_HELPER_3(glue(blendps, SUFFIX), void, Reg, Reg, i32)
00315 DEF_HELPER_3(glue(blendpd, SUFFIX), void, Reg, Reg, i32)
00316 DEF_HELPER_3(glue(pblendw, SUFFIX), void, Reg, Reg, i32)
00317 DEF_HELPER_3(glue(dpps, SUFFIX), void, Reg, Reg, i32)
00318 DEF_HELPER_3(glue(dppd, SUFFIX), void, Reg, Reg, i32)
00319 DEF_HELPER_3(glue(mpsadbw, SUFFIX), void, Reg, Reg, i32)
00320 #endif
00321
00322
00323 #if SHIFT == 1
00324 DEF_HELPER_2(glue(pcmpgtq, SUFFIX), void, Reg, Reg)
00325 DEF_HELPER_3(glue(pcmpestri, SUFFIX), void, Reg, Reg, i32)
00326 DEF_HELPER_3(glue(pcmpestrm, SUFFIX), void, Reg, Reg, i32)
00327 DEF_HELPER_3(glue(pcmpistri, SUFFIX), void, Reg, Reg, i32)
00328 DEF_HELPER_3(glue(pcmpistrm, SUFFIX), void, Reg, Reg, i32)
00329 DEF_HELPER_3(crc32, tl, i32, tl, i32)
00330 DEF_HELPER_2(popcnt, tl, tl, i32)
00331 #endif
00332
00333 #undef SHIFT
00334 #undef Reg
00335 #undef SUFFIX
00336
00337 #undef SSE_HELPER_B
00338 #undef SSE_HELPER_W
00339 #undef SSE_HELPER_L
00340 #undef SSE_HELPER_Q
00341 #undef SSE_HELPER_S
00342 #undef SSE_HELPER_CMP
00343 #undef UNPCK_OP