00001 #ifdef MMX
00002 #define BUFFPOINTNB 16
00003 #define BUFFPOINTMASK 0xffff
00004 #define BUFFINCR 0xff
00005
00006 #include "mmx.h"
00007
00008 #define sqrtperte 16
00009
00010 #define PERTEMASK 0xf
00011
00012 #define PERTEDEC 4
00013
00014 int zoom_filter_mmx_supported () {
00015 return (mm_support()&0x1);
00016 }
00017
00018 void zoom_filter_mmx (int prevX, int prevY,
00019 unsigned int *expix1, unsigned int *expix2,
00020 int *brutS, int *brutD, int buffratio,
00021 int precalCoef[16][16])
00022 {
00023 unsigned int ax = (prevX-1)<<PERTEDEC, ay = (prevY-1)<<PERTEDEC;
00024
00025 int bufsize = prevX * prevY;
00026 int loop;
00027
00028 pxor_r2r(mm7,mm7);
00029
00030 for (loop=0; loop<bufsize; loop++)
00031 {
00032 int px,py;
00033 int pos;
00034 int coeffs;
00035
00036 int posplusprevX;
00037
00038 int myPos = loop << 1,
00039 myPos2 = myPos + 1;
00040 int brutSmypos = brutS[myPos];
00041
00042 px = brutSmypos + (((brutD[myPos] - brutSmypos)*buffratio) >> BUFFPOINTNB);
00043 brutSmypos = brutS[myPos2];
00044 py = brutSmypos + (((brutD[myPos2] - brutSmypos)*buffratio) >> BUFFPOINTNB);
00045 if (px < 0)
00046 px = 0;
00047 if (py < 0)
00048 py = 0;
00049
00050 if ((py>=(int)ay) || (px>=(int)ax)) {
00051 pos=coeffs=0;
00052 }
00053 else {
00054 pos = ((px >> PERTEDEC) + prevX * (py >> PERTEDEC));
00055
00056 coeffs = precalCoef [px & PERTEMASK][py & PERTEMASK];
00057 }
00058
00059 posplusprevX = pos + prevX;
00060
00061 movd_m2r(coeffs, mm6);
00062 ;
00063 movq_m2r(expix1[pos], mm0);
00064 movq_r2r(mm0, mm1);
00065 ;
00066 punpcklbw_r2r(mm7, mm0);
00067 movq_r2r(mm6, mm5);
00068 ;
00069 punpckhbw_r2r(mm7, mm1);
00070 ;
00071 punpcklbw_r2r(mm5, mm6);
00072 movq_r2r(mm6, mm4);
00073 movq_r2r(mm6, mm5);
00074 punpcklbw_r2r(mm5, mm6);
00075 punpckhbw_r2r(mm5, mm4);
00076
00077 movq_r2r(mm6, mm3);
00078 punpcklbw_r2r(mm7, mm6);
00079 punpckhbw_r2r(mm7, mm3);
00080 ;
00081 pmullw_r2r(mm6, mm0);
00082 pmullw_r2r(mm3, mm1);
00083 paddw_r2r(mm1, mm0);
00084
00085 ;
00086 movq_r2r(mm4, mm5);
00087 punpcklbw_r2r(mm7, mm4);
00088 punpckhbw_r2r(mm7, mm5);
00089
00090
00091 ;
00092 movq_m2r(expix1[posplusprevX], mm1);
00093 movq_r2r(mm1, mm2);
00094
00095 ;
00096 punpcklbw_r2r(mm7, mm1);
00097 punpckhbw_r2r(mm7, mm2);
00098
00099 ;
00100 pmullw_r2r(mm4, mm1);
00101 pmullw_r2r(mm5, mm2);
00102
00103 ;
00104 paddw_r2r(mm1, mm0);
00105 paddw_r2r(mm2, mm0);
00106
00107 ;
00108 psrlw_i2r(8, mm0);
00109 packuswb_r2r(mm7, mm0);
00110 movd_r2m(mm0,expix2[loop]);
00111 }
00112 emms();
00113 }
00114
00115 #else
00116
00117 int zoom_filter_mmx_supported () {
00118 return 0;
00119 }
00120
00121 void zoom_filter_mmx (int prevX, int prevY,
00122 unsigned int *expix1, unsigned int *expix2,
00123 int *brutS, int *brutD, int buffratio,
00124 int precalCoef[16][16])
00125 {
00126 return;
00127 }
00128
00129 #endif