simple_idct_mmx.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:53k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2.  * Simple IDCT MMX
  3.  *
  4.  * Copyright (c) 2001, 2002 Michael Niedermayer <michaelni@gmx.at>
  5.  *
  6.  * This library is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU Lesser General Public
  8.  * License as published by the Free Software Foundation; either
  9.  * version 2 of the License, or (at your option) any later version.
  10.  *
  11.  * This library is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * Lesser General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU Lesser General Public
  17.  * License along with this library; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  */
  20. #include "../dsputil.h"
  21. #include "../simple_idct.h"
  22. /*
  23. 23170.475006
  24. 22725.260826
  25. 21406.727617
  26. 19265.545870
  27. 16384.000000
  28. 12872.826198
  29. 8866.956905
  30. 4520.335430
  31. */
  32. #define C0 23170 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  33. #define C1 22725 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  34. #define C2 21407 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  35. #define C3 19266 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  36. #if 0
  37. #define C4 16384 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  38. #else
  39. #define C4 16383 //cos(i*M_PI/16)*sqrt(2)*(1<<14) - 0.5
  40. #endif
  41. #define C5 12873 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  42. #define C6 8867 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  43. #define C7 4520 //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  44. #define ROW_SHIFT 11
  45. #define COL_SHIFT 20 // 6
  46. static const uint64_t attribute_used __attribute__((aligned(8))) wm1010= 0xFFFF0000FFFF0000ULL;
  47. static const uint64_t attribute_used __attribute__((aligned(8))) d40000= 0x0000000000040000ULL;
  48. static const int16_t __attribute__((aligned(8))) coeffs[]= {
  49. 1<<(ROW_SHIFT-1), 0, 1<<(ROW_SHIFT-1), 0,
  50. // 1<<(COL_SHIFT-1), 0, 1<<(COL_SHIFT-1), 0,
  51. // 0, 1<<(COL_SHIFT-1-16), 0, 1<<(COL_SHIFT-1-16),
  52. 1<<(ROW_SHIFT-1), 1, 1<<(ROW_SHIFT-1), 0,
  53. // the 1 = ((1<<(COL_SHIFT-1))/C4)<<ROW_SHIFT :)
  54. // 0, 0, 0, 0,
  55. // 0, 0, 0, 0,
  56.  C4,  C4,  C4,  C4,
  57.  C4, -C4,  C4, -C4,
  58.  
  59.  C2,  C6,  C2,  C6,
  60.  C6, -C2,  C6, -C2,
  61.  
  62.  C1,  C3,  C1,  C3,
  63.  C5,  C7,  C5,  C7,
  64.  
  65.  C3, -C7,  C3, -C7,
  66. -C1, -C5, -C1, -C5,
  67.  
  68.  C5, -C1,  C5, -C1,
  69.  C7,  C3,  C7,  C3,
  70.  
  71.  C7, -C5,  C7, -C5,
  72.  C3, -C1,  C3, -C1
  73. };
  74. #if 0
  75. static void unused_var_killer(){
  76. int a= wm1010 + d40000;
  77. temp[0]=a;
  78. }
  79. static void inline idctCol (int16_t * col, int16_t *input)
  80. {
  81. #undef C0
  82. #undef C1
  83. #undef C2
  84. #undef C3
  85. #undef C4
  86. #undef C5
  87. #undef C6
  88. #undef C7
  89. int a0, a1, a2, a3, b0, b1, b2, b3;
  90. const int C0 = 23170; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  91. const int C1 = 22725; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  92. const int C2 = 21407; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  93. const int C3 = 19266; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  94. const int C4 = 16383; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  95. const int C5 = 12873; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  96. const int C6 = 8867; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  97. const int C7 = 4520; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  98. /*
  99. if( !(col[8*1] | col[8*2] |col[8*3] |col[8*4] |col[8*5] |col[8*6] | col[8*7])) {
  100. col[8*0] = col[8*1] = col[8*2] = col[8*3] = col[8*4] =
  101. col[8*5] = col[8*6] = col[8*7] = col[8*0]<<3;
  102. return;
  103. }*/
  104. col[8*0] = input[8*0 + 0];
  105. col[8*1] = input[8*2 + 0];
  106. col[8*2] = input[8*0 + 1];
  107. col[8*3] = input[8*2 + 1];
  108. col[8*4] = input[8*4 + 0];
  109. col[8*5] = input[8*6 + 0];
  110. col[8*6] = input[8*4 + 1];
  111. col[8*7] = input[8*6 + 1];
  112. a0 = C4*col[8*0] + C2*col[8*2] + C4*col[8*4] + C6*col[8*6] + (1<<(COL_SHIFT-1));
  113. a1 = C4*col[8*0] + C6*col[8*2] - C4*col[8*4] - C2*col[8*6] + (1<<(COL_SHIFT-1));
  114. a2 = C4*col[8*0] - C6*col[8*2] - C4*col[8*4] + C2*col[8*6] + (1<<(COL_SHIFT-1));
  115. a3 = C4*col[8*0] - C2*col[8*2] + C4*col[8*4] - C6*col[8*6] + (1<<(COL_SHIFT-1));
  116. b0 = C1*col[8*1] + C3*col[8*3] + C5*col[8*5] + C7*col[8*7];
  117. b1 = C3*col[8*1] - C7*col[8*3] - C1*col[8*5] - C5*col[8*7];
  118. b2 = C5*col[8*1] - C1*col[8*3] + C7*col[8*5] + C3*col[8*7];
  119. b3 = C7*col[8*1] - C5*col[8*3] + C3*col[8*5] - C1*col[8*7];
  120. col[8*0] = (a0 + b0) >> COL_SHIFT;
  121. col[8*1] = (a1 + b1) >> COL_SHIFT;
  122. col[8*2] = (a2 + b2) >> COL_SHIFT;
  123. col[8*3] = (a3 + b3) >> COL_SHIFT;
  124. col[8*4] = (a3 - b3) >> COL_SHIFT;
  125. col[8*5] = (a2 - b2) >> COL_SHIFT;
  126. col[8*6] = (a1 - b1) >> COL_SHIFT;
  127. col[8*7] = (a0 - b0) >> COL_SHIFT;
  128. }
  129. static void inline idctRow (int16_t * output, int16_t * input)
  130. {
  131. int16_t row[8];
  132. int a0, a1, a2, a3, b0, b1, b2, b3;
  133. const int C0 = 23170; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  134. const int C1 = 22725; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  135. const int C2 = 21407; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  136. const int C3 = 19266; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  137. const int C4 = 16383; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  138. const int C5 = 12873; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  139. const int C6 = 8867; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  140. const int C7 = 4520; //cos(i*M_PI/16)*sqrt(2)*(1<<14) + 0.5
  141. row[0] = input[0];
  142. row[2] = input[1];
  143. row[4] = input[4];
  144. row[6] = input[5];
  145. row[1] = input[8];
  146. row[3] = input[9];
  147. row[5] = input[12];
  148. row[7] = input[13];
  149. if( !(row[1] | row[2] |row[3] |row[4] |row[5] |row[6] | row[7]) ) {
  150. row[0] = row[1] = row[2] = row[3] = row[4] =
  151. row[5] = row[6] = row[7] = row[0]<<3;
  152. output[0] = row[0];
  153. output[2] = row[1];
  154. output[4] = row[2];
  155. output[6] = row[3];
  156. output[8] = row[4];
  157. output[10] = row[5];
  158. output[12] = row[6];
  159. output[14] = row[7];
  160. return;
  161. }
  162. a0 = C4*row[0] + C2*row[2] + C4*row[4] + C6*row[6] + (1<<(ROW_SHIFT-1));
  163. a1 = C4*row[0] + C6*row[2] - C4*row[4] - C2*row[6] + (1<<(ROW_SHIFT-1));
  164. a2 = C4*row[0] - C6*row[2] - C4*row[4] + C2*row[6] + (1<<(ROW_SHIFT-1));
  165. a3 = C4*row[0] - C2*row[2] + C4*row[4] - C6*row[6] + (1<<(ROW_SHIFT-1));
  166. b0 = C1*row[1] + C3*row[3] + C5*row[5] + C7*row[7];
  167. b1 = C3*row[1] - C7*row[3] - C1*row[5] - C5*row[7];
  168. b2 = C5*row[1] - C1*row[3] + C7*row[5] + C3*row[7];
  169. b3 = C7*row[1] - C5*row[3] + C3*row[5] - C1*row[7];
  170. row[0] = (a0 + b0) >> ROW_SHIFT;
  171. row[1] = (a1 + b1) >> ROW_SHIFT;
  172. row[2] = (a2 + b2) >> ROW_SHIFT;
  173. row[3] = (a3 + b3) >> ROW_SHIFT;
  174. row[4] = (a3 - b3) >> ROW_SHIFT;
  175. row[5] = (a2 - b2) >> ROW_SHIFT;
  176. row[6] = (a1 - b1) >> ROW_SHIFT;
  177. row[7] = (a0 - b0) >> ROW_SHIFT;
  178. output[0] = row[0];
  179. output[2] = row[1];
  180. output[4] = row[2];
  181. output[6] = row[3];
  182. output[8] = row[4];
  183. output[10] = row[5];
  184. output[12] = row[6];
  185. output[14] = row[7];
  186. }
  187. #endif
  188. static inline void idct(int16_t *block)
  189. {
  190. int64_t __attribute__((aligned(8))) align_tmp[16];
  191. int16_t * const temp= (int16_t*)align_tmp;
  192. asm volatile(
  193. #if 0 //Alternative, simpler variant
  194. #define ROW_IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  195. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  196. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  197. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  198. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  199. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  200. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  201. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  202. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  203. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  204. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  205. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  206. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  207. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  208. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  209. #rounder ", %%mm4 nt"
  210. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  211. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  212. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  213. "movq 56(%2), %%mm5 nt" /* C7 C5 C7 C5 */
  214. "pmaddwd %%mm3, %%mm5 nt" /* C7R7+C5R5 C7r7+C5r5 */
  215. #rounder ", %%mm0 nt"
  216. "paddd %%mm0, %%mm1 nt" /* A1 a1 */
  217. "paddd %%mm0, %%mm0 nt" 
  218. "psubd %%mm1, %%mm0 nt" /* A2 a2 */
  219. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  220. "paddd %%mm5, %%mm7 nt" /* B0 b0 */
  221. "movq 72(%2), %%mm5 nt" /* -C5 -C1 -C5 -C1 */
  222. "pmaddwd %%mm3, %%mm5 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  223. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  224. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  225. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  226. "paddd %%mm2, %%mm5 nt" /* B1 b1 */
  227. "psrad $" #shift ", %%mm7 nt"
  228. "psrad $" #shift ", %%mm4 nt"
  229. "movq %%mm1, %%mm2 nt" /* A1 a1 */
  230. "paddd %%mm5, %%mm1 nt" /* A1+B1 a1+b1 */
  231. "psubd %%mm5, %%mm2 nt" /* A1-B1 a1-b1 */
  232. "psrad $" #shift ", %%mm1 nt"
  233. "psrad $" #shift ", %%mm2 nt"
  234. "packssdw %%mm1, %%mm7 nt" /* A1+B1 a1+b1 A0+B0 a0+b0 */
  235. "packssdw %%mm4, %%mm2 nt" /* A0-B0 a0-b0 A1-B1 a1-b1 */
  236. "movq %%mm7, " #dst " nt"
  237. "movq " #src1 ", %%mm1 nt" /* R3 R1 r3 r1 */
  238. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  239. "movq %%mm2, 24+" #dst " nt"
  240. "pmaddwd %%mm1, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  241. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  242. "pmaddwd 96(%2), %%mm1 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  243. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  244. "movq %%mm0, %%mm2 nt" /* A2 a2 */
  245. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  246. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  247. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  248. "psubd %%mm4, %%mm0 nt" /* a2-B2 a2-b2 */
  249. "psrad $" #shift ", %%mm2 nt"
  250. "psrad $" #shift ", %%mm0 nt"
  251. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  252. "paddd %%mm1, %%mm3 nt" /* B3 b3 */
  253. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  254. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  255. "psrad $" #shift ", %%mm6 nt"
  256. "packssdw %%mm6, %%mm2 nt" /* A3+B3 a3+b3 A2+B2 a2+b2 */
  257. "movq %%mm2, 8+" #dst " nt"
  258. "psrad $" #shift ", %%mm4 nt"
  259. "packssdw %%mm0, %%mm4 nt" /* A2-B2 a2-b2 A3-B3 a3-b3 */
  260. "movq %%mm4, 16+" #dst " nt"
  261. #define COL_IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  262. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  263. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  264. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  265. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  266. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  267. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  268. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  269. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  270. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  271. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  272. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  273. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  274. #rounder ", %%mm4 nt"
  275. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  276. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  277. #rounder ", %%mm0 nt"
  278. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  279. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  280. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  281. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  282. "paddd %%mm1, %%mm0 nt" /* A1 a1 */
  283. "psubd %%mm1, %%mm5 nt" /* A2 a2 */
  284. "movq 56(%2), %%mm1 nt" /* C7 C5 C7 C5 */
  285. "pmaddwd %%mm3, %%mm1 nt" /* C7R7+C5R5 C7r7+C5r5 */
  286. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  287. "paddd %%mm1, %%mm7 nt" /* B0 b0 */
  288. "movq 72(%2), %%mm1 nt" /* -C5 -C1 -C5 -C1 */
  289. "pmaddwd %%mm3, %%mm1 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  290. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  291. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  292. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  293. "paddd %%mm2, %%mm1 nt" /* B1 b1 */
  294. "psrad $" #shift ", %%mm7 nt"
  295. "psrad $" #shift ", %%mm4 nt"
  296. "movq %%mm0, %%mm2 nt" /* A1 a1 */
  297. "paddd %%mm1, %%mm0 nt" /* A1+B1 a1+b1 */
  298. "psubd %%mm1, %%mm2 nt" /* A1-B1 a1-b1 */
  299. "psrad $" #shift ", %%mm0 nt"
  300. "psrad $" #shift ", %%mm2 nt"
  301. "packssdw %%mm7, %%mm7 nt" /* A0+B0 a0+b0 */
  302. "movd %%mm7, " #dst " nt"
  303. "packssdw %%mm0, %%mm0 nt" /* A1+B1 a1+b1 */
  304. "movd %%mm0, 16+" #dst " nt"
  305. "packssdw %%mm2, %%mm2 nt" /* A1-B1 a1-b1 */
  306. "movd %%mm2, 96+" #dst " nt"
  307. "packssdw %%mm4, %%mm4 nt" /* A0-B0 a0-b0 */
  308. "movd %%mm4, 112+" #dst " nt"
  309. "movq " #src1 ", %%mm0 nt" /* R3 R1 r3 r1 */
  310. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  311. "pmaddwd %%mm0, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  312. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  313. "pmaddwd 96(%2), %%mm0 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  314. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  315. "movq %%mm5, %%mm2 nt" /* A2 a2 */
  316. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  317. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  318. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  319. "psubd %%mm4, %%mm5 nt" /* a2-B2 a2-b2 */
  320. "psrad $" #shift ", %%mm2 nt"
  321. "psrad $" #shift ", %%mm5 nt"
  322. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  323. "paddd %%mm0, %%mm3 nt" /* B3 b3 */
  324. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  325. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  326. "psrad $" #shift ", %%mm6 nt"
  327. "psrad $" #shift ", %%mm4 nt"
  328. "packssdw %%mm2, %%mm2 nt" /* A2+B2 a2+b2 */
  329. "packssdw %%mm6, %%mm6 nt" /* A3+B3 a3+b3 */
  330. "movd %%mm2, 32+" #dst " nt"
  331. "packssdw %%mm4, %%mm4 nt" /* A3-B3 a3-b3 */
  332. "packssdw %%mm5, %%mm5 nt" /* A2-B2 a2-b2 */
  333. "movd %%mm6, 48+" #dst " nt"
  334. "movd %%mm4, 64+" #dst " nt"
  335. "movd %%mm5, 80+" #dst " nt"
  336. #define DC_COND_ROW_IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  337. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  338. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  339. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  340. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  341. "movq "MANGLE(wm1010)", %%mm4 nt"
  342. "pand %%mm0, %%mm4 nt"
  343. "por %%mm1, %%mm4 nt"
  344. "por %%mm2, %%mm4 nt"
  345. "por %%mm3, %%mm4 nt"
  346. "packssdw %%mm4,%%mm4 nt"
  347. "movd %%mm4, %%eax nt"
  348. "orl %%eax, %%eax nt"
  349. "jz 1f nt"
  350. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  351. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  352. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  353. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  354. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  355. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  356. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  357. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  358. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  359. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  360. #rounder ", %%mm4 nt"
  361. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  362. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  363. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  364. "movq 56(%2), %%mm5 nt" /* C7 C5 C7 C5 */
  365. "pmaddwd %%mm3, %%mm5 nt" /* C7R7+C5R5 C7r7+C5r5 */
  366. #rounder ", %%mm0 nt"
  367. "paddd %%mm0, %%mm1 nt" /* A1 a1 */
  368. "paddd %%mm0, %%mm0 nt" 
  369. "psubd %%mm1, %%mm0 nt" /* A2 a2 */
  370. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  371. "paddd %%mm5, %%mm7 nt" /* B0 b0 */
  372. "movq 72(%2), %%mm5 nt" /* -C5 -C1 -C5 -C1 */
  373. "pmaddwd %%mm3, %%mm5 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  374. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  375. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  376. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  377. "paddd %%mm2, %%mm5 nt" /* B1 b1 */
  378. "psrad $" #shift ", %%mm7 nt"
  379. "psrad $" #shift ", %%mm4 nt"
  380. "movq %%mm1, %%mm2 nt" /* A1 a1 */
  381. "paddd %%mm5, %%mm1 nt" /* A1+B1 a1+b1 */
  382. "psubd %%mm5, %%mm2 nt" /* A1-B1 a1-b1 */
  383. "psrad $" #shift ", %%mm1 nt"
  384. "psrad $" #shift ", %%mm2 nt"
  385. "packssdw %%mm1, %%mm7 nt" /* A1+B1 a1+b1 A0+B0 a0+b0 */
  386. "packssdw %%mm4, %%mm2 nt" /* A0-B0 a0-b0 A1-B1 a1-b1 */
  387. "movq %%mm7, " #dst " nt"
  388. "movq " #src1 ", %%mm1 nt" /* R3 R1 r3 r1 */
  389. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  390. "movq %%mm2, 24+" #dst " nt"
  391. "pmaddwd %%mm1, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  392. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  393. "pmaddwd 96(%2), %%mm1 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  394. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  395. "movq %%mm0, %%mm2 nt" /* A2 a2 */
  396. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  397. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  398. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  399. "psubd %%mm4, %%mm0 nt" /* a2-B2 a2-b2 */
  400. "psrad $" #shift ", %%mm2 nt"
  401. "psrad $" #shift ", %%mm0 nt"
  402. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  403. "paddd %%mm1, %%mm3 nt" /* B3 b3 */
  404. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  405. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  406. "psrad $" #shift ", %%mm6 nt"
  407. "packssdw %%mm6, %%mm2 nt" /* A3+B3 a3+b3 A2+B2 a2+b2 */
  408. "movq %%mm2, 8+" #dst " nt"
  409. "psrad $" #shift ", %%mm4 nt"
  410. "packssdw %%mm0, %%mm4 nt" /* A2-B2 a2-b2 A3-B3 a3-b3 */
  411. "movq %%mm4, 16+" #dst " nt"
  412. "jmp 2f nt"
  413. "1: nt"
  414. "pslld $16, %%mm0 nt"
  415. "#paddd "MANGLE(d40000)", %%mm0 nt"
  416. "psrad $13, %%mm0 nt"
  417. "packssdw %%mm0, %%mm0 nt"
  418. "movq %%mm0, " #dst " nt"
  419. "movq %%mm0, 8+" #dst " nt"
  420. "movq %%mm0, 16+" #dst " nt"
  421. "movq %%mm0, 24+" #dst " nt"
  422. "2: nt"
  423. //IDCT(      src0,   src4,   src1,   src5,    dst,    rounder, shift)
  424. ROW_IDCT(    (%0),  8(%0), 16(%0), 24(%0),  0(%1),paddd 8(%2), 11)
  425. /*ROW_IDCT(  32(%0), 40(%0), 48(%0), 56(%0), 32(%1), paddd (%2), 11)
  426. ROW_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1), paddd (%2), 11)
  427. ROW_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1), paddd (%2), 11)*/
  428. DC_COND_ROW_IDCT(  32(%0), 40(%0), 48(%0), 56(%0), 32(%1),paddd (%2), 11)
  429. DC_COND_ROW_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1),paddd (%2), 11)
  430. DC_COND_ROW_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11)
  431. //IDCT(      src0,   src4,   src1,    src5,    dst, rounder, shift)
  432. COL_IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  433. COL_IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  434. COL_IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  435. COL_IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  436. #else
  437. #define DC_COND_IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  438. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  439. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  440. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  441. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  442. "movq "MANGLE(wm1010)", %%mm4 nt"
  443. "pand %%mm0, %%mm4 nt"
  444. "por %%mm1, %%mm4 nt"
  445. "por %%mm2, %%mm4 nt"
  446. "por %%mm3, %%mm4 nt"
  447. "packssdw %%mm4,%%mm4 nt"
  448. "movd %%mm4, %%eax nt"
  449. "orl %%eax, %%eax nt"
  450. "jz 1f nt"
  451. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  452. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  453. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  454. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  455. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  456. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  457. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  458. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  459. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  460. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  461. #rounder ", %%mm4 nt"
  462. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  463. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  464. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  465. "movq 56(%2), %%mm5 nt" /* C7 C5 C7 C5 */
  466. "pmaddwd %%mm3, %%mm5 nt" /* C7R7+C5R5 C7r7+C5r5 */
  467. #rounder ", %%mm0 nt"
  468. "paddd %%mm0, %%mm1 nt" /* A1 a1 */
  469. "paddd %%mm0, %%mm0 nt" 
  470. "psubd %%mm1, %%mm0 nt" /* A2 a2 */
  471. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  472. "paddd %%mm5, %%mm7 nt" /* B0 b0 */
  473. "movq 72(%2), %%mm5 nt" /* -C5 -C1 -C5 -C1 */
  474. "pmaddwd %%mm3, %%mm5 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  475. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  476. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  477. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  478. "paddd %%mm2, %%mm5 nt" /* B1 b1 */
  479. "psrad $" #shift ", %%mm7 nt"
  480. "psrad $" #shift ", %%mm4 nt"
  481. "movq %%mm1, %%mm2 nt" /* A1 a1 */
  482. "paddd %%mm5, %%mm1 nt" /* A1+B1 a1+b1 */
  483. "psubd %%mm5, %%mm2 nt" /* A1-B1 a1-b1 */
  484. "psrad $" #shift ", %%mm1 nt"
  485. "psrad $" #shift ", %%mm2 nt"
  486. "packssdw %%mm1, %%mm7 nt" /* A1+B1 a1+b1 A0+B0 a0+b0 */
  487. "packssdw %%mm4, %%mm2 nt" /* A0-B0 a0-b0 A1-B1 a1-b1 */
  488. "movq %%mm7, " #dst " nt"
  489. "movq " #src1 ", %%mm1 nt" /* R3 R1 r3 r1 */
  490. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  491. "movq %%mm2, 24+" #dst " nt"
  492. "pmaddwd %%mm1, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  493. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  494. "pmaddwd 96(%2), %%mm1 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  495. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  496. "movq %%mm0, %%mm2 nt" /* A2 a2 */
  497. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  498. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  499. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  500. "psubd %%mm4, %%mm0 nt" /* a2-B2 a2-b2 */
  501. "psrad $" #shift ", %%mm2 nt"
  502. "psrad $" #shift ", %%mm0 nt"
  503. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  504. "paddd %%mm1, %%mm3 nt" /* B3 b3 */
  505. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  506. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  507. "psrad $" #shift ", %%mm6 nt"
  508. "packssdw %%mm6, %%mm2 nt" /* A3+B3 a3+b3 A2+B2 a2+b2 */
  509. "movq %%mm2, 8+" #dst " nt"
  510. "psrad $" #shift ", %%mm4 nt"
  511. "packssdw %%mm0, %%mm4 nt" /* A2-B2 a2-b2 A3-B3 a3-b3 */
  512. "movq %%mm4, 16+" #dst " nt"
  513. "jmp 2f nt"
  514. "1: nt"
  515. "pslld $16, %%mm0 nt"
  516. "paddd "MANGLE(d40000)", %%mm0 nt"
  517. "psrad $13, %%mm0 nt"
  518. "packssdw %%mm0, %%mm0 nt"
  519. "movq %%mm0, " #dst " nt"
  520. "movq %%mm0, 8+" #dst " nt"
  521. "movq %%mm0, 16+" #dst " nt"
  522. "movq %%mm0, 24+" #dst " nt"
  523. "2: nt"
  524. #define Z_COND_IDCT(src0, src4, src1, src5, dst, rounder, shift, bt) 
  525. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  526. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  527. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  528. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  529. "movq %%mm0, %%mm4 nt"
  530. "por %%mm1, %%mm4 nt"
  531. "por %%mm2, %%mm4 nt"
  532. "por %%mm3, %%mm4 nt"
  533. "packssdw %%mm4,%%mm4 nt"
  534. "movd %%mm4, %%eax nt"
  535. "orl %%eax, %%eax nt"
  536. "jz " #bt " nt"
  537. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  538. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  539. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  540. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  541. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  542. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  543. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  544. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  545. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  546. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  547. #rounder ", %%mm4 nt"
  548. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  549. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  550. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  551. "movq 56(%2), %%mm5 nt" /* C7 C5 C7 C5 */
  552. "pmaddwd %%mm3, %%mm5 nt" /* C7R7+C5R5 C7r7+C5r5 */
  553. #rounder ", %%mm0 nt"
  554. "paddd %%mm0, %%mm1 nt" /* A1 a1 */
  555. "paddd %%mm0, %%mm0 nt" 
  556. "psubd %%mm1, %%mm0 nt" /* A2 a2 */
  557. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  558. "paddd %%mm5, %%mm7 nt" /* B0 b0 */
  559. "movq 72(%2), %%mm5 nt" /* -C5 -C1 -C5 -C1 */
  560. "pmaddwd %%mm3, %%mm5 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  561. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  562. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  563. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  564. "paddd %%mm2, %%mm5 nt" /* B1 b1 */
  565. "psrad $" #shift ", %%mm7 nt"
  566. "psrad $" #shift ", %%mm4 nt"
  567. "movq %%mm1, %%mm2 nt" /* A1 a1 */
  568. "paddd %%mm5, %%mm1 nt" /* A1+B1 a1+b1 */
  569. "psubd %%mm5, %%mm2 nt" /* A1-B1 a1-b1 */
  570. "psrad $" #shift ", %%mm1 nt"
  571. "psrad $" #shift ", %%mm2 nt"
  572. "packssdw %%mm1, %%mm7 nt" /* A1+B1 a1+b1 A0+B0 a0+b0 */
  573. "packssdw %%mm4, %%mm2 nt" /* A0-B0 a0-b0 A1-B1 a1-b1 */
  574. "movq %%mm7, " #dst " nt"
  575. "movq " #src1 ", %%mm1 nt" /* R3 R1 r3 r1 */
  576. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  577. "movq %%mm2, 24+" #dst " nt"
  578. "pmaddwd %%mm1, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  579. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  580. "pmaddwd 96(%2), %%mm1 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  581. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  582. "movq %%mm0, %%mm2 nt" /* A2 a2 */
  583. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  584. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  585. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  586. "psubd %%mm4, %%mm0 nt" /* a2-B2 a2-b2 */
  587. "psrad $" #shift ", %%mm2 nt"
  588. "psrad $" #shift ", %%mm0 nt"
  589. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  590. "paddd %%mm1, %%mm3 nt" /* B3 b3 */
  591. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  592. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  593. "psrad $" #shift ", %%mm6 nt"
  594. "packssdw %%mm6, %%mm2 nt" /* A3+B3 a3+b3 A2+B2 a2+b2 */
  595. "movq %%mm2, 8+" #dst " nt"
  596. "psrad $" #shift ", %%mm4 nt"
  597. "packssdw %%mm0, %%mm4 nt" /* A2-B2 a2-b2 A3-B3 a3-b3 */
  598. "movq %%mm4, 16+" #dst " nt"
  599. #define ROW_IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  600. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  601. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  602. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  603. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  604. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  605. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  606. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  607. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  608. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  609. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  610. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  611. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  612. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  613. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  614. #rounder ", %%mm4 nt"
  615. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  616. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  617. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  618. "movq 56(%2), %%mm5 nt" /* C7 C5 C7 C5 */
  619. "pmaddwd %%mm3, %%mm5 nt" /* C7R7+C5R5 C7r7+C5r5 */
  620. #rounder ", %%mm0 nt"
  621. "paddd %%mm0, %%mm1 nt" /* A1 a1 */
  622. "paddd %%mm0, %%mm0 nt" 
  623. "psubd %%mm1, %%mm0 nt" /* A2 a2 */
  624. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  625. "paddd %%mm5, %%mm7 nt" /* B0 b0 */
  626. "movq 72(%2), %%mm5 nt" /* -C5 -C1 -C5 -C1 */
  627. "pmaddwd %%mm3, %%mm5 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  628. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  629. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  630. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  631. "paddd %%mm2, %%mm5 nt" /* B1 b1 */
  632. "psrad $" #shift ", %%mm7 nt"
  633. "psrad $" #shift ", %%mm4 nt"
  634. "movq %%mm1, %%mm2 nt" /* A1 a1 */
  635. "paddd %%mm5, %%mm1 nt" /* A1+B1 a1+b1 */
  636. "psubd %%mm5, %%mm2 nt" /* A1-B1 a1-b1 */
  637. "psrad $" #shift ", %%mm1 nt"
  638. "psrad $" #shift ", %%mm2 nt"
  639. "packssdw %%mm1, %%mm7 nt" /* A1+B1 a1+b1 A0+B0 a0+b0 */
  640. "packssdw %%mm4, %%mm2 nt" /* A0-B0 a0-b0 A1-B1 a1-b1 */
  641. "movq %%mm7, " #dst " nt"
  642. "movq " #src1 ", %%mm1 nt" /* R3 R1 r3 r1 */
  643. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  644. "movq %%mm2, 24+" #dst " nt"
  645. "pmaddwd %%mm1, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  646. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  647. "pmaddwd 96(%2), %%mm1 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  648. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  649. "movq %%mm0, %%mm2 nt" /* A2 a2 */
  650. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  651. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  652. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  653. "psubd %%mm4, %%mm0 nt" /* a2-B2 a2-b2 */
  654. "psrad $" #shift ", %%mm2 nt"
  655. "psrad $" #shift ", %%mm0 nt"
  656. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  657. "paddd %%mm1, %%mm3 nt" /* B3 b3 */
  658. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  659. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  660. "psrad $" #shift ", %%mm6 nt"
  661. "packssdw %%mm6, %%mm2 nt" /* A3+B3 a3+b3 A2+B2 a2+b2 */
  662. "movq %%mm2, 8+" #dst " nt"
  663. "psrad $" #shift ", %%mm4 nt"
  664. "packssdw %%mm0, %%mm4 nt" /* A2-B2 a2-b2 A3-B3 a3-b3 */
  665. "movq %%mm4, 16+" #dst " nt"
  666. //IDCT(         src0,   src4,   src1,   src5,    dst,   rounder, shift)
  667. DC_COND_IDCT(  0(%0),  8(%0), 16(%0), 24(%0),  0(%1),paddd 8(%2), 11)
  668. Z_COND_IDCT(  32(%0), 40(%0), 48(%0), 56(%0), 32(%1),paddd (%2), 11, 4f)
  669. Z_COND_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1),paddd (%2), 11, 2f)
  670. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 1f)
  671. #undef IDCT
  672. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  673. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  674. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  675. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  676. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  677. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  678. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  679. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  680. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  681. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  682. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  683. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  684. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  685. #rounder ", %%mm4 nt"
  686. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  687. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  688. #rounder ", %%mm0 nt"
  689. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  690. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  691. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  692. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  693. "paddd %%mm1, %%mm0 nt" /* A1 a1 */
  694. "psubd %%mm1, %%mm5 nt" /* A2 a2 */
  695. "movq 56(%2), %%mm1 nt" /* C7 C5 C7 C5 */
  696. "pmaddwd %%mm3, %%mm1 nt" /* C7R7+C5R5 C7r7+C5r5 */
  697. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  698. "paddd %%mm1, %%mm7 nt" /* B0 b0 */
  699. "movq 72(%2), %%mm1 nt" /* -C5 -C1 -C5 -C1 */
  700. "pmaddwd %%mm3, %%mm1 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  701. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  702. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  703. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  704. "paddd %%mm2, %%mm1 nt" /* B1 b1 */
  705. "psrad $" #shift ", %%mm7 nt"
  706. "psrad $" #shift ", %%mm4 nt"
  707. "movq %%mm0, %%mm2 nt" /* A1 a1 */
  708. "paddd %%mm1, %%mm0 nt" /* A1+B1 a1+b1 */
  709. "psubd %%mm1, %%mm2 nt" /* A1-B1 a1-b1 */
  710. "psrad $" #shift ", %%mm0 nt"
  711. "psrad $" #shift ", %%mm2 nt"
  712. "packssdw %%mm7, %%mm7 nt" /* A0+B0 a0+b0 */
  713. "movd %%mm7, " #dst " nt"
  714. "packssdw %%mm0, %%mm0 nt" /* A1+B1 a1+b1 */
  715. "movd %%mm0, 16+" #dst " nt"
  716. "packssdw %%mm2, %%mm2 nt" /* A1-B1 a1-b1 */
  717. "movd %%mm2, 96+" #dst " nt"
  718. "packssdw %%mm4, %%mm4 nt" /* A0-B0 a0-b0 */
  719. "movd %%mm4, 112+" #dst " nt"
  720. "movq " #src1 ", %%mm0 nt" /* R3 R1 r3 r1 */
  721. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  722. "pmaddwd %%mm0, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  723. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  724. "pmaddwd 96(%2), %%mm0 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  725. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  726. "movq %%mm5, %%mm2 nt" /* A2 a2 */
  727. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  728. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  729. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  730. "psubd %%mm4, %%mm5 nt" /* a2-B2 a2-b2 */
  731. "psrad $" #shift ", %%mm2 nt"
  732. "psrad $" #shift ", %%mm5 nt"
  733. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  734. "paddd %%mm0, %%mm3 nt" /* B3 b3 */
  735. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  736. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  737. "psrad $" #shift ", %%mm6 nt"
  738. "psrad $" #shift ", %%mm4 nt"
  739. "packssdw %%mm2, %%mm2 nt" /* A2+B2 a2+b2 */
  740. "packssdw %%mm6, %%mm6 nt" /* A3+B3 a3+b3 */
  741. "movd %%mm2, 32+" #dst " nt"
  742. "packssdw %%mm4, %%mm4 nt" /* A3-B3 a3-b3 */
  743. "packssdw %%mm5, %%mm5 nt" /* A2-B2 a2-b2 */
  744. "movd %%mm6, 48+" #dst " nt"
  745. "movd %%mm4, 64+" #dst " nt"
  746. "movd %%mm5, 80+" #dst " nt"
  747. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  748. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  749. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  750. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  751. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  752. "jmp 9f nt"
  753. "#.balign 16 nt"
  754. "4: nt"
  755. Z_COND_IDCT(  64(%0), 72(%0), 80(%0), 88(%0), 64(%1),paddd (%2), 11, 6f)
  756. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 5f)
  757. #undef IDCT
  758. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  759. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  760. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  761. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  762. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  763. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  764. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  765. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  766. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  767. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  768. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  769. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  770. #rounder ", %%mm4 nt"
  771. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  772. #rounder ", %%mm0 nt"
  773. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  774. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  775. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  776. "paddd %%mm1, %%mm0 nt" /* A1 a1 */
  777. "psubd %%mm1, %%mm5 nt" /* A2 a2 */
  778. "movq 56(%2), %%mm1 nt" /* C7 C5 C7 C5 */
  779. "pmaddwd %%mm3, %%mm1 nt" /* C7R7+C5R5 C7r7+C5r5 */
  780. "movq 72(%2), %%mm7 nt" /* -C5 -C1 -C5 -C1 */
  781. "pmaddwd %%mm3, %%mm7 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  782. "paddd %%mm4, %%mm1 nt" /* A0+B0 a0+b0 */
  783. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  784. "psubd %%mm1, %%mm4 nt" /* A0-B0 a0-b0 */
  785. "psrad $" #shift ", %%mm1 nt"
  786. "psrad $" #shift ", %%mm4 nt"
  787. "movq %%mm0, %%mm2 nt" /* A1 a1 */
  788. "paddd %%mm7, %%mm0 nt" /* A1+B1 a1+b1 */
  789. "psubd %%mm7, %%mm2 nt" /* A1-B1 a1-b1 */
  790. "psrad $" #shift ", %%mm0 nt"
  791. "psrad $" #shift ", %%mm2 nt"
  792. "packssdw %%mm1, %%mm1 nt" /* A0+B0 a0+b0 */
  793. "movd %%mm1, " #dst " nt"
  794. "packssdw %%mm0, %%mm0 nt" /* A1+B1 a1+b1 */
  795. "movd %%mm0, 16+" #dst " nt"
  796. "packssdw %%mm2, %%mm2 nt" /* A1-B1 a1-b1 */
  797. "movd %%mm2, 96+" #dst " nt"
  798. "packssdw %%mm4, %%mm4 nt" /* A0-B0 a0-b0 */
  799. "movd %%mm4, 112+" #dst " nt"
  800. "movq 88(%2), %%mm1 nt" /* C3 C7 C3  C7 */
  801. "pmaddwd %%mm3, %%mm1 nt" /* C3R7+C7R5 C3r7+C7r5 */
  802. "movq %%mm5, %%mm2 nt" /* A2 a2 */
  803. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  804. "paddd %%mm1, %%mm2 nt" /* A2+B2 a2+b2 */
  805. "psubd %%mm1, %%mm5 nt" /* a2-B2 a2-b2 */
  806. "psrad $" #shift ", %%mm2 nt"
  807. "psrad $" #shift ", %%mm5 nt"
  808. "movq %%mm6, %%mm1 nt" /* A3 a3 */
  809. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  810. "psubd %%mm3, %%mm1 nt" /* a3-B3 a3-b3 */
  811. "psrad $" #shift ", %%mm6 nt"
  812. "psrad $" #shift ", %%mm1 nt"
  813. "packssdw %%mm2, %%mm2 nt" /* A2+B2 a2+b2 */
  814. "packssdw %%mm6, %%mm6 nt" /* A3+B3 a3+b3 */
  815. "movd %%mm2, 32+" #dst " nt"
  816. "packssdw %%mm1, %%mm1 nt" /* A3-B3 a3-b3 */
  817. "packssdw %%mm5, %%mm5 nt" /* A2-B2 a2-b2 */
  818. "movd %%mm6, 48+" #dst " nt"
  819. "movd %%mm1, 64+" #dst " nt"
  820. "movd %%mm5, 80+" #dst " nt"
  821. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  822. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  823. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  824. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  825. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  826. "jmp 9f nt"
  827. "#.balign 16 nt"
  828. "6: nt"
  829. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 7f)
  830. #undef IDCT
  831. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  832. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  833. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  834. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  835. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  836. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  837. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  838. #rounder ", %%mm4 nt"
  839. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  840. #rounder ", %%mm0 nt"
  841. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  842. "movq 56(%2), %%mm1 nt" /* C7 C5 C7 C5 */
  843. "pmaddwd %%mm3, %%mm1 nt" /* C7R7+C5R5 C7r7+C5r5 */
  844. "movq 72(%2), %%mm7 nt" /* -C5 -C1 -C5 -C1 */
  845. "pmaddwd %%mm3, %%mm7 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  846. "paddd %%mm4, %%mm1 nt" /* A0+B0 a0+b0 */
  847. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  848. "psubd %%mm1, %%mm4 nt" /* A0-B0 a0-b0 */
  849. "psrad $" #shift ", %%mm1 nt"
  850. "psrad $" #shift ", %%mm4 nt"
  851. "movq %%mm0, %%mm2 nt" /* A1 a1 */
  852. "paddd %%mm7, %%mm0 nt" /* A1+B1 a1+b1 */
  853. "psubd %%mm7, %%mm2 nt" /* A1-B1 a1-b1 */
  854. "psrad $" #shift ", %%mm0 nt"
  855. "psrad $" #shift ", %%mm2 nt"
  856. "packssdw %%mm1, %%mm1 nt" /* A0+B0 a0+b0 */
  857. "movd %%mm1, " #dst " nt"
  858. "packssdw %%mm0, %%mm0 nt" /* A1+B1 a1+b1 */
  859. "movd %%mm0, 16+" #dst " nt"
  860. "packssdw %%mm2, %%mm2 nt" /* A1-B1 a1-b1 */
  861. "movd %%mm2, 96+" #dst " nt"
  862. "packssdw %%mm4, %%mm4 nt" /* A0-B0 a0-b0 */
  863. "movd %%mm4, 112+" #dst " nt"
  864. "movq 88(%2), %%mm1 nt" /* C3 C7 C3  C7 */
  865. "pmaddwd %%mm3, %%mm1 nt" /* C3R7+C7R5 C3r7+C7r5 */
  866. "movq %%mm5, %%mm2 nt" /* A2 a2 */
  867. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  868. "paddd %%mm1, %%mm2 nt" /* A2+B2 a2+b2 */
  869. "psubd %%mm1, %%mm5 nt" /* a2-B2 a2-b2 */
  870. "psrad $" #shift ", %%mm2 nt"
  871. "psrad $" #shift ", %%mm5 nt"
  872. "movq %%mm6, %%mm1 nt" /* A3 a3 */
  873. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  874. "psubd %%mm3, %%mm1 nt" /* a3-B3 a3-b3 */
  875. "psrad $" #shift ", %%mm6 nt"
  876. "psrad $" #shift ", %%mm1 nt"
  877. "packssdw %%mm2, %%mm2 nt" /* A2+B2 a2+b2 */
  878. "packssdw %%mm6, %%mm6 nt" /* A3+B3 a3+b3 */
  879. "movd %%mm2, 32+" #dst " nt"
  880. "packssdw %%mm1, %%mm1 nt" /* A3-B3 a3-b3 */
  881. "packssdw %%mm5, %%mm5 nt" /* A2-B2 a2-b2 */
  882. "movd %%mm6, 48+" #dst " nt"
  883. "movd %%mm1, 64+" #dst " nt"
  884. "movd %%mm5, 80+" #dst " nt"
  885. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  886. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  887. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  888. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  889. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  890. "jmp 9f nt"
  891. "#.balign 16 nt"
  892. "2: nt"
  893. Z_COND_IDCT(  96(%0),104(%0),112(%0),120(%0), 96(%1),paddd (%2), 11, 3f)
  894. #undef IDCT
  895. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  896. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  897. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  898. "movq " #src5 ", %%mm3 nt" /* R7 R5 r7 r5 */
  899. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  900. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  901. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  902. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  903. #rounder ", %%mm4 nt"
  904. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  905. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  906. #rounder ", %%mm0 nt"
  907. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  908. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  909. "movq 56(%2), %%mm1 nt" /* C7 C5 C7 C5 */
  910. "pmaddwd %%mm3, %%mm1 nt" /* C7R7+C5R5 C7r7+C5r5 */
  911. "pmaddwd 64(%2), %%mm2 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  912. "paddd %%mm1, %%mm7 nt" /* B0 b0 */
  913. "movq 72(%2), %%mm1 nt" /* -C5 -C1 -C5 -C1 */
  914. "pmaddwd %%mm3, %%mm1 nt" /* -C5R7-C1R5 -C5r7-C1r5 */
  915. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  916. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  917. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  918. "paddd %%mm2, %%mm1 nt" /* B1 b1 */
  919. "psrad $" #shift ", %%mm7 nt"
  920. "psrad $" #shift ", %%mm4 nt"
  921. "movq %%mm0, %%mm2 nt" /* A1 a1 */
  922. "paddd %%mm1, %%mm0 nt" /* A1+B1 a1+b1 */
  923. "psubd %%mm1, %%mm2 nt" /* A1-B1 a1-b1 */
  924. "psrad $" #shift ", %%mm0 nt"
  925. "psrad $" #shift ", %%mm2 nt"
  926. "packssdw %%mm7, %%mm7 nt" /* A0+B0 a0+b0 */
  927. "movd %%mm7, " #dst " nt"
  928. "packssdw %%mm0, %%mm0 nt" /* A1+B1 a1+b1 */
  929. "movd %%mm0, 16+" #dst " nt"
  930. "packssdw %%mm2, %%mm2 nt" /* A1-B1 a1-b1 */
  931. "movd %%mm2, 96+" #dst " nt"
  932. "packssdw %%mm4, %%mm4 nt" /* A0-B0 a0-b0 */
  933. "movd %%mm4, 112+" #dst " nt"
  934. "movq " #src1 ", %%mm0 nt" /* R3 R1 r3 r1 */
  935. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  936. "pmaddwd %%mm0, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  937. "movq 88(%2), %%mm7 nt" /* C3 C7 C3  C7 */
  938. "pmaddwd 96(%2), %%mm0 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  939. "pmaddwd %%mm3, %%mm7 nt" /* C3R7+C7R5 C3r7+C7r5 */
  940. "movq %%mm5, %%mm2 nt" /* A2 a2 */
  941. "pmaddwd 104(%2), %%mm3 nt" /* -C1R7+C3R5 -C1r7+C3r5 */
  942. "paddd %%mm7, %%mm4 nt" /* B2 b2 */
  943. "paddd %%mm4, %%mm2 nt" /* A2+B2 a2+b2 */
  944. "psubd %%mm4, %%mm5 nt" /* a2-B2 a2-b2 */
  945. "psrad $" #shift ", %%mm2 nt"
  946. "psrad $" #shift ", %%mm5 nt"
  947. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  948. "paddd %%mm0, %%mm3 nt" /* B3 b3 */
  949. "paddd %%mm3, %%mm6 nt" /* A3+B3 a3+b3 */
  950. "psubd %%mm3, %%mm4 nt" /* a3-B3 a3-b3 */
  951. "psrad $" #shift ", %%mm6 nt"
  952. "psrad $" #shift ", %%mm4 nt"
  953. "packssdw %%mm2, %%mm2 nt" /* A2+B2 a2+b2 */
  954. "packssdw %%mm6, %%mm6 nt" /* A3+B3 a3+b3 */
  955. "movd %%mm2, 32+" #dst " nt"
  956. "packssdw %%mm4, %%mm4 nt" /* A3-B3 a3-b3 */
  957. "packssdw %%mm5, %%mm5 nt" /* A2-B2 a2-b2 */
  958. "movd %%mm6, 48+" #dst " nt"
  959. "movd %%mm4, 64+" #dst " nt"
  960. "movd %%mm5, 80+" #dst " nt"
  961. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  962. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  963. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  964. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  965. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  966. "jmp 9f nt"
  967. "#.balign 16 nt"
  968. "3: nt"
  969. #undef IDCT
  970. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  971. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  972. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  973. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  974. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  975. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  976. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  977. #rounder ", %%mm4 nt"
  978. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  979. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  980. #rounder ", %%mm0 nt"
  981. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  982. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  983. "movq 64(%2), %%mm3 nt"
  984. "pmaddwd %%mm2, %%mm3 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  985. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  986. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  987. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  988. "psrad $" #shift ", %%mm7 nt"
  989. "psrad $" #shift ", %%mm4 nt"
  990. "movq %%mm0, %%mm1 nt" /* A1 a1 */
  991. "paddd %%mm3, %%mm0 nt" /* A1+B1 a1+b1 */
  992. "psubd %%mm3, %%mm1 nt" /* A1-B1 a1-b1 */
  993. "psrad $" #shift ", %%mm0 nt"
  994. "psrad $" #shift ", %%mm1 nt"
  995. "packssdw %%mm7, %%mm7 nt" /* A0+B0 a0+b0 */
  996. "movd %%mm7, " #dst " nt"
  997. "packssdw %%mm0, %%mm0 nt" /* A1+B1 a1+b1 */
  998. "movd %%mm0, 16+" #dst " nt"
  999. "packssdw %%mm1, %%mm1 nt" /* A1-B1 a1-b1 */
  1000. "movd %%mm1, 96+" #dst " nt"
  1001. "packssdw %%mm4, %%mm4 nt" /* A0-B0 a0-b0 */
  1002. "movd %%mm4, 112+" #dst " nt"
  1003. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  1004. "pmaddwd %%mm2, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  1005. "pmaddwd 96(%2), %%mm2 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  1006. "movq %%mm5, %%mm1 nt" /* A2 a2 */
  1007. "paddd %%mm4, %%mm1 nt" /* A2+B2 a2+b2 */
  1008. "psubd %%mm4, %%mm5 nt" /* a2-B2 a2-b2 */
  1009. "psrad $" #shift ", %%mm1 nt"
  1010. "psrad $" #shift ", %%mm5 nt"
  1011. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  1012. "paddd %%mm2, %%mm6 nt" /* A3+B3 a3+b3 */
  1013. "psubd %%mm2, %%mm4 nt" /* a3-B3 a3-b3 */
  1014. "psrad $" #shift ", %%mm6 nt"
  1015. "psrad $" #shift ", %%mm4 nt"
  1016. "packssdw %%mm1, %%mm1 nt" /* A2+B2 a2+b2 */
  1017. "packssdw %%mm6, %%mm6 nt" /* A3+B3 a3+b3 */
  1018. "movd %%mm1, 32+" #dst " nt"
  1019. "packssdw %%mm4, %%mm4 nt" /* A3-B3 a3-b3 */
  1020. "packssdw %%mm5, %%mm5 nt" /* A2-B2 a2-b2 */
  1021. "movd %%mm6, 48+" #dst " nt"
  1022. "movd %%mm4, 64+" #dst " nt"
  1023. "movd %%mm5, 80+" #dst " nt"
  1024. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  1025. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  1026. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  1027. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  1028. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  1029. "jmp 9f nt"
  1030. "#.balign 16 nt"
  1031. "5: nt"
  1032. #undef IDCT
  1033. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  1034. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  1035. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  1036. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  1037. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  1038. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  1039. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  1040. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  1041. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  1042. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  1043. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  1044. #rounder ", %%mm4 nt"
  1045. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  1046. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  1047. #rounder ", %%mm0 nt"
  1048. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  1049. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  1050. "paddd %%mm1, %%mm0 nt" /* A1 a1 */
  1051. "psubd %%mm1, %%mm5 nt" /* A2 a2 */
  1052. "movq 8+" #src0 ", %%mm2 nt" /* R4 R0 r4 r0 */
  1053. "movq 8+" #src4 ", %%mm3 nt" /* R6 R2 r6 r2 */
  1054. "movq 16(%2), %%mm1 nt" /* C4 C4 C4 C4 */
  1055. "pmaddwd %%mm2, %%mm1 nt" /* C4R4+C4R0 C4r4+C4r0 */
  1056. "movq 24(%2), %%mm7 nt" /* -C4 C4 -C4 C4 */
  1057. "pmaddwd %%mm7, %%mm2 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  1058. "movq 32(%2), %%mm7 nt" /* C6 C2 C6 C2 */
  1059. "pmaddwd %%mm3, %%mm7 nt" /* C6R6+C2R2 C6r6+C2r2 */
  1060. "pmaddwd 40(%2), %%mm3 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  1061. #rounder ", %%mm1 nt"
  1062. "paddd %%mm1, %%mm7 nt" /* A0 a0 */
  1063. "paddd %%mm1, %%mm1 nt" /* 2C0 2c0 */
  1064. #rounder ", %%mm2 nt"
  1065. "psubd %%mm7, %%mm1 nt" /* A3 a3 */
  1066. "paddd %%mm2, %%mm3 nt" /* A1 a1 */
  1067. "paddd %%mm2, %%mm2 nt" /* 2C1 2c1 */
  1068. "psubd %%mm3, %%mm2 nt" /* A2 a2 */
  1069. "psrad $" #shift ", %%mm4 nt"
  1070. "psrad $" #shift ", %%mm7 nt"
  1071. "psrad $" #shift ", %%mm3 nt"
  1072. "packssdw %%mm7, %%mm4 nt" /* A0 a0 */
  1073. "movq %%mm4, " #dst " nt"
  1074. "psrad $" #shift ", %%mm0 nt"
  1075. "packssdw %%mm3, %%mm0 nt" /* A1 a1 */
  1076. "movq %%mm0, 16+" #dst " nt"
  1077. "movq %%mm0, 96+" #dst " nt"
  1078. "movq %%mm4, 112+" #dst " nt"
  1079. "psrad $" #shift ", %%mm5 nt"
  1080. "psrad $" #shift ", %%mm6 nt"
  1081. "psrad $" #shift ", %%mm2 nt"
  1082. "packssdw %%mm2, %%mm5 nt" /* A2-B2 a2-b2 */
  1083. "movq %%mm5, 32+" #dst " nt"
  1084. "psrad $" #shift ", %%mm1 nt"
  1085. "packssdw %%mm1, %%mm6 nt" /* A3+B3 a3+b3 */
  1086. "movq %%mm6, 48+" #dst " nt"
  1087. "movq %%mm6, 64+" #dst " nt"
  1088. "movq %%mm5, 80+" #dst " nt"
  1089. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  1090. IDCT(    0(%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  1091. //IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  1092. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  1093. //IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  1094. "jmp 9f nt"
  1095. "#.balign 16 nt"
  1096. "1: nt"
  1097. #undef IDCT
  1098. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  1099. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  1100. "movq " #src4 ", %%mm1 nt" /* R6 R2 r6 r2 */
  1101. "movq " #src1 ", %%mm2 nt" /* R3 R1 r3 r1 */
  1102. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  1103. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  1104. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  1105. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  1106. "movq 32(%2), %%mm5 nt" /* C6 C2 C6 C2 */
  1107. "pmaddwd %%mm1, %%mm5 nt" /* C6R6+C2R2 C6r6+C2r2 */
  1108. "movq 40(%2), %%mm6 nt" /* -C2 C6 -C2 C6 */
  1109. "pmaddwd %%mm6, %%mm1 nt" /* -C2R6+C6R2 -C2r6+C6r2 */
  1110. #rounder ", %%mm4 nt"
  1111. "movq %%mm4, %%mm6 nt" /* C4R4+C4R0 C4r4+C4r0 */
  1112. "movq 48(%2), %%mm7 nt" /* C3 C1 C3 C1 */
  1113. #rounder ", %%mm0 nt"
  1114. "pmaddwd %%mm2, %%mm7 nt" /* C3R3+C1R1 C3r3+C1r1 */
  1115. "paddd %%mm5, %%mm4 nt" /* A0 a0 */
  1116. "psubd %%mm5, %%mm6 nt" /* A3 a3 */
  1117. "movq %%mm0, %%mm5 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  1118. "paddd %%mm1, %%mm0 nt" /* A1 a1 */
  1119. "psubd %%mm1, %%mm5 nt" /* A2 a2 */
  1120. "movq 64(%2), %%mm1 nt"
  1121. "pmaddwd %%mm2, %%mm1 nt" /* -C7R3+C3R1 -C7r3+C3r1 */
  1122. "paddd %%mm4, %%mm7 nt" /* A0+B0 a0+b0 */
  1123. "paddd %%mm4, %%mm4 nt" /* 2A0 2a0 */
  1124. "psubd %%mm7, %%mm4 nt" /* A0-B0 a0-b0 */
  1125. "psrad $" #shift ", %%mm7 nt"
  1126. "psrad $" #shift ", %%mm4 nt"
  1127. "movq %%mm0, %%mm3 nt" /* A1 a1 */
  1128. "paddd %%mm1, %%mm0 nt" /* A1+B1 a1+b1 */
  1129. "psubd %%mm1, %%mm3 nt" /* A1-B1 a1-b1 */
  1130. "psrad $" #shift ", %%mm0 nt"
  1131. "psrad $" #shift ", %%mm3 nt"
  1132. "packssdw %%mm7, %%mm7 nt" /* A0+B0 a0+b0 */
  1133. "movd %%mm7, " #dst " nt"
  1134. "packssdw %%mm0, %%mm0 nt" /* A1+B1 a1+b1 */
  1135. "movd %%mm0, 16+" #dst " nt"
  1136. "packssdw %%mm3, %%mm3 nt" /* A1-B1 a1-b1 */
  1137. "movd %%mm3, 96+" #dst " nt"
  1138. "packssdw %%mm4, %%mm4 nt" /* A0-B0 a0-b0 */
  1139. "movd %%mm4, 112+" #dst " nt"
  1140. "movq 80(%2), %%mm4 nt" /* -C1 C5 -C1  C5 */
  1141. "pmaddwd %%mm2, %%mm4 nt" /* -C1R3+C5R1 -C1r3+C5r1 */
  1142. "pmaddwd 96(%2), %%mm2 nt" /* -C5R3+C7R1 -C5r3+C7r1 */
  1143. "movq %%mm5, %%mm3 nt" /* A2 a2 */
  1144. "paddd %%mm4, %%mm3 nt" /* A2+B2 a2+b2 */
  1145. "psubd %%mm4, %%mm5 nt" /* a2-B2 a2-b2 */
  1146. "psrad $" #shift ", %%mm3 nt"
  1147. "psrad $" #shift ", %%mm5 nt"
  1148. "movq %%mm6, %%mm4 nt" /* A3 a3 */
  1149. "paddd %%mm2, %%mm6 nt" /* A3+B3 a3+b3 */
  1150. "psubd %%mm2, %%mm4 nt" /* a3-B3 a3-b3 */
  1151. "psrad $" #shift ", %%mm6 nt"
  1152. "packssdw %%mm3, %%mm3 nt" /* A2+B2 a2+b2 */
  1153. "movd %%mm3, 32+" #dst " nt"
  1154. "psrad $" #shift ", %%mm4 nt"
  1155. "packssdw %%mm6, %%mm6 nt" /* A3+B3 a3+b3 */
  1156. "movd %%mm6, 48+" #dst " nt"
  1157. "packssdw %%mm4, %%mm4 nt" /* A3-B3 a3-b3 */
  1158. "packssdw %%mm5, %%mm5 nt" /* A2-B2 a2-b2 */
  1159. "movd %%mm4, 64+" #dst " nt"
  1160. "movd %%mm5, 80+" #dst " nt"
  1161. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  1162. IDCT(    (%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  1163. IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  1164. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  1165. IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  1166. "jmp 9f nt"
  1167. "#.balign 16 nt"
  1168. "7: nt"
  1169. #undef IDCT
  1170. #define IDCT(src0, src4, src1, src5, dst, rounder, shift) 
  1171. "movq " #src0 ", %%mm0 nt" /* R4 R0 r4 r0 */
  1172. "movq 16(%2), %%mm4 nt" /* C4 C4 C4 C4 */
  1173. "pmaddwd %%mm0, %%mm4 nt" /* C4R4+C4R0 C4r4+C4r0 */
  1174. "movq 24(%2), %%mm5 nt" /* -C4 C4 -C4 C4 */
  1175. "pmaddwd %%mm5, %%mm0 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  1176. #rounder ", %%mm4 nt"
  1177. #rounder ", %%mm0 nt"
  1178. "psrad $" #shift ", %%mm4 nt"
  1179. "psrad $" #shift ", %%mm0 nt"
  1180. "movq 8+" #src0 ", %%mm2 nt" /* R4 R0 r4 r0 */
  1181. "movq 16(%2), %%mm1 nt" /* C4 C4 C4 C4 */
  1182. "pmaddwd %%mm2, %%mm1 nt" /* C4R4+C4R0 C4r4+C4r0 */
  1183. "movq 24(%2), %%mm7 nt" /* -C4 C4 -C4 C4 */
  1184. "pmaddwd %%mm7, %%mm2 nt" /* -C4R4+C4R0 -C4r4+C4r0 */
  1185. "movq 32(%2), %%mm7 nt" /* C6 C2 C6 C2 */
  1186. #rounder ", %%mm1 nt"
  1187. #rounder ", %%mm2 nt"
  1188. "psrad $" #shift ", %%mm1 nt"
  1189. "packssdw %%mm1, %%mm4 nt" /* A0 a0 */
  1190. "movq %%mm4, " #dst " nt"
  1191. "psrad $" #shift ", %%mm2 nt"
  1192. "packssdw %%mm2, %%mm0 nt" /* A1 a1 */
  1193. "movq %%mm0, 16+" #dst " nt"
  1194. "movq %%mm0, 96+" #dst " nt"
  1195. "movq %%mm4, 112+" #dst " nt"
  1196. "movq %%mm0, 32+" #dst " nt"
  1197. "movq %%mm4, 48+" #dst " nt"
  1198. "movq %%mm4, 64+" #dst " nt"
  1199. "movq %%mm0, 80+" #dst " nt"
  1200. //IDCT(  src0,   src4,   src1,    src5,    dst, rounder, shift)
  1201. IDCT(   0(%1), 64(%1), 32(%1),  96(%1),  0(%0),/nop, 20)
  1202. //IDCT(   8(%1), 72(%1), 40(%1), 104(%1),  4(%0),/nop, 20)
  1203. IDCT(  16(%1), 80(%1), 48(%1), 112(%1),  8(%0),/nop, 20)
  1204. //IDCT(  24(%1), 88(%1), 56(%1), 120(%1), 12(%0),/nop, 20)
  1205. #endif
  1206. /*
  1207. Input
  1208.  00 40 04 44 20 60 24 64
  1209.  10 30 14 34 50 70 54 74
  1210.  01 41 03 43 21 61 23 63
  1211.  11 31 13 33 51 71 53 73
  1212.  02 42 06 46 22 62 26 66
  1213.  12 32 16 36 52 72 56 76
  1214.  05 45 07 47 25 65 27 67
  1215.  15 35 17 37 55 75 57 77
  1216.   
  1217. Temp
  1218.  00 04 10 14 20 24 30 34
  1219.  40 44 50 54 60 64 70 74
  1220.  01 03 11 13 21 23 31 33
  1221.  41 43 51 53 61 63 71 73
  1222.  02 06 12 16 22 26 32 36
  1223.  42 46 52 56 62 66 72 76
  1224.  05 07 15 17 25 27 35 37
  1225.  45 47 55 57 65 67 75 77
  1226. */
  1227. "9: nt"
  1228. :: "r" (block), "r" (temp), "r" (coeffs)
  1229. : "%eax"
  1230. );
  1231. }
  1232. void ff_simple_idct_mmx(int16_t *block)
  1233. {
  1234.     idct(block);
  1235. }
  1236. //FIXME merge add/put into the idct
  1237. void ff_simple_idct_put_mmx(uint8_t *dest, int line_size, DCTELEM *block)
  1238. {
  1239.     idct(block);
  1240.     put_pixels_clamped_mmx(block, dest, line_size);
  1241. }
  1242. void ff_simple_idct_add_mmx(uint8_t *dest, int line_size, DCTELEM *block)
  1243. {
  1244.     idct(block);
  1245.     add_pixels_clamped_mmx(block, dest, line_size);
  1246. }