⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ops_sse.h

📁 xen 3.2.2 源码
💻 H
📖 第 1 页 / 共 3 页
字号:
/* *  MMX/SSE/SSE2/PNI support *  *  Copyright (c) 2005 Fabrice Bellard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * 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 */#if SHIFT == 0#define Reg MMXReg#define XMM_ONLY(x...)#define B(n) MMX_B(n)#define W(n) MMX_W(n)#define L(n) MMX_L(n)#define Q(n) q#define SUFFIX _mmx#else#define Reg XMMReg#define XMM_ONLY(x...) x#define B(n) XMM_B(n)#define W(n) XMM_W(n)#define L(n) XMM_L(n)#define Q(n) XMM_Q(n)#define SUFFIX _xmm#endifvoid OPPROTO glue(op_psrlw, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 15) {        d->Q(0) = 0;#if SHIFT == 1        d->Q(1) = 0;#endif    } else {        shift = s->B(0);        d->W(0) >>= shift;        d->W(1) >>= shift;        d->W(2) >>= shift;        d->W(3) >>= shift;#if SHIFT == 1        d->W(4) >>= shift;        d->W(5) >>= shift;        d->W(6) >>= shift;        d->W(7) >>= shift;#endif    }    FORCE_RET();}void OPPROTO glue(op_psraw, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 15) {        shift = 15;    } else {        shift = s->B(0);    }    d->W(0) = (int16_t)d->W(0) >> shift;    d->W(1) = (int16_t)d->W(1) >> shift;    d->W(2) = (int16_t)d->W(2) >> shift;    d->W(3) = (int16_t)d->W(3) >> shift;#if SHIFT == 1    d->W(4) = (int16_t)d->W(4) >> shift;    d->W(5) = (int16_t)d->W(5) >> shift;    d->W(6) = (int16_t)d->W(6) >> shift;    d->W(7) = (int16_t)d->W(7) >> shift;#endif}void OPPROTO glue(op_psllw, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 15) {        d->Q(0) = 0;#if SHIFT == 1        d->Q(1) = 0;#endif    } else {        shift = s->B(0);        d->W(0) <<= shift;        d->W(1) <<= shift;        d->W(2) <<= shift;        d->W(3) <<= shift;#if SHIFT == 1        d->W(4) <<= shift;        d->W(5) <<= shift;        d->W(6) <<= shift;        d->W(7) <<= shift;#endif    }    FORCE_RET();}void OPPROTO glue(op_psrld, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 31) {        d->Q(0) = 0;#if SHIFT == 1        d->Q(1) = 0;#endif    } else {        shift = s->B(0);        d->L(0) >>= shift;        d->L(1) >>= shift;#if SHIFT == 1        d->L(2) >>= shift;        d->L(3) >>= shift;#endif    }    FORCE_RET();}void OPPROTO glue(op_psrad, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 31) {        shift = 31;    } else {        shift = s->B(0);    }    d->L(0) = (int32_t)d->L(0) >> shift;    d->L(1) = (int32_t)d->L(1) >> shift;#if SHIFT == 1    d->L(2) = (int32_t)d->L(2) >> shift;    d->L(3) = (int32_t)d->L(3) >> shift;#endif}void OPPROTO glue(op_pslld, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 31) {        d->Q(0) = 0;#if SHIFT == 1        d->Q(1) = 0;#endif    } else {        shift = s->B(0);        d->L(0) <<= shift;        d->L(1) <<= shift;#if SHIFT == 1        d->L(2) <<= shift;        d->L(3) <<= shift;#endif    }    FORCE_RET();}void OPPROTO glue(op_psrlq, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 63) {        d->Q(0) = 0;#if SHIFT == 1        d->Q(1) = 0;#endif    } else {        shift = s->B(0);        d->Q(0) >>= shift;#if SHIFT == 1        d->Q(1) >>= shift;#endif    }    FORCE_RET();}void OPPROTO glue(op_psllq, SUFFIX)(void){    Reg *d, *s;    int shift;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    if (s->Q(0) > 63) {        d->Q(0) = 0;#if SHIFT == 1        d->Q(1) = 0;#endif    } else {        shift = s->B(0);        d->Q(0) <<= shift;#if SHIFT == 1        d->Q(1) <<= shift;#endif    }    FORCE_RET();}#if SHIFT == 1void OPPROTO glue(op_psrldq, SUFFIX)(void){    Reg *d, *s;    int shift, i;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    shift = s->L(0);    if (shift > 16)        shift = 16;    for(i = 0; i < 16 - shift; i++)        d->B(i) = d->B(i + shift);    for(i = 16 - shift; i < 16; i++)        d->B(i) = 0;    FORCE_RET();}void OPPROTO glue(op_pslldq, SUFFIX)(void){    Reg *d, *s;    int shift, i;    d = (Reg *)((char *)env + PARAM1);    s = (Reg *)((char *)env + PARAM2);    shift = s->L(0);    if (shift > 16)        shift = 16;    for(i = 15; i >= shift; i--)        d->B(i) = d->B(i - shift);    for(i = 0; i < shift; i++)        d->B(i) = 0;    FORCE_RET();}#endif#define SSE_OP_B(name, F)\void OPPROTO glue(name, SUFFIX) (void)\{\    Reg *d, *s;\    d = (Reg *)((char *)env + PARAM1);\    s = (Reg *)((char *)env + PARAM2);\    d->B(0) = F(d->B(0), s->B(0));\    d->B(1) = F(d->B(1), s->B(1));\    d->B(2) = F(d->B(2), s->B(2));\    d->B(3) = F(d->B(3), s->B(3));\    d->B(4) = F(d->B(4), s->B(4));\    d->B(5) = F(d->B(5), s->B(5));\    d->B(6) = F(d->B(6), s->B(6));\    d->B(7) = F(d->B(7), s->B(7));\    XMM_ONLY(\    d->B(8) = F(d->B(8), s->B(8));\    d->B(9) = F(d->B(9), s->B(9));\    d->B(10) = F(d->B(10), s->B(10));\    d->B(11) = F(d->B(11), s->B(11));\    d->B(12) = F(d->B(12), s->B(12));\    d->B(13) = F(d->B(13), s->B(13));\    d->B(14) = F(d->B(14), s->B(14));\    d->B(15) = F(d->B(15), s->B(15));\    )\}#define SSE_OP_W(name, F)\void OPPROTO glue(name, SUFFIX) (void)\{\    Reg *d, *s;\    d = (Reg *)((char *)env + PARAM1);\    s = (Reg *)((char *)env + PARAM2);\    d->W(0) = F(d->W(0), s->W(0));\    d->W(1) = F(d->W(1), s->W(1));\    d->W(2) = F(d->W(2), s->W(2));\    d->W(3) = F(d->W(3), s->W(3));\    XMM_ONLY(\    d->W(4) = F(d->W(4), s->W(4));\    d->W(5) = F(d->W(5), s->W(5));\    d->W(6) = F(d->W(6), s->W(6));\    d->W(7) = F(d->W(7), s->W(7));\    )\}#define SSE_OP_L(name, F)\void OPPROTO glue(name, SUFFIX) (void)\{\    Reg *d, *s;\    d = (Reg *)((char *)env + PARAM1);\    s = (Reg *)((char *)env + PARAM2);\    d->L(0) = F(d->L(0), s->L(0));\    d->L(1) = F(d->L(1), s->L(1));\    XMM_ONLY(\    d->L(2) = F(d->L(2), s->L(2));\    d->L(3) = F(d->L(3), s->L(3));\    )\}#define SSE_OP_Q(name, F)\void OPPROTO glue(name, SUFFIX) (void)\{\    Reg *d, *s;\    d = (Reg *)((char *)env + PARAM1);\    s = (Reg *)((char *)env + PARAM2);\    d->Q(0) = F(d->Q(0), s->Q(0));\    XMM_ONLY(\    d->Q(1) = F(d->Q(1), s->Q(1));\    )\}#if SHIFT == 0static inline int satub(int x){    if (x < 0)        return 0;    else if (x > 255)        return 255;    else        return x;}static inline int satuw(int x){    if (x < 0)        return 0;    else if (x > 65535)        return 65535;    else        return x;}static inline int satsb(int x){    if (x < -128)        return -128;    else if (x > 127)        return 127;    else        return x;}static inline int satsw(int x){    if (x < -32768)        return -32768;    else if (x > 32767)        return 32767;    else        return x;}#define FADD(a, b) ((a) + (b))#define FADDUB(a, b) satub((a) + (b))#define FADDUW(a, b) satuw((a) + (b))#define FADDSB(a, b) satsb((int8_t)(a) + (int8_t)(b))#define FADDSW(a, b) satsw((int16_t)(a) + (int16_t)(b))#define FSUB(a, b) ((a) - (b))#define FSUBUB(a, b) satub((a) - (b))#define FSUBUW(a, b) satuw((a) - (b))#define FSUBSB(a, b) satsb((int8_t)(a) - (int8_t)(b))#define FSUBSW(a, b) satsw((int16_t)(a) - (int16_t)(b))#define FMINUB(a, b) ((a) < (b)) ? (a) : (b)#define FMINSW(a, b) ((int16_t)(a) < (int16_t)(b)) ? (a) : (b)#define FMAXUB(a, b) ((a) > (b)) ? (a) : (b)#define FMAXSW(a, b) ((int16_t)(a) > (int16_t)(b)) ? (a) : (b)#define FAND(a, 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#define FCMPGTW(a, b) (int16_t)(a) > (int16_t)(b) ? -1 : 0#define FCMPGTL(a, b) (int32_t)(a) > (int32_t)(b) ? -1 : 0#define FCMPEQ(a, b) (a) == (b) ? -1 : 0#define FMULLW(a, b) (a) * (b)#define FMULHUW(a, b) (a) * (b) >> 16#define FMULHW(a, b) (int16_t)(a) * (int16_t)(b) >> 16#define FAVG(a, b) ((a) + (b) + 1) >> 1#endifSSE_OP_B(op_paddb, FADD)SSE_OP_W(op_paddw, FADD)SSE_OP_L(op_paddl, FADD)SSE_OP_Q(op_paddq, FADD)SSE_OP_B(op_psubb, FSUB)SSE_OP_W(op_psubw, FSUB)SSE_OP_L(op_psubl, FSUB)SSE_OP_Q(op_psubq, FSUB)SSE_OP_B(op_paddusb, FADDUB)SSE_OP_B(op_paddsb, FADDSB)SSE_OP_B(op_psubusb, FSUBUB)SSE_OP_B(op_psubsb, FSUBSB)SSE_OP_W(op_paddusw, FADDUW)SSE_OP_W(op_paddsw, FADDSW)SSE_OP_W(op_psubusw, FSUBUW)SSE_OP_W(op_psubsw, FSUBSW)SSE_OP_B(op_pminub, FMINUB)SSE_OP_B(op_pmaxub, FMAXUB)SSE_OP_W(op_pminsw, FMINSW)SSE_OP_W(op_pmaxsw, FMAXSW)SSE_OP_Q(op_pand, FAND)SSE_OP_Q(op_pandn, FANDN)SSE_OP_Q(op_por, FOR)SSE_OP_Q(op_pxor, FXOR)SSE_OP_B(op_pcmpgtb, FCMPGTB)SSE_OP_W(op_pcmpgtw, FCMPGTW)SSE_OP_L(op_pcmpgtl, FCMPGTL)SSE_OP_B(op_pcmpeqb, FCMPEQ)SSE_OP_W(op_pcmpeqw, FCMPEQ)SSE_OP_L(op_pcmpeql, FCMPEQ)SSE_OP_W(op_pmullw, FMULLW)SSE_OP_W(op_pmulhuw, FMULHUW)SSE_OP_W(op_pmulhw, FMULHW)SSE_OP_B(op_pavgb, FAVG)SSE_OP_W(op_pavgw, FAVG)void OPPROTO glue(op_pmuludq, SUFFIX) (void){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -