mffst.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 32k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. /***************************************************************************
  2. *
  3. *                INTEL Corporation Proprietary Information  
  4. *
  5. *      
  6. *                  Copyright (c) 1996 Intel Corporation.
  7. *                         All rights reserved.
  8. *
  9. ***************************************************************************
  10. */
  11. /*
  12.  * jfdctfst.c
  13.  *
  14.  * Copyright (C) 1994-1996, Thomas G. Lane.
  15.  * This file is part of the Independent JPEG Group's software.
  16.  * For conditions of distribution and use, see the accompanying README file.
  17.  *
  18.  * This file contains a fast, not so accurate integer implementation of the
  19.  * forward DCT (Discrete Cosine Transform).
  20.  *
  21.  * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT
  22.  * on each column.  Direct algorithms are also available, but they are
  23.  * much more complex and seem not to be any faster when reduced to code.
  24.  *
  25.  * This implementation is based on Arai, Agui, and Nakajima's algorithm for
  26.  * scaled DCT.  Their original paper (Trans. IEICE E-71(11):1095) is in
  27.  * Japanese, but the algorithm is described in the Pennebaker & Mitchell
  28.  * JPEG textbook (see REFERENCES section in file README).  The following code
  29.  * is based directly on figure 4-8 in P&M.
  30.  * While an 8-point DCT cannot be done in less than 11 multiplies, it is
  31.  * possible to arrange the computation so that many of the multiplies are
  32.  * simple scalings of the final outputs.  These multiplies can then be
  33.  * folded into the multiplications or divisions by the JPEG quantization
  34.  * table entries.  The AA&N method leaves only 5 multiplies and 29 adds
  35.  * to be done in the DCT itself.
  36.  * The primary disadvantage of this method is that with fixed-point math,
  37.  * accuracy is lost due to imprecise representation of the scaled
  38.  * quantization values.  The smaller the quantization table entry, the less
  39.  * precise the scaled value, so this implementation does worse with high-
  40.  * quality-setting files than with low-quality ones.
  41.  */
  42. #define JPEG_INTERNALS
  43. #include "jinclude.h"
  44. #include "jpeglib.h"
  45. #include "jdct.h" /* Private declarations for DCT subsystem */
  46. #ifdef DCT_IFAST_SUPPORTED
  47. /*
  48.  * This module is specialized to the case DCTSIZE = 8.
  49.  */
  50. #if DCTSIZE != 8
  51.   Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */
  52. #endif
  53. /* Scaling decisions are generally the same as in the LL&M algorithm;
  54.  * see jfdctint.c for more details.  However, we choose to descale
  55.  * (right shift) multiplication products as soon as they are formed,
  56.  * rather than carrying additional fractional bits into subsequent additions.
  57.  * This compromises accuracy slightly, but it lets us save a few shifts.
  58.  * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples)
  59.  * everywhere except in the multiplications proper; this saves a good deal
  60.  * of work on 16-bit-int machines.
  61.  *
  62.  * Again to save a few shifts, the intermediate results between pass 1 and
  63.  * pass 2 are not upscaled, but are represented only to integral precision.
  64.  *
  65.  * A final compromise is to represent the multiplicative constants to only
  66.  * 8 fractional bits, rather than 13.  This saves some shifting work on some
  67.  * machines, and may also reduce the cost of multiplication (since there
  68.  * are fewer one-bits in the constants).
  69.  */
  70. #define CONST_BITS  8
  71. /* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
  72.  * causing a lot of useless floating-point operations at run time.
  73.  * To get around this we use the following pre-calculated constants.
  74.  * If you change CONST_BITS you may want to add appropriate values.
  75.  * (With a reasonable C compiler, you can just rely on the FIX() macro...)
  76.  */
  77. #if CONST_BITS == 8
  78. #define FIX_0_382683433  98 /* FIX(0.382683433) */
  79. #define FIX_0_541196100 139 /* FIX(0.541196100) */
  80. #define FIX_0_707106781 181 /* FIX(0.707106781) */
  81. #define FIX_1_306562965 334 /* FIX(1.306562965) */
  82. #else
  83. #define FIX_0_382683433  FIX(0.382683433)
  84. #define FIX_0_541196100  FIX(0.541196100)
  85. #define FIX_0_707106781  FIX(0.707106781)
  86. #define FIX_1_306562965  FIX(1.306562965)
  87. #endif
  88. //The following constant is shifted left 8 for the pmulhw instruction
  89. const __int64 Const_FIX_0_382683433 = 0x6200620062006200;
  90.   //The following constants are shifted left 7 for the pmulhw instruction
  91. const __int64 Const_FIX_0_541196100 = 0x4580458045804580;
  92. const __int64 Const_FIX_0_707106781 = 0x5a805a805a805a80;
  93. //The following constant is shifted left 6 for the pmulhw instruction
  94. const __int64 Const_FIX_1_306562965 = 0x5380538053805380;
  95. /* We can gain a little more speed, with a further compromise in accuracy,
  96.  * by omitting the addition in a descaling shift.  This yields an incorrectly
  97.  * rounded result half the time...
  98.  */
  99. // The assembly version makes this compromise.
  100.  
  101. //#ifndef USE_ACCURATE_ROUNDING
  102. //#undef DESCALE
  103. //#define DESCALE(x,n)  RIGHT_SHIFT(x, n)
  104. //#endif
  105. #define DATASIZE 32
  106. /* Multiply a DCTELEM variable by an INT32 constant, and immediately
  107.  * descale to yield a DCTELEM result.
  108.  */
  109. #define MULTIPLY(var,const)  ((DCTELEM) DESCALE((var) * (const), CONST_BITS))
  110. /*
  111.  * Perform the forward DCT on one block of samples.
  112.  */
  113. GLOBAL(void)
  114. mfdct8x8aan (DCTELEM * data)
  115. {
  116. __asm{
  117. mov edi, [data]
  118. // transpose the bottom right quadrant(4X4) of the matrix
  119. //  ---------       ---------
  120. // | M1 | M2 |     | M1'| M3'|
  121. //  ---------  -->  ---------
  122. // | M3 | M4 |     | M2'| M4'|
  123. //  ---------       ---------
  124. // Get the 32-bit quantities and pack into 16 bits
  125. movq mm5, [edi][DATASIZE*4+16] //| w41 | w40 |
  126. movq mm3, [edi][DATASIZE*4+24] //| w43 | w42 |
  127. movq mm6, [edi][DATASIZE*5+16]
  128. packssdw mm5, mm3 //|w43|w42|w41|w40|
  129. movq mm7, [edi][DATASIZE*5+24]
  130. movq mm4, mm5 // copy w4---0,1,3,5,6
  131. movq mm3, [edi][DATASIZE*6+16]
  132. packssdw mm6, mm7
  133. movq mm2, [edi][DATASIZE*6+24]
  134. punpcklwd mm5, mm6 //mm6 = w5
  135. movq mm1, [edi][DATASIZE*7+16]
  136. packssdw mm3, mm2
  137. movq mm0, [edi][DATASIZE*7+24]
  138. punpckhwd mm4, mm6 //---0,1,3,5,6 
  139. packssdw mm1, mm0
  140. movq mm7, mm3 //---0,1,2,3,5,6 w6
  141. punpcklwd mm3, mm1 //mm1 = w7
  142. movq mm0, mm5 //---0,2,3,4,5,6,7
  143. movq mm2, [edi][DATASIZE*4] //| w01 | w00 |
  144. punpckhdq mm0, mm3 // transposed w5---0,2,4,6,7
  145. punpckhwd mm7, mm1 //---0,2,3,5,6,7
  146. movq mm1, [edi][DATASIZE*5+8]
  147. movq mm6, mm4 //---0,2,3,4,6,7
  148. movq [edi][DATASIZE*5+16], mm0  // store w5
  149. punpckldq mm5, mm3 // transposed w4
  150. movq mm3, [edi][DATASIZE*5]
  151. punpckldq mm4, mm7 // transposed w6
  152. movq mm0, [edi][DATASIZE*4+8]  //| w03 | w02 |
  153. punpckhdq mm6, mm7 // transposed w7---0,3,6,7
  154. // transpose the bottom left quadrant(4X4) of the matrix and place
  155. // in the top right quadrant while doing the same for the top
  156. // right quadrant
  157. //  ---------       ---------
  158. // | M1 | M2 |     | M1'| M3'|
  159. //  ---------  -->  ---------
  160. // | M3 | M4 |     | M2'| M4'|
  161. //  ---------       ---------
  162. movq [edi][DATASIZE*4+16], mm5  // store w4
  163. packssdw mm2, mm0 //|w03|w02|w01|w00|
  164. movq mm5, [edi][DATASIZE*7]
  165. packssdw mm3, mm1
  166. movq mm0, [edi][DATASIZE*7+8]
  167. movq [edi][DATASIZE*7+16], mm6  // store w7---5,6,7
  168. packssdw mm5, mm0
  169. movq mm6, [edi][DATASIZE*6]
  170. movq mm0, mm2 // copy w0---0,1,3,5,6
  171. movq mm7, [edi][DATASIZE*6+8]
  172. punpcklwd mm2, mm3 //mm6 = w1
  173. movq [edi][DATASIZE*6+16], mm4  // store w6---3,5,6,7
  174. packssdw mm6, mm7
  175. movq mm1, [edi][DATASIZE*0+24]
  176. punpckhwd mm0, mm3 //---0,1,3,5,6 
  177. movq mm7, mm6 //---0,1,2,3,5,6 w2
  178. punpcklwd mm6, mm5 //mm1 = w3
  179. movq mm3, [edi][DATASIZE*0+16]
  180. punpckhwd mm7, mm5 //---0,2,3,5,6,7
  181. movq mm4, [edi][DATASIZE*2+24]
  182. packssdw mm3, mm1
  183. movq mm1, mm2 //---0,2,3,4,5,6,7
  184. punpckldq mm2, mm6 // transposed w4
  185. movq mm5, [edi][DATASIZE*2+16]
  186. punpckhdq mm1, mm6 // transposed w5---0,2,4,6,7
  187. movq [edi][DATASIZE*0+16], mm2  // store w4
  188.   packssdw mm5, mm4
  189. movq mm4, [edi][DATASIZE*1+16]
  190. movq mm6, mm0 //---0,2,3,4,6,7
  191. movq mm2, [edi][DATASIZE*1+24]
  192. punpckldq mm0, mm7 // transposed w6
  193. movq [edi][DATASIZE*1+16], mm1  // store w5
  194. punpckhdq mm6, mm7 // transposed w7---0,3,6,7
  195. movq mm7, [edi][DATASIZE*3+24]
  196. packssdw mm4, mm2
  197. movq [edi][DATASIZE*2+16], mm0  // store w6---3,5,6,7
  198. movq mm1, mm3 // copy w4---0,1,3,5,6
  199. movq mm2, [edi][DATASIZE*3+16]
  200. punpcklwd mm3, mm4 //mm6 = w5
  201. movq [edi][DATASIZE*3+16], mm6  // store w7---5,6,7
  202. packssdw mm2, mm7
  203. // transpose the bottom left quadrant(4X4) of the matrix
  204. //  ---------       ---------
  205. // | M1 | M2 |     | M1'| M3'|
  206. //  ---------  -->  ---------
  207. // | M3 | M4 |     | M2'| M4'|
  208. //  ---------       ---------
  209.     movq mm6, [edi][DATASIZE*0] //| w01 | w00 |
  210. punpckhwd mm1, mm4 //---0,1,3,5,6
  211. movq mm7, mm5 //---0,1,2,3,5,6 w6
  212. punpcklwd mm5, mm2 //mm1 = w7
  213. movq mm4, [edi][DATASIZE*0+8] //| w03 | w02 |
  214. punpckhwd mm7, mm2 //---0,2,3,5,6,7
  215. movq mm0, mm3 //---0,2,3,4,5,6,7
  216. packssdw mm6, mm4 //|w03|w02|w01|w00|
  217. movq mm2, [edi][DATASIZE*2+8]
  218. punpckldq mm3, mm5 // transposed w4
  219. movq mm4, [edi][DATASIZE*1]
  220. punpckhdq mm0, mm5 // transposed w5---0,2,4,6,7
  221. movq [edi][DATASIZE*4], mm3  // store w4
  222. movq mm5, mm1 //---0,2,3,4,6,7
  223. movq mm3, [edi][DATASIZE*2]
  224. punpckldq mm1, mm7 // transposed w6
  225. movq [edi][DATASIZE*5], mm0  // store w5
  226. punpckhdq mm5, mm7 // transposed w7---0,3,6,7
  227. movq mm7, [edi][DATASIZE*1+8]
  228. packssdw mm3, mm2
  229. movq [edi][DATASIZE*7], mm5  // store w7---5,6,7
  230. movq mm5, mm6 // copy w0---0,1,3,5,6
  231. movq [edi][DATASIZE*6], mm1  // store w6---3,5,6,7
  232. packssdw mm4, mm7
  233. // transpose the top left quadrant(4X4) of the matrix
  234. //  ---------       ---------
  235. // | M1 | M2 |     | M1'| M3'|
  236. //  ---------  -->  ---------
  237. // | M3 | M4 |     | M2'| M4'|
  238. //  ---------       ---------
  239. // Get the 32-bit quantities and pack into 16 bits
  240. movq mm1, [edi][DATASIZE*3]
  241. punpcklwd mm6, mm4 //mm6 = w1
  242. movq mm0, [edi][DATASIZE*3+8]
  243. punpckhwd mm5, mm4 //---0,1,3,5,6 
  244. packssdw mm1, mm0
  245. movq mm2, mm3 //---0,1,2,3,5,6 w2
  246. punpcklwd mm3, mm1 //mm1 = w3
  247. movq mm0, mm6 //---0,2,3,4,5,6,7
  248. movq mm4, [edi][DATASIZE*7]
  249. punpckhwd mm2, mm1 //---0,2,3,5,6,7
  250. movq mm1, [edi][DATASIZE*4]
  251. punpckldq mm6, mm3 // transposed w4
  252. punpckhdq mm0, mm3 // transposed w5---0,2,4,6,7
  253. movq mm3, mm5 //---0,2,3,4,6,7
  254. movq [edi][DATASIZE*0], mm6  // store w4
  255. punpckldq mm5, mm2 // transposed w6
  256. movq [edi][DATASIZE*1], mm0  // store w5
  257. punpckhdq mm3, mm2 // transposed w7---0,3,6,7
  258. movq [edi][DATASIZE*2], mm5  // store w6---3,5,6,7
  259. paddw mm6, mm4 // tmp0
  260. movq [edi][DATASIZE*3], mm3  // store w7---5,6,7
  261. movq mm7, mm6
  262. //******************************************************************************
  263. // End of transpose.  Begin row dct.
  264. //******************************************************************************
  265. // tmp0 = dataptr[0] + dataptr[7];
  266. // tmp7 = dataptr[0] - dataptr[7];
  267. // tmp1 = dataptr[1] + dataptr[6];
  268. // tmp6 = dataptr[1] - dataptr[6];
  269. // tmp2 = dataptr[2] + dataptr[5];
  270. // tmp5 = dataptr[2] - dataptr[5];
  271. // tmp3 = dataptr[3] + dataptr[4];
  272. // tmp4 = dataptr[3] - dataptr[4];
  273. paddw mm0, [edi][DATASIZE*6] // tmp1
  274. paddw mm3, mm1 // tmp3
  275. paddw mm5, [edi][DATASIZE*5] // tmp2
  276. movq mm1, mm0
  277. //    tmp10 = tmp0 + tmp3;
  278. //    tmp13 = tmp0 - tmp3;
  279. //    tmp11 = tmp1 + tmp2;
  280. //    tmp12 = tmp1 - tmp2;
  281. psubw mm7, mm3 //tmp13
  282. psubw mm0, mm5 //tmp12
  283. paddw mm0, mm7 //tmp12 + tmp13
  284. paddw mm6, mm3 //tmp10
  285. //    dataptr[0] = tmp10 + tmp11; /* phase 3 */
  286. //    dataptr[4] = tmp10 - tmp11;
  287. //    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
  288. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  289. //haven't been calculated yet!
  290. paddw mm1, mm5 //tmp11
  291.   psllw mm0, 1
  292. pmulhw mm0, Const_FIX_0_707106781 // z1
  293. movq mm3, mm6
  294. //    dataptr[2] = tmp13 + z1; /* phase 5 */
  295. //    dataptr[6] = tmp13 - z1;
  296. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  297. //haven't been calculated yet!
  298. movq mm5, [edi][DATASIZE*3]
  299. paddw mm6, mm1 //tmp10 + tmp11
  300. // tmp4 = dataptr[3] - dataptr[4]//
  301. psubw mm5, [edi][DATASIZE*4] //tmp4
  302. movq mm4, mm7
  303. movq mm2, [edi][DATASIZE*2]
  304. psubw mm3, mm1 //tmp10 - tmp11
  305. psubw mm2, [edi][DATASIZE*5] //tmp5
  306. paddw mm7, mm0 //tmp13 + z1
  307. movq mm1, [edi][DATASIZE*1]
  308. psubw mm4, mm0 //tmp13 - z1
  309. //    tmp10 = tmp4 + tmp5; /* phase 2 */
  310. //    tmp11 = tmp5 + tmp6;
  311. //    tmp12 = tmp6 + tmp7;
  312. psubw mm1, [edi][DATASIZE*6] //tmp6
  313. paddw mm5, mm2 //tmp10
  314. movq mm0, [edi][DATASIZE*0]
  315. paddw mm2, mm1 //tmp11
  316. //    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
  317. //    z11 = tmp7 + z3; /* phase 5 */
  318. //    z13 = tmp7 - z3;
  319. psubw mm0, [edi][DATASIZE*7] //tmp7
  320.   psllw mm2, 1
  321. movq [edi][DATASIZE*0], mm6
  322. movq mm6, mm0
  323. movq [edi][DATASIZE*2], mm7
  324. movq mm7, mm5
  325. pmulhw mm2, Const_FIX_0_707106781 //z3
  326. paddw mm1, mm0 //tmp12
  327. movq [edi][DATASIZE*4], mm3
  328. psubw mm5, mm1 //tmp10 - tmp12
  329. pmulhw mm5, Const_FIX_0_382683433 //z5
  330. psllw mm7, 1
  331.     /* The rotator is modified from fig 4-8 to avoid extra negations. */
  332. //    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
  333. //    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
  334. //    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
  335. pmulhw mm7, Const_FIX_0_541196100
  336. psllw mm1, 2
  337. pmulhw mm1, Const_FIX_1_306562965
  338. psubw mm6, mm2 //z13
  339. movq [edi][DATASIZE*6], mm4
  340. paddw mm0, mm2 //z11
  341. movq mm2, [edi][DATASIZE*3+16]
  342. paddw mm7, mm5 //z2
  343. paddw mm2, [edi][DATASIZE*4+16] // tmp3
  344. paddw mm1, mm5 //z4
  345. //    dataptr[5] = z13 + z2; /* phase 6 */
  346. //    dataptr[3] = z13 - z2;
  347. //    dataptr[1] = z11 + z4;
  348. //    dataptr[7] = z11 - z4;
  349. movq mm5, [edi][DATASIZE*0+16]
  350. movq mm3, mm6
  351. paddw mm5, [edi][DATASIZE*7+16] //tmp0
  352. paddw mm6, mm7 //z13 + z2
  353. psubw mm3, mm7 //z13 - z2
  354. movq mm7, mm5
  355. movq [edi][DATASIZE*5], mm6 //store 
  356. movq mm4, mm0
  357. movq [edi][DATASIZE*3], mm3 //store 
  358. paddw mm0, mm1 //z11 + z4
  359. movq mm3, [edi][DATASIZE*1+16]
  360. psubw mm4, mm1 //z11 - z4
  361. //******************************************************************************
  362. // This completes 4x8 dct locations.  Copy to do other 4x8.
  363. //******************************************************************************
  364. // tmp0 = dataptr[0] + dataptr[7];
  365. // tmp7 = dataptr[0] - dataptr[7];
  366. // tmp1 = dataptr[1] + dataptr[6];
  367. // tmp6 = dataptr[1] - dataptr[6];
  368. // tmp2 = dataptr[2] + dataptr[5];
  369. // tmp5 = dataptr[2] - dataptr[5];
  370. // tmp3 = dataptr[3] + dataptr[4];
  371. // tmp4 = dataptr[3] - dataptr[4];
  372. paddw mm3, [edi][DATASIZE*6+16] // tmp1
  373. paddw mm5, mm2 //tmp10
  374. movq mm1, [edi][DATASIZE*2+16]
  375. psubw mm7, mm2 //tmp13
  376. paddw mm1, [edi][DATASIZE*5+16] // tmp2
  377. movq mm6, mm3
  378. //    tmp10 = tmp0 + tmp3;
  379. //    tmp13 = tmp0 - tmp3;
  380. //    tmp11 = tmp1 + tmp2;
  381. //    tmp12 = tmp1 - tmp2;
  382. paddw mm3, mm1 //tmp11
  383. psubw mm6, mm1 //tmp12
  384. //    dataptr[0] = tmp10 + tmp11; /* phase 3 */
  385. //    dataptr[4] = tmp10 - tmp11;
  386. //    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
  387. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  388. //haven't been calculated yet!
  389. movq [edi][DATASIZE*1], mm0 //store 
  390. paddw mm6, mm7 //tmp12 + tmp13
  391. movq [edi][DATASIZE*7], mm4 //store 
  392.   psllw mm6, 1
  393.   pmulhw mm6, Const_FIX_0_707106781 // z1
  394. movq mm1, mm5
  395. //    dataptr[2] = tmp13 + z1; /* phase 5 */
  396. //    dataptr[6] = tmp13 - z1;
  397. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  398. //haven't been calculated yet!
  399. movq mm2, [edi][DATASIZE*3+16]
  400. paddw mm5, mm3 //tmp10 + tmp11
  401. // tmp4 = dataptr[3] - dataptr[4]//
  402. psubw mm2, [edi][DATASIZE*4+16] //tmp4
  403. movq mm4, mm7
  404. movq mm0, [edi][DATASIZE*2+16]
  405. psubw mm1, mm3 //tmp10 - tmp11
  406. psubw mm0, [edi][DATASIZE*5+16] //tmp5
  407. paddw mm7, mm6 //tmp13 + z1
  408. movq mm3, [edi][DATASIZE*1+16]
  409. psubw mm4, mm6 //tmp13 - z1
  410. //    tmp10 = tmp4 + tmp5; /* phase 2 */
  411. //    tmp11 = tmp5 + tmp6;
  412. //    tmp12 = tmp6 + tmp7;
  413. psubw mm3, [edi][DATASIZE*6+16] //tmp6
  414. paddw mm2, mm0 //tmp10
  415. movq mm6, [edi][DATASIZE*0+16]
  416. paddw mm0, mm3 //tmp11
  417. //    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
  418. //    z11 = tmp7 + z3; /* phase 5 */
  419. //    z13 = tmp7 - z3;
  420. psubw mm6, [edi][DATASIZE*7+16] //tmp7
  421.   psllw mm0, 1
  422. movq [edi][DATASIZE*0+16], mm5
  423. movq mm5, mm6
  424. movq [edi][DATASIZE*2+16], mm7
  425. movq mm7, mm2
  426. pmulhw mm0, Const_FIX_0_707106781 //z3
  427. paddw mm3, mm6 //tmp12
  428. movq [edi][DATASIZE*4+16], mm1
  429. psubw mm2, mm3 //tmp10 - tmp12
  430. pmulhw mm2, Const_FIX_0_382683433 //z5
  431. psllw mm7, 1
  432. pmulhw mm7, Const_FIX_0_541196100
  433. paddw mm6, mm0 //z11
  434.     /* The rotator is modified from fig 4-8 to avoid extra negations. */
  435. //    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
  436. //    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
  437. //    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
  438. movq [edi][DATASIZE*6+16], mm4
  439. psllw mm3, 2
  440. pmulhw mm3, Const_FIX_1_306562965
  441. psubw mm5, mm0 //z13
  442. paddw mm7, mm2 //z2
  443. movq mm1, mm5
  444. paddw mm5, mm7 //z13 + z2
  445. psubw mm1, mm7 //z13 - z2
  446. movq mm7, [edi][DATASIZE*4]
  447. paddw mm3, mm2 //z4
  448. //    dataptr[5] = z13 + z2; /* phase 6 */
  449. //    dataptr[3] = z13 - z2;
  450. //    dataptr[1] = z11 + z4;
  451. //    dataptr[7] = z11 - z4;
  452. movq [edi][DATASIZE*5+16], mm5 //store 
  453. movq mm4, mm6
  454. movq mm2, [edi][DATASIZE*7]
  455. paddw mm6, mm3 //z11 + z4
  456. movq mm5, [edi][DATASIZE*5]
  457. psubw mm4, mm3 //z11 - z4
  458. //******************************************************************************
  459. //******************************************************************************
  460. // This completes all 8x8 dct locations for the row case.
  461. // Now transpose the data for the columns.
  462. //******************************************************************************
  463. // transpose the bottom left quadrant(4X4) of the matrix and place
  464. // in the top right quadrant while doing the same for the top
  465. // right quadrant
  466. //  ---------       ---------
  467. // | M1 | M2 |     | M1'| M3'|
  468. //  ---------  -->  ---------
  469. // | M3 | M4 |     | M2'| M4'|
  470. //  ---------       ---------
  471. movq mm0, mm7 // copy w0---0,1,3,5,6
  472. punpcklwd mm7, mm5 //mm6 = w1
  473. movq mm3, [edi][DATASIZE*6]
  474. punpckhwd mm0, mm5 //---0,1,3,5,6 
  475. movq mm5, mm3 //---0,1,2,3,5,6 w2
  476. punpcklwd mm3, mm2 //mm1 = w3
  477. movq [edi][DATASIZE*7+16], mm4 //store
  478. punpckhwd mm5, mm2 //---0,2,3,5,6,7
  479. movq mm4, mm7 //---0,2,3,4,5,6,7
  480. punpckldq mm7, mm3 // transposed w4
  481. movq mm2, [edi][DATASIZE*0+16]
  482. punpckhdq mm4, mm3 // transposed w5---0,2,4,6,7
  483. movq [edi][DATASIZE*0+16], mm7  // store w4
  484. movq mm3, mm0 //---0,2,3,4,6,7
  485. movq [edi][DATASIZE*1+16], mm4  // store w5
  486. punpckldq mm0, mm5 // transposed w6
  487. movq mm7, [edi][DATASIZE*2+16]
  488. punpckhdq mm3, mm5 // transposed w7---0,3,6,7
  489. movq mm5, mm2 // copy w4---0,1,3,5,6
  490. punpcklwd mm2, mm6 //mm6 = w5
  491. // transpose the top right quadrant(4X4) of the matrix
  492. //  ---------       ---------
  493. // | M1 | M2 |     | M1'| M3'|
  494. //  ---------  -->  ---------
  495. // | M3 | M4 |     | M2'| M4'|
  496. //  ---------       ---------
  497. movq [edi][DATASIZE*2+16], mm0  // store w6---3,5,6,7
  498. punpckhwd mm5, mm6 //---0,1,3,5,6 
  499. movq mm4, mm7 //---0,1,2,3,5,6 w6
  500. punpckhwd mm7, mm1 //---0,2,3,5,6,7
  501. movq [edi][DATASIZE*3+16], mm3  // store w7---5,6,7
  502. movq mm0, mm2 //---0,2,3,4,5,6,7
  503. movq mm6, [edi][DATASIZE*5+16]
  504. punpcklwd mm4, mm1 //mm1 = w7
  505. movq mm1, [edi][DATASIZE*4+16]
  506. punpckldq mm0, mm4 // transposed w4
  507. movq mm3, [edi][DATASIZE*6+16]
  508. punpckhdq mm2, mm4 // transposed w5---0,2,4,6,7
  509. // transpose the bottom right quadrant(4X4) of the matrix
  510. //  ---------       ---------
  511. // | M1 | M2 |     | M1'| M3'|
  512. //  ---------  -->  ---------
  513. // | M3 | M4 |     | M2'| M4'|
  514. //  ---------       ---------
  515. movq [edi][DATASIZE*4], mm0  // store w4
  516. movq mm4, mm5 //---0,2,3,4,6,7
  517. movq [edi][DATASIZE*5], mm2  // store w5
  518. punpckldq mm5, mm7 // transposed w6
  519. movq mm2, [edi][DATASIZE*7+16]
  520. punpckhdq mm4, mm7 // transposed w7---0,3,6,7
  521. movq mm7, mm1 // copy w4---0,1,3,5,6
  522. punpcklwd mm1, mm6 //mm6 = w5
  523. movq [edi][DATASIZE*6], mm5  // store w6---3,5,6,7
  524. punpckhwd mm7, mm6 //---0,1,3,5,6 
  525. movq mm5, mm3 //---0,1,2,3,5,6 w6
  526. punpcklwd mm3, mm2 //mm1 = w7
  527. movq [edi][DATASIZE*7], mm4  // store w7---5,6,7
  528. punpckhwd mm5, mm2 //---0,2,3,5,6,7
  529. movq mm0, [edi][DATASIZE*0]
  530. movq mm4, mm1 //---0,2,3,4,5,6,7
  531. movq mm6, [edi][DATASIZE*1]
  532. punpckldq mm1, mm3 // transposed w4
  533. punpckhdq mm4, mm3 // transposed w5---0,2,4,6,7
  534. movq mm3, mm7 //---0,2,3,4,6,7
  535. movq [edi][DATASIZE*4+16], mm1  // store w4
  536. punpckldq mm7, mm5 // transposed w6
  537. movq [edi][DATASIZE*5+16], mm4  // store w5
  538. punpckhdq mm3, mm5 // transposed w7---0,3,6,7
  539. // transpose the top left quadrant(4X4) of the matrix
  540. //  ---------       ---------
  541. // | M1 | M2 |     | M1'| M3'|
  542. //  ---------  -->  ---------
  543. // | M3 | M4 |     | M2'| M4'|
  544. //  ---------       ---------
  545. movq mm1, [edi][DATASIZE*3]
  546. movq mm2, mm0 // copy w0---0,1,3,5,6
  547. movq [edi][DATASIZE*7+16], mm3  // store w7---5,6,7
  548. punpcklwd mm0, mm6 //mm6 = w1
  549. movq mm3, [edi][DATASIZE*2]
  550. punpckhwd mm2, mm6 //---0,1,3,5,6 
  551. movq mm5, mm3 //---0,1,2,3,5,6 w2
  552. punpcklwd mm3, mm1 //mm1 = w3
  553. movq [edi][DATASIZE*6+16], mm7  // store w6---3,5,6,7
  554. punpckhwd mm5, mm1 //---0,2,3,5,6,7
  555. movq mm1, mm0 //---0,2,3,4,5,6,7
  556. punpckldq mm0, mm3 // transposed w4
  557. movq mm6, [edi][DATASIZE*4]
  558. punpckhdq mm1, mm3 // transposed w5---0,2,4,6,7
  559.   movq [edi][DATASIZE*0], mm0  // store w4
  560. movq mm3, mm2 //---0,2,3,4,6,7
  561. paddw mm0, [edi][DATASIZE*7] // tmp0
  562. punpckhdq mm3, mm5 // transposed w7---0,3,6,7
  563. movq [edi][DATASIZE*1], mm1  // store w5
  564. punpckldq mm2, mm5 // transposed w6
  565. //******************************************************************************
  566. // This begins the column dct
  567. //******************************************************************************
  568. // tmp0 = dataptr[0] + dataptr[7];
  569. // tmp7 = dataptr[0] - dataptr[7];
  570. // tmp1 = dataptr[1] + dataptr[6];
  571. // tmp6 = dataptr[1] - dataptr[6];
  572. // tmp2 = dataptr[2] + dataptr[5];
  573. // tmp5 = dataptr[2] - dataptr[5];
  574. // tmp3 = dataptr[3] + dataptr[4];
  575. // tmp4 = dataptr[3] - dataptr[4];
  576. movq [edi][DATASIZE*3], mm3  // store w7---5,6,7
  577. movq mm7, mm0
  578. paddw mm1, [edi][DATASIZE*6] // tmp1
  579. paddw mm3, mm6 // tmp3
  580. movq [edi][DATASIZE*2], mm2  // store w6---3,5,6,7
  581. paddw mm0, mm3 //tmp10
  582. paddw mm2, [edi][DATASIZE*5] // tmp2
  583. movq mm6, mm1
  584. //    tmp10 = tmp0 + tmp3;
  585. //    tmp13 = tmp0 - tmp3;
  586. //    tmp11 = tmp1 + tmp2;
  587. //    tmp12 = tmp1 - tmp2;
  588. psubw mm7, mm3 //tmp13
  589. movq mm3, mm0
  590. movq mm5, [edi][DATASIZE*2]
  591. paddw mm1, mm2 //tmp11
  592. psubw mm3, mm1 //tmp10 - tmp11
  593. paddw mm0, mm1 //tmp10 + tmp11
  594. //    dataptr[0] = tmp10 + tmp11; /* phase 3 */
  595. //    dataptr[4] = tmp10 - tmp11;
  596. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  597. //haven't been calculated yet!
  598. movq mm1, mm3
  599. punpcklwd mm3, mm3
  600. psubw mm6, mm2 //tmp12
  601. punpckhwd mm1, mm1
  602. movq mm2, [edi][DATASIZE*3]
  603. psrad mm3, 16
  604. // tmp4 = dataptr[3] - dataptr[4]//
  605. psubw mm2, [edi][DATASIZE*4] //tmp4
  606. psrad mm1, 16
  607. movq [edi][DATASIZE*4], mm3
  608. movq mm3, mm0
  609. movq [edi][DATASIZE*4+8], mm1
  610. punpcklwd mm0, mm0
  611. paddw mm6, mm7 //tmp12 + tmp13
  612. punpckhwd mm3, mm3
  613. movq mm1, [edi][DATASIZE*1]
  614. psllw mm6, 1
  615.   pmulhw mm6, Const_FIX_0_707106781 // z1
  616.   psrad mm3, 16
  617. psubw mm5, [edi][DATASIZE*5] //tmp5
  618. psrad mm0, 16
  619. //    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
  620. //    dataptr[2] = tmp13 + z1; /* phase 5 */
  621. //    dataptr[6] = tmp13 - z1;
  622. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  623. //haven't been calculated yet!
  624. movq [edi][DATASIZE*0+8], mm3
  625. movq mm4, mm7
  626. movq mm3, [edi][DATASIZE*0]
  627. paddw mm7, mm6 //tmp13 + z1
  628. movq [edi][DATASIZE*0], mm0
  629. psubw mm4, mm6 //tmp13 - z1
  630. movq mm0, mm7
  631. punpcklwd mm7, mm7
  632. psubw mm1, [edi][DATASIZE*6] //tmp6
  633. punpckhwd mm0, mm0
  634. //    tmp10 = tmp4 + tmp5; /* phase 2 */
  635. //    tmp11 = tmp5 + tmp6;
  636. //    tmp12 = tmp6 + tmp7;
  637. psrad mm7, 16
  638. paddw mm2, mm5 //tmp10
  639. psrad mm0, 16
  640. paddw mm5, mm1 //tmp11
  641. movq mm6, mm4
  642. punpcklwd mm4, mm4
  643. movq [edi][DATASIZE*2], mm7
  644. punpckhwd mm6, mm6
  645. psubw mm3, [edi][DATASIZE*7] //tmp7
  646. movq mm7, mm2
  647. //    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
  648. //    z11 = tmp7 + z3; /* phase 5 */
  649. //    z13 = tmp7 - z3;
  650. movq [edi][DATASIZE*2+8], mm0
  651. movq mm0, mm3
  652.   psllw mm5, 1
  653. paddw mm1, mm3 //tmp12
  654. pmulhw mm5, Const_FIX_0_707106781 //z3
  655. psrad mm4, 16
  656. psubw mm2, mm1 //tmp10 - tmp12
  657. psrad mm6, 16
  658.     /* The rotator is modified from fig 4-8 to avoid extra negations. */
  659. //    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
  660. //    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
  661. //    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
  662. pmulhw mm2, Const_FIX_0_382683433 //z5
  663. psllw mm7, 1
  664. pmulhw mm7, Const_FIX_0_541196100
  665. psllw mm1, 2
  666. pmulhw mm1, Const_FIX_1_306562965
  667. psubw mm0, mm5 //z13
  668. movq [edi][DATASIZE*6+8], mm6
  669. movq mm6, mm0
  670. movq [edi][DATASIZE*6], mm4
  671. paddw mm7, mm2 //z2
  672. //    dataptr[5] = z13 + z2; /* phase 6 */
  673. //    dataptr[3] = z13 - z2;
  674. //    dataptr[1] = z11 + z4;
  675. //    dataptr[7] = z11 - z4;
  676. paddw mm0, mm7 //z13 + z2
  677. psubw mm6, mm7 //z13 - z2
  678. movq mm7, mm6
  679. punpcklwd mm6, mm6
  680. punpckhwd mm7, mm7
  681. paddw mm3, mm5 //z11
  682. movq mm5, mm0
  683. punpcklwd mm0, mm0
  684. psrad mm6, 16
  685. movq mm4, mm3
  686. psrad mm7, 16
  687. paddw mm1, mm2 //z4
  688. punpckhwd mm5, mm5
  689. paddw mm3, mm1 //z11 + z4
  690. psrad mm0, 16
  691. psubw mm4, mm1 //z11 - z4
  692. movq [edi][DATASIZE*3], mm6 //store 
  693. psrad mm5, 16
  694. movq mm6, [edi][DATASIZE*1+16]
  695. movq mm1, mm3
  696. paddw mm6, [edi][DATASIZE*6+16] // tmp1
  697. punpcklwd mm3, mm3
  698. movq [edi][DATASIZE*3+8], mm7
  699. punpckhwd mm1, mm1
  700. movq [edi][DATASIZE*5], mm0 //store 
  701. psrad mm3, 16
  702. movq [edi][DATASIZE*5+8], mm5
  703. psrad mm1, 16
  704. movq mm0, [edi][DATASIZE*0+16]
  705. movq mm7, mm4
  706. paddw mm0, [edi][DATASIZE*7+16] //tmp0
  707. punpcklwd mm4, mm4
  708. movq [edi][DATASIZE*1], mm3 //store 
  709. punpckhwd mm7, mm7
  710. movq [edi][DATASIZE*1+8], mm1
  711. psrad mm4, 16
  712. movq mm3, [edi][DATASIZE*3+16]
  713. psrad mm7, 16
  714. //******************************************************************************
  715. // This completes 4x8 dct locations.  Copy to do other 4x8.
  716. //******************************************************************************
  717. // tmp0 = dataptr[0] + dataptr[7];
  718. // tmp7 = dataptr[0] - dataptr[7];
  719. // tmp1 = dataptr[1] + dataptr[6];
  720. // tmp6 = dataptr[1] - dataptr[6];
  721. // tmp2 = dataptr[2] + dataptr[5];
  722. // tmp5 = dataptr[2] - dataptr[5];
  723. // tmp3 = dataptr[3] + dataptr[4];
  724. // tmp4 = dataptr[3] - dataptr[4];
  725. paddw mm3, [edi][DATASIZE*4+16] // tmp3
  726. movq mm1, mm6
  727. movq [edi][DATASIZE*7+8], mm7
  728. movq mm7, mm0
  729. movq mm2, [edi][DATASIZE*2+16]
  730. paddw mm0, mm3 //tmp10
  731. paddw mm2, [edi][DATASIZE*5+16] // tmp2
  732. psubw mm7, mm3 //tmp13
  733. movq mm3, mm0
  734. paddw mm1, mm2 //tmp11
  735. //    tmp10 = tmp0 + tmp3;
  736. //    tmp13 = tmp0 - tmp3;
  737. //    tmp11 = tmp1 + tmp2;
  738. //    tmp12 = tmp1 - tmp2;
  739. paddw mm0, mm1 //tmp10 + tmp11
  740. psubw mm3, mm1 //tmp10 - tmp11
  741. //    dataptr[0] = tmp10 + tmp11; /* phase 3 */
  742. //    dataptr[4] = tmp10 - tmp11;
  743. //    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */
  744. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  745. //haven't been calculated yet!
  746. movq mm1, mm3
  747. punpcklwd mm3, mm3
  748. punpckhwd mm1, mm1
  749. psubw mm6, mm2 //tmp12
  750. movq [edi][DATASIZE*7], mm4 //store 
  751. psrad mm3, 16
  752. psrad mm1, 16
  753. paddw mm6, mm7 //tmp12 + tmp13
  754. movq mm2, [edi][DATASIZE*3+16]
  755.   psllw mm6, 1
  756. movq mm4, mm0
  757. punpcklwd mm0, mm0
  758.   pmulhw mm6, Const_FIX_0_707106781 // z1
  759. punpckhwd mm4, mm4
  760. // tmp4 = dataptr[3] - dataptr[4]//
  761. psubw mm2, [edi][DATASIZE*4+16] //tmp4
  762. psrad mm4, 16
  763. movq mm5, [edi][DATASIZE*2+16]
  764. psrad mm0, 16
  765. movq [edi][DATASIZE*0+24], mm4
  766. movq mm4, mm7
  767. //    dataptr[2] = tmp13 + z1; /* phase 5 */
  768. //    dataptr[6] = tmp13 - z1;
  769. //NOTE: We can't write these values out immediately.  Values for tmp4 - tmp7
  770. //haven't been calculated yet!
  771. psubw mm5, [edi][DATASIZE*5+16] //tmp5
  772. paddw mm7, mm6 //tmp13 + z1
  773. movq [edi][DATASIZE*4+16], mm3
  774. psubw mm4, mm6 //tmp13 - z1
  775. movq mm3, mm7
  776. punpcklwd mm7, mm7
  777. movq mm6, [edi][DATASIZE*0+16]
  778. punpckhwd mm3, mm3
  779. movq [edi][DATASIZE*4+24], mm1
  780. psrad mm7, 16
  781. movq [edi][DATASIZE*0+16], mm0
  782. psrad mm3, 16
  783. movq mm1, [edi][DATASIZE*1+16]
  784. movq mm0, mm4
  785. psubw mm1, [edi][DATASIZE*6+16] //tmp6
  786. punpcklwd mm4, mm4
  787. movq [edi][DATASIZE*2+16], mm7
  788. paddw mm2, mm5 //tmp10
  789. //    tmp10 = tmp4 + tmp5; /* phase 2 */
  790. //    tmp11 = tmp5 + tmp6;
  791. //    tmp12 = tmp6 + tmp7;
  792. movq mm7, mm2
  793. paddw mm5, mm1 //tmp11
  794. psubw mm6, [edi][DATASIZE*7+16] //tmp7
  795.   punpckhwd mm0, mm0
  796. movq [edi][DATASIZE*2+24], mm3
  797. psllw mm5, 1
  798. pmulhw mm5, Const_FIX_0_707106781 //z3
  799. psrad mm0, 16
  800. psrad mm4, 16
  801. paddw mm1, mm6 //tmp12
  802. //    z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */
  803. //    z11 = tmp7 + z3; /* phase 5 */
  804. //    z13 = tmp7 - z3;
  805. movq [edi][DATASIZE*6+24], mm0
  806. psubw mm2, mm1 //tmp10 - tmp12
  807.     /* The rotator is modified from fig 4-8 to avoid extra negations. */
  808. //    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */
  809. //    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */
  810. //    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */
  811. pmulhw mm2, Const_FIX_0_382683433 //z5
  812. psllw mm7, 1
  813. pmulhw mm7, Const_FIX_0_541196100
  814. psllw mm1, 2
  815. movq [edi][DATASIZE*6+16], mm4
  816. movq mm0, mm6
  817. pmulhw mm1, Const_FIX_1_306562965
  818. psubw mm0, mm5 //z13
  819. paddw mm7, mm2 //z2
  820. movq mm3, mm0
  821. //    dataptr[5] = z13 + z2; /* phase 6 */
  822. //    dataptr[3] = z13 - z2;
  823. //    dataptr[1] = z11 + z4;
  824. //    dataptr[7] = z11 - z4;
  825. paddw mm0, mm7 //z13 + z2
  826. psubw mm3, mm7 //z13 - z2
  827. movq mm7, mm3
  828. punpcklwd mm3, mm3
  829. punpckhwd mm7, mm7
  830. paddw mm6, mm5 //z11
  831. psrad mm3, 16
  832. paddw mm1, mm2 //z4
  833. psrad mm7, 16
  834. movq mm4, mm6
  835. movq mm5, mm0
  836. punpcklwd mm0, mm0
  837. punpckhwd mm5, mm5
  838. paddw mm6, mm1 //z11 + z4
  839. psrad mm0, 16
  840. psubw mm4, mm1 //z11 - z4
  841. movq [edi][DATASIZE*3+16], mm3 //store
  842. psrad mm5, 16
  843. movq mm1, mm6
  844. punpcklwd mm6, mm6
  845. movq [edi][DATASIZE*3+24], mm7
  846. punpckhwd mm1, mm1
  847. movq [edi][DATASIZE*5+16], mm0 //store 
  848. psrad mm6, 16
  849. movq [edi][DATASIZE*5+24], mm5
  850. psrad mm1, 16
  851. movq mm7, mm4
  852. punpcklwd mm4, mm4
  853. movq [edi][DATASIZE*1+16], mm6 //store
  854. punpckhwd mm7, mm7
  855. movq [edi][DATASIZE*1+24], mm1
  856. psrad mm4, 16
  857. psrad mm7, 16
  858. movq [edi][DATASIZE*7+16], mm4 //store 
  859. movq [edi][DATASIZE*7+24], mm7
  860. //******************************************************************************
  861. // This completes all 8x8 dct locations for the column case.
  862. //******************************************************************************
  863. emms
  864. }
  865. }
  866. #endif /* DCT_ISLOW_SUPPORTED */