File:  [Qemu by Fabrice Bellard] / qemu / target-i386 / ops_sse_header.h
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 18:31:26 2018 UTC (3 years, 3 months ago) by root
Branches: qemu, MAIN
CVS tags: qemu1101, qemu1001, qemu1000, qemu0151, qemu0150, qemu0141, qemu0140, qemu0130, HEAD
qemu 0.13.0

    1: /*
    2:  *  MMX/3DNow!/SSE/SSE2/SSE3/SSSE3/SSE4/PNI support
    3:  *
    4:  *  Copyright (c) 2005 Fabrice Bellard
    5:  *
    6:  * This library is free software; you can redistribute it and/or
    7:  * modify it under the terms of the GNU Lesser General Public
    8:  * License as published by the Free Software Foundation; either
    9:  * version 2 of the License, or (at your option) any later version.
   10:  *
   11:  * This library is distributed in the hope that it will be useful,
   12:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
   13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:  * Lesser General Public License for more details.
   15:  *
   16:  * You should have received a copy of the GNU Lesser General Public
   17:  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
   18:  */
   19: #if SHIFT == 0
   20: #define Reg MMXReg
   21: #define SUFFIX _mmx
   22: #else
   23: #define Reg XMMReg
   24: #define SUFFIX _xmm
   25: #endif
   26: 
   27: #define dh_alias_Reg ptr
   28: #define dh_alias_XMMReg ptr
   29: #define dh_alias_MMXReg ptr
   30: #define dh_ctype_Reg Reg *
   31: #define dh_ctype_XMMReg XMMReg *
   32: #define dh_ctype_MMXReg MMXReg *
   33: #define dh_is_signed_Reg dh_is_signed_ptr
   34: #define dh_is_signed_XMMReg dh_is_signed_ptr
   35: #define dh_is_signed_MMXReg dh_is_signed_ptr
   36: 
   37: DEF_HELPER_2(glue(psrlw, SUFFIX), void, Reg, Reg)
   38: DEF_HELPER_2(glue(psraw, SUFFIX), void, Reg, Reg)
   39: DEF_HELPER_2(glue(psllw, SUFFIX), void, Reg, Reg)
   40: DEF_HELPER_2(glue(psrld, SUFFIX), void, Reg, Reg)
   41: DEF_HELPER_2(glue(psrad, SUFFIX), void, Reg, Reg)
   42: DEF_HELPER_2(glue(pslld, SUFFIX), void, Reg, Reg)
   43: DEF_HELPER_2(glue(psrlq, SUFFIX), void, Reg, Reg)
   44: DEF_HELPER_2(glue(psllq, SUFFIX), void, Reg, Reg)
   45: 
   46: #if SHIFT == 1
   47: DEF_HELPER_2(glue(psrldq, SUFFIX), void, Reg, Reg)
   48: DEF_HELPER_2(glue(pslldq, SUFFIX), void, Reg, Reg)
   49: #endif
   50: 
   51: #define SSE_HELPER_B(name, F)\
   52:     DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
   53: 
   54: #define SSE_HELPER_W(name, F)\
   55:     DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
   56: 
   57: #define SSE_HELPER_L(name, F)\
   58:     DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
   59: 
   60: #define SSE_HELPER_Q(name, F)\
   61:     DEF_HELPER_2(glue(name, SUFFIX), void, Reg, Reg)
   62: 
   63: SSE_HELPER_B(paddb, FADD)
   64: SSE_HELPER_W(paddw, FADD)
   65: SSE_HELPER_L(paddl, FADD)
   66: SSE_HELPER_Q(paddq, FADD)
   67: 
   68: SSE_HELPER_B(psubb, FSUB)
   69: SSE_HELPER_W(psubw, FSUB)
   70: SSE_HELPER_L(psubl, FSUB)
   71: SSE_HELPER_Q(psubq, FSUB)
   72: 
   73: SSE_HELPER_B(paddusb, FADDUB)
   74: SSE_HELPER_B(paddsb, FADDSB)
   75: SSE_HELPER_B(psubusb, FSUBUB)
   76: SSE_HELPER_B(psubsb, FSUBSB)
   77: 
   78: SSE_HELPER_W(paddusw, FADDUW)
   79: SSE_HELPER_W(paddsw, FADDSW)
   80: SSE_HELPER_W(psubusw, FSUBUW)
   81: SSE_HELPER_W(psubsw, FSUBSW)
   82: 
   83: SSE_HELPER_B(pminub, FMINUB)
   84: SSE_HELPER_B(pmaxub, FMAXUB)
   85: 
   86: SSE_HELPER_W(pminsw, FMINSW)
   87: SSE_HELPER_W(pmaxsw, FMAXSW)
   88: 
   89: SSE_HELPER_Q(pand, FAND)
   90: SSE_HELPER_Q(pandn, FANDN)
   91: SSE_HELPER_Q(por, FOR)
   92: SSE_HELPER_Q(pxor, FXOR)
   93: 
   94: SSE_HELPER_B(pcmpgtb, FCMPGTB)
   95: SSE_HELPER_W(pcmpgtw, FCMPGTW)
   96: SSE_HELPER_L(pcmpgtl, FCMPGTL)
   97: 
   98: SSE_HELPER_B(pcmpeqb, FCMPEQ)
   99: SSE_HELPER_W(pcmpeqw, FCMPEQ)
  100: SSE_HELPER_L(pcmpeql, FCMPEQ)
  101: 
  102: SSE_HELPER_W(pmullw, FMULLW)
  103: #if SHIFT == 0
  104: SSE_HELPER_W(pmulhrw, FMULHRW)
  105: #endif
  106: SSE_HELPER_W(pmulhuw, FMULHUW)
  107: SSE_HELPER_W(pmulhw, FMULHW)
  108: 
  109: SSE_HELPER_B(pavgb, FAVG)
  110: SSE_HELPER_W(pavgw, FAVG)
  111: 
  112: DEF_HELPER_2(glue(pmuludq, SUFFIX), void, Reg, Reg)
  113: DEF_HELPER_2(glue(pmaddwd, SUFFIX), void, Reg, Reg)
  114: 
  115: DEF_HELPER_2(glue(psadbw, SUFFIX), void, Reg, Reg)
  116: DEF_HELPER_3(glue(maskmov, SUFFIX), void, Reg, Reg, tl)
  117: DEF_HELPER_2(glue(movl_mm_T0, SUFFIX), void, Reg, i32)
  118: #ifdef TARGET_X86_64
  119: DEF_HELPER_2(glue(movq_mm_T0, SUFFIX), void, Reg, i64)
  120: #endif
  121: 
  122: #if SHIFT == 0
  123: DEF_HELPER_3(glue(pshufw, SUFFIX), void, Reg, Reg, int)
  124: #else
  125: DEF_HELPER_3(shufps, void, Reg, Reg, int)
  126: DEF_HELPER_3(shufpd, void, Reg, Reg, int)
  127: DEF_HELPER_3(glue(pshufd, SUFFIX), void, Reg, Reg, int)
  128: DEF_HELPER_3(glue(pshuflw, SUFFIX), void, Reg, Reg, int)
  129: DEF_HELPER_3(glue(pshufhw, SUFFIX), void, Reg, Reg, int)
  130: #endif
  131: 
  132: #if SHIFT == 1
  133: /* FPU ops */
  134: /* XXX: not accurate */
  135: 
  136: #define SSE_HELPER_S(name, F)\
  137:     DEF_HELPER_2(name ## ps , void, Reg, Reg)        \
  138:     DEF_HELPER_2(name ## ss , void, Reg, Reg)        \
  139:     DEF_HELPER_2(name ## pd , void, Reg, Reg)        \
  140:     DEF_HELPER_2(name ## sd , void, Reg, Reg)
  141: 
  142: SSE_HELPER_S(add, FPU_ADD)
  143: SSE_HELPER_S(sub, FPU_SUB)
  144: SSE_HELPER_S(mul, FPU_MUL)
  145: SSE_HELPER_S(div, FPU_DIV)
  146: SSE_HELPER_S(min, FPU_MIN)
  147: SSE_HELPER_S(max, FPU_MAX)
  148: SSE_HELPER_S(sqrt, FPU_SQRT)
  149: 
  150: 
  151: DEF_HELPER_2(cvtps2pd, void, Reg, Reg)
  152: DEF_HELPER_2(cvtpd2ps, void, Reg, Reg)
  153: DEF_HELPER_2(cvtss2sd, void, Reg, Reg)
  154: DEF_HELPER_2(cvtsd2ss, void, Reg, Reg)
  155: DEF_HELPER_2(cvtdq2ps, void, Reg, Reg)
  156: DEF_HELPER_2(cvtdq2pd, void, Reg, Reg)
  157: DEF_HELPER_2(cvtpi2ps, void, XMMReg, MMXReg)
  158: DEF_HELPER_2(cvtpi2pd, void, XMMReg, MMXReg)
  159: DEF_HELPER_2(cvtsi2ss, void, XMMReg, i32)
  160: DEF_HELPER_2(cvtsi2sd, void, XMMReg, i32)
  161: 
  162: #ifdef TARGET_X86_64
  163: DEF_HELPER_2(cvtsq2ss, void, XMMReg, i64)
  164: DEF_HELPER_2(cvtsq2sd, void, XMMReg, i64)
  165: #endif
  166: 
  167: DEF_HELPER_2(cvtps2dq, void, XMMReg, XMMReg)
  168: DEF_HELPER_2(cvtpd2dq, void, XMMReg, XMMReg)
  169: DEF_HELPER_2(cvtps2pi, void, MMXReg, XMMReg)
  170: DEF_HELPER_2(cvtpd2pi, void, MMXReg, XMMReg)
  171: DEF_HELPER_1(cvtss2si, s32, XMMReg)
  172: DEF_HELPER_1(cvtsd2si, s32, XMMReg)
  173: #ifdef TARGET_X86_64
  174: DEF_HELPER_1(cvtss2sq, s64, XMMReg)
  175: DEF_HELPER_1(cvtsd2sq, s64, XMMReg)
  176: #endif
  177: 
  178: DEF_HELPER_2(cvttps2dq, void, XMMReg, XMMReg)
  179: DEF_HELPER_2(cvttpd2dq, void, XMMReg, XMMReg)
  180: DEF_HELPER_2(cvttps2pi, void, MMXReg, XMMReg)
  181: DEF_HELPER_2(cvttpd2pi, void, MMXReg, XMMReg)
  182: DEF_HELPER_1(cvttss2si, s32, XMMReg)
  183: DEF_HELPER_1(cvttsd2si, s32, XMMReg)
  184: #ifdef TARGET_X86_64
  185: DEF_HELPER_1(cvttss2sq, s64, XMMReg)
  186: DEF_HELPER_1(cvttsd2sq, s64, XMMReg)
  187: #endif
  188: 
  189: DEF_HELPER_2(rsqrtps, void, XMMReg, XMMReg)
  190: DEF_HELPER_2(rsqrtss, void, XMMReg, XMMReg)
  191: DEF_HELPER_2(rcpps, void, XMMReg, XMMReg)
  192: DEF_HELPER_2(rcpss, void, XMMReg, XMMReg)
  193: DEF_HELPER_2(extrq_r, void, XMMReg, XMMReg)
  194: DEF_HELPER_3(extrq_i, void, XMMReg, int, int)
  195: DEF_HELPER_2(insertq_r, void, XMMReg, XMMReg)
  196: DEF_HELPER_3(insertq_i, void, XMMReg, int, int)
  197: DEF_HELPER_2(haddps, void, XMMReg, XMMReg)
  198: DEF_HELPER_2(haddpd, void, XMMReg, XMMReg)
  199: DEF_HELPER_2(hsubps, void, XMMReg, XMMReg)
  200: DEF_HELPER_2(hsubpd, void, XMMReg, XMMReg)
  201: DEF_HELPER_2(addsubps, void, XMMReg, XMMReg)
  202: DEF_HELPER_2(addsubpd, void, XMMReg, XMMReg)
  203: 
  204: #define SSE_HELPER_CMP(name, F)\
  205:     DEF_HELPER_2( name ## ps , void, Reg, Reg)        \
  206:     DEF_HELPER_2( name ## ss , void, Reg, Reg)        \
  207:     DEF_HELPER_2( name ## pd , void, Reg, Reg)        \
  208:     DEF_HELPER_2( name ## sd , void, Reg, Reg)
  209: 
  210: SSE_HELPER_CMP(cmpeq, FPU_CMPEQ)
  211: SSE_HELPER_CMP(cmplt, FPU_CMPLT)
  212: SSE_HELPER_CMP(cmple, FPU_CMPLE)
  213: SSE_HELPER_CMP(cmpunord, FPU_CMPUNORD)
  214: SSE_HELPER_CMP(cmpneq, FPU_CMPNEQ)
  215: SSE_HELPER_CMP(cmpnlt, FPU_CMPNLT)
  216: SSE_HELPER_CMP(cmpnle, FPU_CMPNLE)
  217: SSE_HELPER_CMP(cmpord, FPU_CMPORD)
  218: 
  219: DEF_HELPER_2(ucomiss, void, Reg, Reg)
  220: DEF_HELPER_2(comiss, void, Reg, Reg)
  221: DEF_HELPER_2(ucomisd, void, Reg, Reg)
  222: DEF_HELPER_2(comisd, void, Reg, Reg)
  223: DEF_HELPER_1(movmskps, i32, Reg)
  224: DEF_HELPER_1(movmskpd, i32, Reg)
  225: #endif
  226: 
  227: DEF_HELPER_1(glue(pmovmskb, SUFFIX), i32, Reg)
  228: DEF_HELPER_2(glue(packsswb, SUFFIX), void, Reg, Reg)
  229: DEF_HELPER_2(glue(packuswb, SUFFIX), void, Reg, Reg)
  230: DEF_HELPER_2(glue(packssdw, SUFFIX), void, Reg, Reg)
  231: #define UNPCK_OP(base_name, base)                               \
  232:     DEF_HELPER_2(glue(punpck ## base_name ## bw, SUFFIX) , void, Reg, Reg) \
  233:     DEF_HELPER_2(glue(punpck ## base_name ## wd, SUFFIX) , void, Reg, Reg) \
  234:     DEF_HELPER_2(glue(punpck ## base_name ## dq, SUFFIX) , void, Reg, Reg)
  235: 
  236: UNPCK_OP(l, 0)
  237: UNPCK_OP(h, 1)
  238: 
  239: #if SHIFT == 1
  240: DEF_HELPER_2(glue(punpcklqdq, SUFFIX), void, Reg, Reg)
  241: DEF_HELPER_2(glue(punpckhqdq, SUFFIX), void, Reg, Reg)
  242: #endif
  243: 
  244: /* 3DNow! float ops */
  245: #if SHIFT == 0
  246: DEF_HELPER_2(pi2fd, void, MMXReg, MMXReg)
  247: DEF_HELPER_2(pi2fw, void, MMXReg, MMXReg)
  248: DEF_HELPER_2(pf2id, void, MMXReg, MMXReg)
  249: DEF_HELPER_2(pf2iw, void, MMXReg, MMXReg)
  250: DEF_HELPER_2(pfacc, void, MMXReg, MMXReg)
  251: DEF_HELPER_2(pfadd, void, MMXReg, MMXReg)
  252: DEF_HELPER_2(pfcmpeq, void, MMXReg, MMXReg)
  253: DEF_HELPER_2(pfcmpge, void, MMXReg, MMXReg)
  254: DEF_HELPER_2(pfcmpgt, void, MMXReg, MMXReg)
  255: DEF_HELPER_2(pfmax, void, MMXReg, MMXReg)
  256: DEF_HELPER_2(pfmin, void, MMXReg, MMXReg)
  257: DEF_HELPER_2(pfmul, void, MMXReg, MMXReg)
  258: DEF_HELPER_2(pfnacc, void, MMXReg, MMXReg)
  259: DEF_HELPER_2(pfpnacc, void, MMXReg, MMXReg)
  260: DEF_HELPER_2(pfrcp, void, MMXReg, MMXReg)
  261: DEF_HELPER_2(pfrsqrt, void, MMXReg, MMXReg)
  262: DEF_HELPER_2(pfsub, void, MMXReg, MMXReg)
  263: DEF_HELPER_2(pfsubr, void, MMXReg, MMXReg)
  264: DEF_HELPER_2(pswapd, void, MMXReg, MMXReg)
  265: #endif
  266: 
  267: /* SSSE3 op helpers */
  268: DEF_HELPER_2(glue(phaddw, SUFFIX), void, Reg, Reg)
  269: DEF_HELPER_2(glue(phaddd, SUFFIX), void, Reg, Reg)
  270: DEF_HELPER_2(glue(phaddsw, SUFFIX), void, Reg, Reg)
  271: DEF_HELPER_2(glue(phsubw, SUFFIX), void, Reg, Reg)
  272: DEF_HELPER_2(glue(phsubd, SUFFIX), void, Reg, Reg)
  273: DEF_HELPER_2(glue(phsubsw, SUFFIX), void, Reg, Reg)
  274: DEF_HELPER_2(glue(pabsb, SUFFIX), void, Reg, Reg)
  275: DEF_HELPER_2(glue(pabsw, SUFFIX), void, Reg, Reg)
  276: DEF_HELPER_2(glue(pabsd, SUFFIX), void, Reg, Reg)
  277: DEF_HELPER_2(glue(pmaddubsw, SUFFIX), void, Reg, Reg)
  278: DEF_HELPER_2(glue(pmulhrsw, SUFFIX), void, Reg, Reg)
  279: DEF_HELPER_2(glue(pshufb, SUFFIX), void, Reg, Reg)
  280: DEF_HELPER_2(glue(psignb, SUFFIX), void, Reg, Reg)
  281: DEF_HELPER_2(glue(psignw, SUFFIX), void, Reg, Reg)
  282: DEF_HELPER_2(glue(psignd, SUFFIX), void, Reg, Reg)
  283: DEF_HELPER_3(glue(palignr, SUFFIX), void, Reg, Reg, s32)
  284: 
  285: /* SSE4.1 op helpers */
  286: #if SHIFT == 1
  287: DEF_HELPER_2(glue(pblendvb, SUFFIX), void, Reg, Reg)
  288: DEF_HELPER_2(glue(blendvps, SUFFIX), void, Reg, Reg)
  289: DEF_HELPER_2(glue(blendvpd, SUFFIX), void, Reg, Reg)
  290: DEF_HELPER_2(glue(ptest, SUFFIX), void, Reg, Reg)
  291: DEF_HELPER_2(glue(pmovsxbw, SUFFIX), void, Reg, Reg)
  292: DEF_HELPER_2(glue(pmovsxbd, SUFFIX), void, Reg, Reg)
  293: DEF_HELPER_2(glue(pmovsxbq, SUFFIX), void, Reg, Reg)
  294: DEF_HELPER_2(glue(pmovsxwd, SUFFIX), void, Reg, Reg)
  295: DEF_HELPER_2(glue(pmovsxwq, SUFFIX), void, Reg, Reg)
  296: DEF_HELPER_2(glue(pmovsxdq, SUFFIX), void, Reg, Reg)
  297: DEF_HELPER_2(glue(pmovzxbw, SUFFIX), void, Reg, Reg)
  298: DEF_HELPER_2(glue(pmovzxbd, SUFFIX), void, Reg, Reg)
  299: DEF_HELPER_2(glue(pmovzxbq, SUFFIX), void, Reg, Reg)
  300: DEF_HELPER_2(glue(pmovzxwd, SUFFIX), void, Reg, Reg)
  301: DEF_HELPER_2(glue(pmovzxwq, SUFFIX), void, Reg, Reg)
  302: DEF_HELPER_2(glue(pmovzxdq, SUFFIX), void, Reg, Reg)
  303: DEF_HELPER_2(glue(pmuldq, SUFFIX), void, Reg, Reg)
  304: DEF_HELPER_2(glue(pcmpeqq, SUFFIX), void, Reg, Reg)
  305: DEF_HELPER_2(glue(packusdw, SUFFIX), void, Reg, Reg)
  306: DEF_HELPER_2(glue(pminsb, SUFFIX), void, Reg, Reg)
  307: DEF_HELPER_2(glue(pminsd, SUFFIX), void, Reg, Reg)
  308: DEF_HELPER_2(glue(pminuw, SUFFIX), void, Reg, Reg)
  309: DEF_HELPER_2(glue(pminud, SUFFIX), void, Reg, Reg)
  310: DEF_HELPER_2(glue(pmaxsb, SUFFIX), void, Reg, Reg)
  311: DEF_HELPER_2(glue(pmaxsd, SUFFIX), void, Reg, Reg)
  312: DEF_HELPER_2(glue(pmaxuw, SUFFIX), void, Reg, Reg)
  313: DEF_HELPER_2(glue(pmaxud, SUFFIX), void, Reg, Reg)
  314: DEF_HELPER_2(glue(pmulld, SUFFIX), void, Reg, Reg)
  315: DEF_HELPER_2(glue(phminposuw, SUFFIX), void, Reg, Reg)
  316: DEF_HELPER_3(glue(roundps, SUFFIX), void, Reg, Reg, i32)
  317: DEF_HELPER_3(glue(roundpd, SUFFIX), void, Reg, Reg, i32)
  318: DEF_HELPER_3(glue(roundss, SUFFIX), void, Reg, Reg, i32)
  319: DEF_HELPER_3(glue(roundsd, SUFFIX), void, Reg, Reg, i32)
  320: DEF_HELPER_3(glue(blendps, SUFFIX), void, Reg, Reg, i32)
  321: DEF_HELPER_3(glue(blendpd, SUFFIX), void, Reg, Reg, i32)
  322: DEF_HELPER_3(glue(pblendw, SUFFIX), void, Reg, Reg, i32)
  323: DEF_HELPER_3(glue(dpps, SUFFIX), void, Reg, Reg, i32)
  324: DEF_HELPER_3(glue(dppd, SUFFIX), void, Reg, Reg, i32)
  325: DEF_HELPER_3(glue(mpsadbw, SUFFIX), void, Reg, Reg, i32)
  326: #endif
  327: 
  328: /* SSE4.2 op helpers */
  329: #if SHIFT == 1
  330: DEF_HELPER_2(glue(pcmpgtq, SUFFIX), void, Reg, Reg)
  331: DEF_HELPER_3(glue(pcmpestri, SUFFIX), void, Reg, Reg, i32)
  332: DEF_HELPER_3(glue(pcmpestrm, SUFFIX), void, Reg, Reg, i32)
  333: DEF_HELPER_3(glue(pcmpistri, SUFFIX), void, Reg, Reg, i32)
  334: DEF_HELPER_3(glue(pcmpistrm, SUFFIX), void, Reg, Reg, i32)
  335: DEF_HELPER_3(crc32, tl, i32, tl, i32)
  336: DEF_HELPER_2(popcnt, tl, tl, i32)
  337: #endif
  338: 
  339: #undef SHIFT
  340: #undef Reg
  341: #undef SUFFIX
  342: 
  343: #undef SSE_HELPER_B
  344: #undef SSE_HELPER_W
  345: #undef SSE_HELPER_L
  346: #undef SSE_HELPER_Q
  347: #undef SSE_HELPER_S
  348: #undef SSE_HELPER_CMP
  349: #undef UNPCK_OP

unix.superglobalmegacorp.com