?? ops_sse.h.svn-base
字號:
/* * 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 + -