00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef __cplusplus
00022 extern "C" {
00023 #endif
00024
00025 #ifndef __FLGR_CORE_TRANSFORM_FAST_UTIL_H
00026 #define __FLGR_CORE_TRANSFORM_FAST_UTIL_H
00027
00028
00029
00030
00031
00032
00033
00034
00035 #define FLGR_MACRO_TRANSPOSE_BLOCK_8x8_BYTE(tmp, r1,r2,r3,r4,r5,r6,r7,r8) \
00036 \
00037 tmp1 = _m_punpckhbw(r1,r2); \
00038 r2 = _m_punpcklbw(r1,r2); \
00039 r1 = tmp1; \
00040 \
00041 tmp1 = _m_punpckhbw(r3,r4); \
00042 r4 = _m_punpcklbw(r3,r4); \
00043 r3 = tmp1; \
00044 \
00045 tmp1 = _m_punpckhbw(r5,r6); \
00046 r6 = _m_punpcklbw(r5,r6); \
00047 r5 = tmp1; \
00048 \
00049 tmp1 = _m_punpckhbw(r7,r8); \
00050 r8 = _m_punpcklbw(r7,r8); \
00051 r7 = tmp1; \
00052 \
00053 \
00054 tmp1 = _m_punpckhwd(r1,r3); \
00055 r3 = _m_punpcklwd(r1,r3); \
00056 r1 = tmp1; \
00057 \
00058 tmp1 = _m_punpckhwd(r2,r4); \
00059 r4 = _m_punpcklwd(r2,r4); \
00060 r2 = tmp1; \
00061 \
00062 tmp1 = _m_punpckhwd(r5,r7); \
00063 r7 = _m_punpcklwd(r5,r7); \
00064 r5 = tmp1; \
00065 \
00066 tmp1 = _m_punpckhwd(r6,r8); \
00067 r8 = _m_punpcklwd(r6,r8); \
00068 r6 = tmp1; \
00069 \
00070 \
00071 tmp1 = _m_punpckhdq(r1,r5); \
00072 r5 = _m_punpckldq(r1,r5); \
00073 r1 = tmp1; \
00074 \
00075 tmp1 = _m_punpckhdq(r3,r7); \
00076 r7 = _m_punpckldq(r3,r7); \
00077 r3 = tmp1; \
00078 \
00079 tmp1 = _m_punpckhdq(r2,r6); \
00080 r6 = _m_punpckldq(r2,r6); \
00081 r2 = tmp1; \
00082 \
00083 tmp1 = _m_punpckhdq(r4,r8); \
00084 r8 = _m_punpckldq(r4,r8); \
00085 r4 = tmp1; \
00086
00087
00088
00089 #define PUNPCKHBW(a,b) _mm_unpackhi_epi8(a,b)
00090 #define PUNPCKLBW(a,b) _mm_unpacklo_epi8(a,b)
00091
00092 #define PUNPCKHWD(a,b) _mm_unpackhi_epi16(a,b)
00093 #define PUNPCKLWD(a,b) _mm_unpacklo_epi16(a,b)
00094
00095 #define PUNPCKHDQ(a,b) _mm_unpackhi_epi32(a,b)
00096 #define PUNPCKLDQ(a,b) _mm_unpacklo_epi32(a,b)
00097
00098 #define PUNPCKHQDQ(a,b) _mm_unpackhi_epi64(a,b)
00099 #define PUNPCKLQDQ(a,b) _mm_unpacklo_epi64(a,b)
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 #define FLGR_MACRO_TRANSPOSE_BLOCK_16x16_BYTE(r1,r2,r3,r4,r5,r6,r7,r8, \
00111 r9,r10,r11,r12,r13,r14,r15,r16,tmp1) \
00112 \
00113 tmp1 = PUNPCKHBW(r1,r2); \
00114 r2 = PUNPCKLBW(r1,r2); \
00115 r1 = tmp1; \
00116 \
00117 tmp1 = PUNPCKHBW(r3,r4); \
00118 r4 = PUNPCKLBW(r3,r4); \
00119 r3 = tmp1; \
00120 \
00121 tmp1 = PUNPCKHBW(r5,r6); \
00122 r6 = PUNPCKLBW(r5,r6); \
00123 r5 = tmp1; \
00124 \
00125 tmp1 = PUNPCKHBW(r7,r8); \
00126 r8 = PUNPCKLBW(r7,r8); \
00127 r7 = tmp1; \
00128 \
00129 tmp1 = PUNPCKHBW(r9,r10); \
00130 r10 = PUNPCKLBW(r9,r10); \
00131 r9 = tmp1; \
00132 \
00133 tmp1 = PUNPCKHBW(r11,r12); \
00134 r12 = PUNPCKLBW(r11,r12); \
00135 r11 = tmp1; \
00136 \
00137 tmp1 = PUNPCKHBW(r13,r14); \
00138 r14 = PUNPCKLBW(r13,r14); \
00139 r13 = tmp1; \
00140 \
00141 tmp1 = PUNPCKHBW(r15,r16); \
00142 r16 = PUNPCKLBW(r15,r16); \
00143 r15 = tmp1; \
00144 \
00145 \
00146 tmp1 = PUNPCKHWD(r1,r3); \
00147 r3 = PUNPCKLWD(r1,r3); \
00148 r1 = tmp1; \
00149 \
00150 tmp1 = PUNPCKHWD(r2,r4); \
00151 r4 = PUNPCKLWD(r2,r4); \
00152 r2 = tmp1; \
00153 \
00154 tmp1 = PUNPCKHWD(r5,r7); \
00155 r7 = PUNPCKLWD(r5,r7); \
00156 r5 = tmp1; \
00157 \
00158 tmp1 = PUNPCKHWD(r6,r8); \
00159 r8 = PUNPCKLWD(r6,r8); \
00160 r6 = tmp1; \
00161 \
00162 tmp1 = PUNPCKHWD(r9,r11); \
00163 r11 = PUNPCKLWD(r9,r11); \
00164 r9 = tmp1; \
00165 \
00166 tmp1 = PUNPCKHWD(r10,r12); \
00167 r12 = PUNPCKLWD(r10,r12); \
00168 r10 = tmp1; \
00169 \
00170 tmp1 = PUNPCKHWD(r13,r15); \
00171 r15 = PUNPCKLWD(r13,r15); \
00172 r13 = tmp1; \
00173 \
00174 tmp1 = PUNPCKHWD(r14,r16); \
00175 r16 = PUNPCKLWD(r14,r16); \
00176 r14 = tmp1; \
00177 \
00178 \
00179 tmp1 = PUNPCKHDQ(r1,r5); \
00180 r5 = PUNPCKLDQ(r1,r5); \
00181 r1 = tmp1; \
00182 \
00183 tmp1 = PUNPCKHDQ(r2,r6); \
00184 r6 = PUNPCKLDQ(r2,r6); \
00185 r2 = tmp1; \
00186 \
00187 tmp1 = PUNPCKHDQ(r3,r7); \
00188 r7 = PUNPCKLDQ(r3,r7); \
00189 r3 = tmp1; \
00190 \
00191 tmp1 = PUNPCKHDQ(r4,r8); \
00192 r8 = PUNPCKLDQ(r4,r8); \
00193 r4 = tmp1; \
00194 \
00195 tmp1 = PUNPCKHDQ(r9,r13); \
00196 r13 = PUNPCKLDQ(r9,r13); \
00197 r9 = tmp1; \
00198 \
00199 tmp1 = PUNPCKHDQ(r10,r14); \
00200 r14 = PUNPCKLDQ(r10,r14); \
00201 r10 = tmp1; \
00202 \
00203 tmp1 = PUNPCKHDQ(r11,r15); \
00204 r15 = PUNPCKLDQ(r11,r15); \
00205 r11 = tmp1; \
00206 \
00207 tmp1 = PUNPCKHDQ(r12,r16); \
00208 r16 = PUNPCKLDQ(r12,r16); \
00209 r12 = tmp1; \
00210 \
00211 \
00212 tmp1 = PUNPCKHQDQ(r1,r9); \
00213 r9 = PUNPCKLQDQ(r1,r9); \
00214 r1 = tmp1; \
00215 \
00216 tmp1 = PUNPCKHQDQ(r2,r10); \
00217 r10 = PUNPCKLQDQ(r2,r10); \
00218 r2 = tmp1; \
00219 \
00220 tmp1 = PUNPCKHQDQ(r3,r11); \
00221 r11 = PUNPCKLQDQ(r3,r11); \
00222 r3 = tmp1; \
00223 \
00224 tmp1 = PUNPCKHQDQ(r4,r12); \
00225 r12 = PUNPCKLQDQ(r4,r12); \
00226 r4 = tmp1; \
00227 \
00228 tmp1 = PUNPCKHQDQ(r5,r13); \
00229 r13 = PUNPCKLQDQ(r5,r13); \
00230 r5 = tmp1; \
00231 \
00232 tmp1 = PUNPCKHQDQ(r6,r14); \
00233 r14 = PUNPCKLQDQ(r6,r14); \
00234 r6 = tmp1; \
00235 \
00236 tmp1 = PUNPCKHQDQ(r7,r15); \
00237 r15 = PUNPCKLQDQ(r7,r15); \
00238 r7 = tmp1; \
00239 \
00240 tmp1 = PUNPCKHQDQ(r8,r16); \
00241 r16 = PUNPCKLQDQ(r8,r16); \
00242 r8 = tmp1
00243
00244
00245
00246
00247
00248
00249
00250
00251 #define FLGR_MACRO_TRANSPOSE_BLOCK_8x8_WORD(r1,r2,r3,r4,r5,r6,r7,r8, tmp1) \
00252 \
00253 tmp1 = PUNPCKHWD(r1,r2); \
00254 r2 = PUNPCKLWD(r1,r2); \
00255 r1 = tmp1; \
00256 \
00257 tmp1 = PUNPCKHWD(r3,r4); \
00258 r4 = PUNPCKLWD(r3,r4); \
00259 r3 = tmp1; \
00260 \
00261 tmp1 = PUNPCKHWD(r5,r6); \
00262 r6 = PUNPCKLWD(r5,r6); \
00263 r5 = tmp1; \
00264 \
00265 tmp1 = PUNPCKHWD(r7,r8); \
00266 r8 = PUNPCKLWD(r7,r8); \
00267 r7 = tmp1; \
00268 \
00269 \
00270 tmp1 = PUNPCKHDQ(r1,r3); \
00271 r3 = PUNPCKLDQ(r1,r3); \
00272 r1 = tmp1; \
00273 \
00274 tmp1 = PUNPCKHDQ(r2,r4); \
00275 r4 = PUNPCKLDQ(r2,r4); \
00276 r2 = tmp1; \
00277 \
00278 tmp1 = PUNPCKHDQ(r5,r7); \
00279 r7 = PUNPCKLDQ(r5,r7); \
00280 r5 = tmp1; \
00281 \
00282 tmp1 = PUNPCKHDQ(r6,r8); \
00283 r8 = PUNPCKLDQ(r6,r8); \
00284 r6 = tmp1; \
00285 \
00286 \
00287 tmp1 = PUNPCKHQDQ(r1,r5); \
00288 r5 = PUNPCKLQDQ(r1,r5); \
00289 r1 = tmp1; \
00290 \
00291 tmp1 = PUNPCKHQDQ(r3,r7); \
00292 r7 = PUNPCKLQDQ(r3,r7); \
00293 r3 = tmp1; \
00294 \
00295 tmp1 = PUNPCKHQDQ(r2,r6); \
00296 r6 = PUNPCKLQDQ(r2,r6); \
00297 r2 = tmp1; \
00298 \
00299 tmp1 = PUNPCKHQDQ(r4,r8); \
00300 r8 = PUNPCKLQDQ(r4,r8); \
00301 r4 = tmp1
00302
00303
00304
00305
00306
00307
00308 #define FLGR_MACRO_TRANSPOSE_BLOCK_4x4_DWORD(r1,r2,r3,r4,tmp1) \
00309 \
00310 tmp1 = PUNPCKHDQ(r1,r2); \
00311 r2 = PUNPCKLDQ(r1,r2); \
00312 r1 = tmp1; \
00313 \
00314 tmp1 = PUNPCKHDQ(r3,r4); \
00315 r4 = PUNPCKLDQ(r3,r4); \
00316 r3 = tmp1; \
00317 \
00318 \
00319 tmp1 = PUNPCKHQDQ(r1,r3); \
00320 r3 = PUNPCKLQDQ(r1,r3); \
00321 r1 = tmp1; \
00322 \
00323 tmp1 = PUNPCKHQDQ(r2,r4); \
00324 r4 = PUNPCKLQDQ(r2,r4); \
00325 r2 = tmp1
00326
00327
00328
00329 #endif
00330
00331 #ifdef __cplusplus
00332 }
00333 #endif