00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "config.h"
00038 #include "global.h"
00039 #include "mpeg2enc.h"
00040 #include "simd.h"
00041 #include "attributes.h"
00042 #include "mmx.h"
00043 #include "fastintfns.h"
00044
00045
00046
00047
00048
00049
00050
00051
00052 static inline void mmx_zero_reg (void)
00053 {
00054
00055 pxor_r2r (mm7, mm7);
00056 }
00057
00058
00059
00060
00061
00062
00063
00064 static __inline__ void load_blk(uint8_t *blk, uint32_t rowstride, int h)
00065 {
00066
00067
00068 uint8_t *blk2 = blk + rowstride * 2;
00069
00070 movq_m2r( *blk, mm0);
00071 blk += rowstride;
00072 movq_m2r( *blk, mm1);
00073
00074
00075 if( h == 2 )
00076 return;
00077
00078
00079 movq_m2r( *blk2, mm2);
00080 blk2 += rowstride;
00081 movq_m2r( *blk2, mm3);
00082 }
00083
00084
00085
00086
00087
00088 static __inline__ void shift_blk(const uint32_t shift)
00089 {
00090 psrlq_i2r( shift,mm0);
00091 psrlq_i2r( shift,mm1);
00092 psrlq_i2r( shift,mm2);
00093 psrlq_i2r( shift,mm3);
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108 static __inline__ int qblock_sad_mmxe(uint8_t *refblk,
00109 uint32_t h,
00110 uint32_t rowstride)
00111 {
00112 int res;
00113 pxor_r2r (mm4,mm4);
00114
00115 movq_r2r (mm0,mm5);
00116 movd_m2r (*refblk, mm6);
00117 pxor_r2r ( mm7, mm7);
00118 refblk += rowstride;
00119 punpcklbw_r2r ( mm7, mm5);
00120 punpcklbw_r2r ( mm7, mm6);
00121 psadbw_r2r ( mm5, mm6);
00122 paddw_r2r ( mm6, mm4 );
00123
00124
00125
00126 movq_r2r (mm1,mm5);
00127 movd_m2r (*refblk, mm6);
00128 refblk += rowstride;
00129 punpcklbw_r2r ( mm7, mm5);
00130 punpcklbw_r2r ( mm7, mm6);
00131 psadbw_r2r ( mm5, mm6);
00132 paddw_r2r ( mm6, mm4 );
00133
00134 if( h == 4 )
00135 {
00136
00137 movq_r2r (mm2,mm5);
00138 movd_m2r (*refblk, mm6);
00139 refblk += rowstride;
00140 punpcklbw_r2r ( mm7, mm5);
00141 punpcklbw_r2r ( mm7, mm6);
00142 psadbw_r2r ( mm5, mm6);
00143 paddw_r2r ( mm6, mm4 );
00144
00145
00146 movq_r2r (mm3,mm5);
00147 movd_m2r (*refblk, mm6);
00148 punpcklbw_r2r ( mm7, mm5);
00149 punpcklbw_r2r ( mm7, mm6);
00150 psadbw_r2r ( mm5, mm6);
00151 paddw_r2r ( mm6, mm4 );
00152
00153 }
00154 movd_r2m ( mm4, res );
00155
00156 return res;
00157 }
00158
00159
00160
00161 static __inline__ int qblock_sad_mmx(uint8_t *refblk,
00162 uint32_t h,
00163 uint32_t rowstride)
00164 {
00165 int res;
00166 pxor_r2r (mm4,mm4);
00167
00168 movq_r2r (mm0,mm5);
00169 movd_m2r (*refblk, mm6);
00170 pxor_r2r ( mm7, mm7);
00171 refblk += rowstride;
00172 punpcklbw_r2r ( mm7, mm5);
00173
00174 punpcklbw_r2r ( mm7, mm6);
00175
00176 movq_r2r ( mm5, mm7);
00177 psubusw_r2r ( mm6, mm5);
00178
00179 psubusw_r2r ( mm7, mm6);
00180
00181 paddw_r2r ( mm5, mm4);
00182 paddw_r2r ( mm6, mm4 );
00183
00184
00185
00186 movq_r2r (mm1,mm5);
00187 movd_m2r (*refblk, mm6);
00188 pxor_r2r ( mm7, mm7);
00189 refblk += rowstride;
00190 punpcklbw_r2r ( mm7, mm5);
00191 punpcklbw_r2r ( mm7, mm6);
00192 movq_r2r ( mm5, mm7);
00193 psubusw_r2r ( mm6, mm5);
00194 psubusw_r2r ( mm7, mm6);
00195 paddw_r2r ( mm5, mm4);
00196 paddw_r2r ( mm6, mm4 );
00197
00198 if( h == 4 )
00199 {
00200
00201 movq_r2r (mm2,mm5);
00202 movd_m2r (*refblk, mm6);
00203 pxor_r2r ( mm7, mm7);
00204 refblk += rowstride;
00205 punpcklbw_r2r ( mm7, mm5);
00206 punpcklbw_r2r ( mm7, mm6);
00207 movq_r2r ( mm5, mm7);
00208 psubusw_r2r ( mm6, mm5);
00209 psubusw_r2r ( mm7, mm6);
00210 paddw_r2r ( mm5, mm4);
00211 paddw_r2r ( mm6, mm4 );
00212
00213 movq_r2r (mm3,mm5);
00214 movd_m2r (*refblk, mm6);
00215 pxor_r2r ( mm7, mm7);
00216 punpcklbw_r2r ( mm7, mm5);
00217 punpcklbw_r2r ( mm7, mm6);
00218 movq_r2r ( mm5, mm7);
00219 psubusw_r2r ( mm6, mm5);
00220 psubusw_r2r ( mm7, mm6);
00221 paddw_r2r ( mm5, mm4);
00222 paddw_r2r ( mm6, mm4 );
00223 }
00224
00225
00226 movq_r2r ( mm4, mm5 );
00227 psrlq_i2r ( 32, mm5 );
00228 paddw_r2r ( mm5, mm4 );
00229 movq_r2r ( mm4, mm6 );
00230 psrlq_i2r ( 16, mm6 );
00231 paddw_r2r ( mm6, mm4 );
00232 movd_r2m ( mm4, res );
00233
00234 return res & 0xffff;
00235 }
00236
00237
00238
00239
00240
00241 #define SIMD_SUFFIX(x) x##_mmxe
00242 #include "mblock_sub44_sads_x86_h.c"
00243 #undef SIMD_SUFFIX
00244
00245
00246
00247 #define SIMD_SUFFIX(x) x##_mmx
00248 #include "mblock_sub44_sads_x86_h.c"
00249 #undef SIMD_SUFFIX
00250
00251
00252
00253