home *** CD-ROM | disk | FTP | other *** search
/ Geek 6 / Geek-006.iso / linux / video / xmovie-1.5.3.tar.gz / xmovie-1.5.3.tar / xmovie-1.5.3 / quicktime / jpeg / jfdctfst_mmx.c < prev    next >
C/C++ Source or Header  |  2000-11-29  |  42KB  |  1,575 lines

  1. #define JPEG_INTERNALS
  2. #include "jinclude.h"
  3. #include "jpeglib.h"
  4. #include "jdct.h"        /* Private declarations for DCT subsystem */
  5.  
  6.  
  7. // took this code from intel, set DCTELEM type to short int, and ... it works
  8.  
  9.  
  10. #define MULT_BITS $0x2
  11.  
  12. int64_t C4 = 0x2D412D412D412D41,  // cos(4*PI/16)*2^14+.5
  13.         C6 = 0x187E187E187E187E,  // cos(6*PI/16)*2^14+.5
  14.      C2mC6 = 0x22A322A322A322A3,  // [cos(6*PI/16)-cos(6*PI/16)]*2^14+.5
  15.      C2pC6 = 0x539F539F539F539F;  // [cos(6*PI/16)+cos(6*PI/16)]*2^14+.5
  16.  
  17.  
  18. /*
  19.  * Perform the forward DCT on one block of samples.
  20.  */
  21. //
  22. GLOBAL(void) jpeg_fdct_ifast_mmx (DCTELEM  * data) {
  23.   int64_t temp6, temp7;
  24.   
  25.   __asm__ __volatile__ ("
  26.  
  27.         // Do fourth quadrant before any DCT
  28.  
  29.         movq 8+2*8*4(%0),%%mm7  # m03:m02|m01:m00 - first line (line 4)
  30.         
  31.         movq 8+2*8*6(%0),%%mm6     # m23:m22|m21:m20 - third line (line 6)
  32.  
  33.         movq %%mm7,%%mm5              # copy first line
  34.  
  35.  
  36.  
  37.         punpcklwd 8+2*8*5(%0),%%mm7                        # m11:m01|m10:m00 - interleave first and second lines
  38.  
  39.         movq %%mm6,%%mm2                  # copy third line
  40.  
  41.  
  42.  
  43.         punpcklwd 8+2*8*7(%0),%%mm6                        # m31:m21|m30:m20 - interleave third and fourth lines
  44.  
  45.         movq %%mm7,%%mm1                  # copy first intermediate result
  46.  
  47.  
  48.  
  49.         movq 8+2*8*5(%0),%%mm3     # m13:m12|m11:m10 - second line
  50.  
  51.         punpckldq %%mm6,%%mm7             # m30:m20|m10:m00 - interleave to produce result 1
  52.  
  53.  
  54.  
  55.         movq 8+2*8*7(%0),%%mm0    # m33:m32|m31:m30 - fourth line
  56.  
  57.         punpckhdq %%mm6,%%mm1             # m31:m21|m11:m01 - interleave to produce result 2
  58.  
  59.  
  60.  
  61.         movq %%mm7,8+2*8*4(%0)      # write result 1
  62.  
  63.         punpckhwd %%mm3,%%mm5             # m13:m03|m12:m02 - interleave first and second lines
  64.  
  65.  
  66.  
  67.         movq %%mm1,8+2*8*5(%0)     # write result 2
  68.  
  69.         punpckhwd %%mm0,%%mm2             # m33:m23|m32:m22 - interleave third and fourth lines
  70.  
  71.  
  72.  
  73.         movq %%mm5,%%mm1                  # copy first intermediate result
  74.  
  75.         punpckldq %%mm2,%%mm5             # m32:m22|m12:m02 - interleave to produce result 3
  76.  
  77.  
  78.  
  79.         movq 8(%0),%%mm0                                 # m03:m02|m01:m00 - first line, 4x4!=
  80.  
  81.         punpckhdq %%mm2,%%mm1                             # m33:m23|m13:m03 - interleave to produce result 4
  82.  
  83.  
  84.  
  85.         movq %%mm5,8+2*8*6(%0)     # write result 3
  86.  
  87.   #***********************Last 4x4 done
  88.  
  89.  
  90.  
  91.  
  92.  
  93. #do_4x4_blocks_x_and_y_not_equal:
  94.  
  95.  
  96.  
  97. # transpose the two mirror image 4x4 sets so that the writes 
  98.  
  99. # can be done without overwriting unused data 
  100.  
  101.  
  102.         movq %%mm1,8+2*8*7(%0)     # write result 4, last 4x4
  103.  
  104.  
  105.  
  106.  
  107.         movq 8+2*8*2(%0),%%mm2     # m23:m22|m21:m20 - third line
  108.  
  109.         movq %%mm0,%%mm6                                                  # copy first line
  110.  
  111.  
  112.  
  113.         punpcklwd 8+2*8*1(%0),%%mm0    # m11:m01|m10:m00 - interleave first and second lines
  114.  
  115.         movq %%mm2,%%mm7                  # copy third line
  116.  
  117.  
  118.  
  119.         punpcklwd 8+2*8*3(%0),%%mm2    # m31:m21|m30:m20 - interleave third and fourth lines
  120.  
  121.         movq %%mm0,%%mm4                  # copy first intermediate result
  122.  
  123. # all references for second 4 x 4 block are referred by \"n\" instead of \"m\"
  124.  
  125.         movq 2*8*4(%0),%%mm1                 # n03:n02|n01:n00 - first line 
  126.  
  127.         punpckldq %%mm2,%%mm0
  128.  
  129.         # m30:m20|m10:m00 - interleave to produce first result
  130.  
  131.  
  132.  
  133.         movq 2*8*6(%0),%%mm3           # n23:n22|n21:n20 - third line
  134.  
  135.         punpckhdq %%mm2,%%mm4             # m31:m21|m11:m01 - interleave to produce second result
  136.  
  137.  
  138.  
  139.         punpckhwd 8+2*8*1(%0),%%mm6 #m13:m03|m12:m02 - interleave first and second lines
  140.  
  141.         movq %%mm1,%%mm2                  # copy first line
  142.  
  143.  
  144.  
  145.         punpckhwd 8+2*8*3(%0),%%mm7     # m33:m23|m32:m22 - interleave third and fourth lines
  146.  
  147.         movq %%mm6,%%mm5                  # copy first intermediate result
  148.  
  149.  
  150.  
  151.         movq %%mm0,2*8*4(%0)                 # write result 1
  152.  
  153.         punpckhdq %%mm7,%%mm5                     # m33:m23|m13:m03 - produce third result
  154.  
  155.  
  156.  
  157.         punpcklwd 2*8*5(%0),%%mm1    # n11:n01|n10:n00 - interleave first and second lines
  158.  
  159.         movq %%mm3,%%mm0                  # copy third line
  160.  
  161.  
  162.  
  163.         punpckhwd 2*8*5(%0),%%mm2  # n13:n03|n12:n02 - interleave first and second lines
  164.  
  165.  
  166.  
  167.         movq %%mm4,2*8*5(%0)           # write result 2 out
  168.  
  169.         punpckldq %%mm7,%%mm6                  # m32:m22|m12:m02 - produce fourth result
  170.  
  171.  
  172.  
  173.         punpcklwd 2*8*7(%0),%%mm3 # n31:n21|n30:n20 - interleave third and fourth lines
  174.  
  175.         movq %%mm1,%%mm4                  # copy first intermediate result
  176.  
  177.  
  178.  
  179.         movq %%mm6,2*8*6(%0)           # write result 3 out
  180.  
  181.         punpckldq %%mm3,%%mm1            # n30:n20|n10:n00 - produce first result
  182.  
  183.  
  184.  
  185.         punpckhwd 2*8*7(%0),%%mm0        # n33:n23|n32:n22 - interleave third and fourth lines
  186.  
  187.         movq %%mm2,%%mm6                  # copy second intermediate result
  188.  
  189.  
  190.  
  191.         movq %%mm5,2*8*7(%0)             # write result 4 out
  192.  
  193.         punpckhdq %%mm3,%%mm4            # n31:n21|n11:n01- produce second result
  194.  
  195.  
  196.  
  197.         movq %%mm1,8+2*8*0(%0)       # write result 5 out - (first result for other 4 x 4 block)
  198.  
  199.         punpckldq %%mm0,%%mm2           # n32:n22|n12:n02- produce third result
  200.  
  201.  
  202.  
  203.         movq %%mm4,8+2*8*1(%0)         # write result 6 out
  204.  
  205.         punpckhdq %%mm0,%%mm6            # n33:n23|n13:n03 - produce fourth result
  206.  
  207.  
  208.  
  209.         movq %%mm2,8+2*8*2(%0)         # write result 7 out
  210.  
  211.  
  212.  
  213.         movq 2*8*0(%0),%%mm0     # m03:m02|m01:m00 - first line, first 4x4
  214.  
  215.  
  216.  
  217.         movq %%mm6,8+2*8*3(%0)           # write result 8 out
  218.  
  219.  
  220.  
  221.  
  222.  
  223. #Do first 4x4 quadrant, which is used in the beginning of the DCT:
  224.  
  225.  
  226.  
  227.         movq 2*8*2(%0),%%mm7     # m23:m22|m21:m20 - third line
  228.  
  229.         movq %%mm0,%%mm2                  # copy first line
  230.  
  231.  
  232.  
  233.         punpcklwd 2*8*1(%0),%%mm0# m11:m01|m10:m00 - interleave first and second lines
  234.  
  235.         movq %%mm7,%%mm4                  # copy third line
  236.  
  237.  
  238.  
  239.         punpcklwd 2*8*3(%0),%%mm7# m31:m21|m30:m20 - interleave third and fourth lines
  240.  
  241.         movq %%mm0,%%mm1                  # copy first intermediate result
  242.  
  243.  
  244.  
  245.         movq 2*8*1(%0),%%mm6     # m13:m12|m11:m10 - second line
  246.  
  247.         punpckldq %%mm7,%%mm0             # m30:m20|m10:m00 - interleave to produce result 1
  248.  
  249.  
  250.  
  251.         movq 2*8*3(%0),%%mm5     # m33:m32|m31:m30 - fourth line
  252.  
  253.         punpckhdq %%mm7,%%mm1             # m31:m21|m11:m01 - interleave to produce result 2
  254.  
  255.  
  256.  
  257.         movq %%mm0,%%mm7                              # write result 1
  258.  
  259.         punpckhwd %%mm6,%%mm2             # m13:m03|m12:m02 - interleave first and second lines
  260.  
  261.  
  262.  
  263.         psubw 2*8*7(%0),%%mm7    #tmp07=x0-x7    # Stage 1 
  264.  
  265.         movq %%mm1,%%mm6                                  # write result 2
  266.  
  267.  
  268.  
  269.         paddw 2*8*7(%0),%%mm0    #tmp00=x0+x7    # Stage 1 
  270.  
  271.         punpckhwd %%mm5,%%mm4             # m33:m23|m32:m22 - interleave third and fourth lines
  272.  
  273.  
  274.  
  275.         paddw 2*8*6(%0),%%mm1    #tmp01=x1+x6    # Stage 1 
  276.  
  277.         movq %%mm2,%%mm3                  # copy first intermediate result
  278.  
  279.  
  280.  
  281.         psubw 2*8*6(%0),%%mm6    #tmp06=x1-x6    # Stage 1 
  282.  
  283.         punpckldq %%mm4,%%mm2             # m32:m22|m12:m02 - interleave to produce result 3
  284.  
  285.  
  286.  
  287.  
  288.  
  289.         movq %%mm7,%2                         #save tmp07             # Stage 1 
  290.  
  291.         movq %%mm2,%%mm5                                  # write result 3
  292.  
  293.  
  294.  
  295.         movq %%mm6,%1                         #save tmp06             # Stage 1 
  296.  
  297.         punpckhdq %%mm4,%%mm3                             # m33:m23|m13:m03 - interleave to produce result 4
  298.  
  299.  
  300.  
  301.  
  302.  
  303.         paddw 2*8*5(%0),%%mm2    #tmp02=x2+x5    # Stage 1 
  304.  
  305.         movq %%mm3,%%mm4                                  # write result 4
  306.  
  307.  
  308.  
  309. #  Pass 1: process rows. 
  310. #  Stage 1, above
  311. #  dataptr = data#
  312. #  for (ctr = 8-1# ctr >= 0# ctr--) {
  313. #    tmp0 = dataptr[8*0] + dataptr[8*7]#
  314. #    tmp7 = dataptr[8*0] - dataptr[8*7]#
  315. #    tmp1 = dataptr[8*1] + dataptr[8*6]#
  316. #    tmp6 = dataptr[8*1] - dataptr[8*6]#
  317. #    tmp2 = dataptr[8*2] + dataptr[8*5]#
  318. #    tmp5 = dataptr[8*2] - dataptr[8*5]#
  319. #    tmp3 = dataptr[8*3] + dataptr[8*4]#
  320. #    tmp4 = dataptr[8*3] - dataptr[8*4]#
  321.  
  322. # Stage 2, Even part
  323. #    tmp10 = tmp0 + tmp3#        
  324. #    tmp13 = tmp0 - tmp3#
  325. #    tmp11 = tmp1 + tmp2#
  326. #    tmp12 = tmp1 - tmp2#
  327.  
  328.  
  329.         paddw 2*8*4(%0),%%mm3    #tmp03=x3+x4     Stage 1 
  330.  
  331.         movq %%mm0,%%mm7                          #copy tmp00                                     # Even 2 
  332.  
  333.  
  334.  
  335.         psubw 2*8*4(%0),%%mm4    #tmp04=x3-x4    # Stage 1 
  336.  
  337.         movq %%mm1,%%mm6                          #copy tmp01                                     # Even 2 
  338.  
  339.  
  340.  
  341.         paddw %%mm3,%%mm0                         #tmp10 = tmp00 + tmp03#         # Even 2 
  342.  
  343.         psubw %%mm3,%%mm7                         #tmp13 = tmp00 - tmp03#         # Even 2 
  344.  
  345.  
  346.  
  347.     psubw %%mm2,%%mm6                             #tmp12 = tmp01 - tmp02#         # Even 2 
  348.  
  349.     paddw %%mm2,%%mm1                             #tmp11 = tmp01 + tmp02#         # Even 2      
  350.  
  351.  
  352.  
  353.         psubw 2*8*5(%0),%%mm5    #tmp05=x2-x5    # Stage 1 
  354.  
  355.         paddw %%mm7,%%mm6                         #tmp12+tmp13                    # Even 4 
  356.  
  357.  
  358.  
  359.  
  360.  
  361. # Stage 3, Even                and                                             Stage 4 & 5, Even
  362. #    dataptr[8*0] =y0= tmp10 + tmp11#      z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781)#  c4 
  363. #    dataptr[8*4] =y4= tmp10 - tmp11#      dataptr[8*2] = tmp13 + z1#
  364.  
  365.  
  366.         movq %1,%%mm2                         #load tmp6                                      # Odd 2 
  367.  
  368.         movq %%mm0,%%mm3                          #copy tmp10                     # Even 3 
  369.  
  370.         psllw $0x2,%%mm6  # shift z1 by 2 bits  
  371.  
  372.         paddw %%mm1,%%mm0                         #y0=tmp10 + tmp11       # Even 3 
  373.  
  374.  
  375.  
  376.     pmulhw C4,%%mm6                      #z1 = (tmp12+tmp13)*c4  # Even 4 
  377.  
  378.         psubw %%mm1,%%mm3                         #y4=tmp10 - tmp11       # Even 3 
  379.  
  380.  
  381.  
  382.     movq %%mm0,2*8*0(%0) #save y0                        # Even 3 
  383.  
  384.         movq %%mm7,%%mm0                          #copy tmp13                             # Even 4 
  385.  
  386.  
  387.  
  388. # Odd part 
  389. # Stage 2 
  390.  
  391. # mm4=tmp4, mm5=tmp5, load mm2=tmp6, load mm3=tmp7
  392. #    tmp10 = tmp4 + tmp5#
  393. #    tmp11 = tmp5 + tmp6#
  394. #    tmp12 = tmp6 + tmp7#
  395.  
  396.  
  397.     movq %%mm3,2*8*4(%0) #save y4                        # Even 3 
  398.  
  399.         paddw %%mm5,%%mm4                         #tmp10 = tmp4 + tmp5#           # Odd 2 
  400.  
  401.  
  402.  
  403.         movq %2,%%mm3                         #load tmp7                                      # Odd 2 
  404.  
  405.         paddw %%mm6,%%mm0                         #tmp32 = tmp13 + z1             # Even 5 
  406.  
  407.  
  408.  
  409.         paddw %%mm2,%%mm5                         #tmp11 = tmp5 + tmp6#           # Odd 2 
  410.  
  411.         psubw %%mm6,%%mm7                         #tmp33 = tmp13 - z1             # Even 5 
  412.  
  413.  
  414.  
  415.         movq %%mm0,2*8*2(%0)     #save tmp32=y2          # Even 5 
  416.  
  417.         paddw %%mm3,%%mm2                         #tmp12 = tmp6 + tmp7#           # Odd 2 
  418.  
  419.  
  420.  
  421. #      Stage 4 
  422. #The rotator is modified from fig 4-8 to avoid extra negations. 
  423. #    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433)# c6 
  424. #    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5#  c2-c6 
  425. #    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5#  c2+c6 
  426. #    z3 = MULTIPLY(tmp11, FIX_0_707106781)# c4 
  427.  
  428.         movq %%mm7,2*8*6(%0)     #save tmp32=y6          # Even 5 
  429.  
  430.         movq %%mm4,%%mm1                                  #copy of tmp10                          # Odd 4 
  431.  
  432.  
  433.         psubw %%mm2,%%mm1                                 #tmp10-tmp12                            # Odd 4 
  434.  
  435.         psllw $0x2,%%mm4
  436.  
  437.  
  438.  
  439.         movq C2mC6,%%mm0                                 #load C2mC6                                     # Odd 4 
  440.  
  441.         psllw $0x2, %%mm1
  442.  
  443.  
  444.  
  445.     pmulhw C6,%%mm1                                      #z5=(tmp10-tmp12)*c6            # Odd 4 
  446.  
  447.     psllw $0x2, %%mm2
  448.  
  449.  
  450.  
  451.     pmulhw %%mm0,%%mm4                                    #tmp10*(c2-c6)                          # Odd 4 
  452.  
  453.  
  454.  
  455. # Stage 5 
  456. #    z11 = tmp7 + z3#            
  457. #    z13 = tmp7 - z3#
  458.  
  459.  
  460.     pmulhw C2pC6,%%mm2                                   #tmp12*(c2+c6)                          # Odd 4 
  461.  
  462.     psllw $0x2, %%mm5
  463.  
  464.  
  465.  
  466.     pmulhw C4,%%mm5                                      #z3=tmp11*c4                            # Odd 4 
  467.  
  468.         movq %%mm3,%%mm0                                  #copy tmp7                              # Stage 5 
  469.  
  470.  
  471.  
  472.         movq 8+2*8*0(%0),%%mm7     #load x0                # Stage 1, next set of 4 
  473.  
  474.         paddw %%mm1,%%mm4                                 #z2=tmp10*(c2-c6)+z5            # Odd 4 
  475.  
  476.  
  477.  
  478.         paddw %%mm1,%%mm2                                 #z4=tmp12*(c2+c6)+z5            # Odd 4 
  479.  
  480.  
  481.  
  482.         paddw %%mm5,%%mm0                                 #z11 = tmp7 + z3#               # Stage 5 
  483.  
  484.         psubw %%mm5,%%mm3                                 #z13 = tmp7 - z3#               # Stage 5 
  485.  
  486.  
  487.  
  488. # Stage 6 
  489. #    dataptr[8*5] = z13 + z2# 
  490. #    dataptr[8*3] = z13 - z2#
  491. #    dataptr[8*1] = z11 + z4#
  492. #    dataptr[8*7] = z11 - z4#
  493.  
  494.         movq %%mm3,%%mm5                                  #copy z13                               # Stage 6 
  495.  
  496.         psubw %%mm4,%%mm3                                 #y3=z13 - z2                    # Stage 6 
  497.  
  498.  
  499.  
  500.         paddw %%mm4,%%mm5                                 #y5=z13 + z2                    # Stage 6 
  501.  
  502.         movq %%mm0,%%mm6                                  #copy z11                               # Stage 6 
  503.  
  504.  
  505.  
  506.         movq %%mm3,2*8*3(%0)             #save y3                                # Stage 6 
  507.  
  508.         psubw %%mm2,%%mm0                                 #y7=z11 - z4                    # Stage 6 
  509.  
  510.  
  511.  
  512.         movq %%mm5,2*8*5(%0)             #save y5                                # Stage 6 
  513.  
  514.         paddw %%mm2,%%mm6                                 #y1=z11 + z4                    # Stage 6 
  515.  
  516.  
  517.  
  518.         movq %%mm0,2*8*7(%0)             #save y7                                # Stage 6 
  519.  
  520.  
  521.  
  522. # Pass 2: process rows.
  523.  
  524. # dataptr = data#
  525. #  for (ctr = 8-1# ctr >= 0# ctr--) {
  526. #    tmp0 = dataptr[8*0] + dataptr[8*7]#
  527. #    tmp7 = dataptr[8*0] - dataptr[8*7]#
  528. #    tmp1 = dataptr[8*1] + dataptr[8*6]#
  529. #    tmp6 = dataptr[8*1] - dataptr[8*6]#
  530. #    tmp2 = dataptr[8*2] + dataptr[8*5]#
  531. #    tmp5 = dataptr[8*2] - dataptr[8*5]#
  532. #    tmp3 = dataptr[8*3] + dataptr[8*4]#
  533. #    tmp4 = dataptr[8*3] - dataptr[8*4]#
  534.  
  535. #Stage 1,even
  536.  
  537.  
  538.  
  539.         movq 8+2*8*1(%0),%%mm1     #load x1                # Stage 1 
  540.  
  541.         movq %%mm7,%%mm0                          #copy x0                                # Stage 1 
  542.  
  543.  
  544.  
  545.         movq %%mm6,2*8*1(%0)             #save y1                                # Stage 6 
  546.  
  547.  
  548.  
  549.         movq 8+2*8*2(%0),%%mm2     #load x2                # Stage 1 
  550.  
  551.         movq %%mm1,%%mm6                          #copy x1                                # Stage 1 
  552.  
  553.  
  554.  
  555.         paddw 8+2*8*7(%0),%%mm0    #tmp00=x0+x7    # Stage 1 
  556.  
  557.  
  558.  
  559.         movq 8+2*8*3(%0),%%mm3     #load x3                # Stage 1 
  560.  
  561.         movq %%mm2,%%mm5                          #copy x2                                # Stage 1 
  562.  
  563.  
  564.  
  565.  
  566.  
  567.         psubw 8+2*8*7(%0),%%mm7    #tmp07=x0-x7    # Stage 1 
  568.  
  569.         movq %%mm3,%%mm4                          #copy x3                                # Stage 1 
  570.  
  571.  
  572.  
  573.         paddw 8+2*8*6(%0),%%mm1    #tmp01=x1+x6    # Stage 1 
  574.  
  575.  
  576.  
  577.         movq %%mm7,%2                         #save tmp07                             # Stage 1 
  578.  
  579.         movq %%mm0,%%mm7                          #copy tmp00                                     # Even 2 
  580.  
  581.  
  582.  
  583.         psubw 8+2*8*6(%0),%%mm6    #tmp06=x1-x6    # Stage 1 
  584.  
  585.  
  586.  
  587. # Stage 2, Even part
  588. #    tmp10 = tmp0 + tmp3#        
  589. #    tmp13 = tmp0 - tmp3#
  590. #    tmp11 = tmp1 + tmp2#
  591. #    tmp12 = tmp1 - tmp2#
  592.  
  593.         paddw 8+2*8*4(%0),%%mm3    #tmp03=x3+x4    # Stage 1 
  594.  
  595.  
  596.  
  597.         movq %%mm6,%1                         #save tmp06             # Stage 1 
  598.  
  599.         movq %%mm1,%%mm6                          #copy tmp01                                     # Even 2 
  600.  
  601.  
  602.  
  603.  
  604.  
  605.         paddw 8+2*8*5(%0),%%mm2    #tmp02=x2+x5    # Stage 1 
  606.  
  607.         paddw %%mm3,%%mm0                         #tmp10 = tmp00 + tmp03#         # Even 2 
  608.  
  609.  
  610.  
  611.         psubw %%mm3,%%mm7                         #tmp13 = tmp00 - tmp03#         # Even 2 
  612.  
  613.  
  614.  
  615.         psubw 8+2*8*4(%0),%%mm4    #tmp04=x3-x4    # Stage 1 
  616.  
  617.     psubw %%mm2,%%mm6                             #tmp12 = tmp01 - tmp02#         # Even 2 
  618.  
  619.  
  620.  
  621.     paddw %%mm2,%%mm1                             #tmp11 = tmp01 + tmp02#         # Even 2      
  622.  
  623.  
  624.  
  625.         psubw 8+2*8*5(%0),%%mm5    #tmp05=x2-x5    # Stage 1 
  626.  
  627.         paddw %%mm7,%%mm6                         #tmp12+tmp13                    # Even 4 
  628.  
  629.  
  630.  
  631.  
  632.  
  633. # Stage 3, Even                and                                             Stage 4 & 5, Even
  634. #    dataptr[8*0] =y0= tmp10 + tmp11#      z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781)#  c4 
  635. #    dataptr[8*4] =y4= tmp10 - tmp11#      dataptr[8*2] = tmp13 + z1#
  636.  
  637.  
  638.         movq %1,%%mm2                         #load tmp6                                      # Odd 2 
  639.  
  640.         movq %%mm0,%%mm3                          #copy tmp10                     # Even 3 
  641.  
  642.  
  643.  
  644.         psllw $0x2, %%mm6
  645.  
  646.         paddw %%mm1,%%mm0                         #y0=tmp10 + tmp11       # Even 3 
  647.  
  648.  
  649.  
  650.     pmulhw C4,%%mm6                      #z1 = (tmp12+tmp13)*c4  # Even 4 
  651.  
  652.         psubw %%mm1,%%mm3                         #y4=tmp10 - tmp11       # Even 3 
  653.  
  654.  
  655.  
  656.     movq %%mm0,8+2*8*0(%0) #save y0                        # Even 3 
  657.  
  658.         movq %%mm7,%%mm0                          #copy tmp13                             # Even 4 
  659.  
  660.  
  661.  
  662. # Odd part 
  663. # Stage 2 
  664. #mm4=tmp4, mm5=tmp5, load mm2=tmp6, load mm3=tmp7
  665. #    tmp10 = tmp4 + tmp5#
  666. #    tmp11 = tmp5 + tmp6#
  667. #    tmp12 = tmp6 + tmp7#
  668.  
  669.     movq %%mm3,8+2*8*4(%0) #save y4                        # Even 3 
  670.  
  671.         paddw %%mm5,%%mm4                         #tmp10 = tmp4 + tmp5#           # Odd 2 
  672.  
  673.  
  674.  
  675.         movq %2,%%mm3                         #load tmp7                                      # Odd 2 
  676.  
  677.         paddw %%mm6,%%mm0                         #tmp32 = tmp13 + z1             # Even 5 
  678.  
  679.  
  680.  
  681.         paddw %%mm2,%%mm5                         #tmp11 = tmp5 + tmp6#           # Odd 2 
  682.  
  683.         psubw %%mm6,%%mm7                         #tmp33 = tmp13 - z1             # Even 5 
  684.  
  685.  
  686.  
  687.         movq %%mm0,8+2*8*2(%0)     #save tmp32=y2          # Even 5 
  688.  
  689.         paddw %%mm3,%%mm2                         #tmp12 = tmp6 + tmp7#           # Odd 2 
  690.  
  691.  
  692.  
  693. #      Stage 4 
  694. #The rotator is modified from fig 4-8 to avoid extra negations. 
  695. #    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433)#  c6 
  696. #    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5#  c2-c6 
  697. #    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5#  c2+c6 
  698. #    z3 = MULTIPLY(tmp11, FIX_0_707106781)#  c4 
  699.  
  700.         movq %%mm7,8+2*8*6(%0)     #save tmp32=y6          # Even 5 
  701.  
  702.         movq %%mm4,%%mm1                                  #copy of tmp10                          # Odd 4 
  703.  
  704.  
  705.  
  706.         psubw %%mm2,%%mm1                                 #tmp10-tmp12                            # Odd 4 
  707.  
  708.     psllw $0x2, %%mm4
  709.  
  710.  
  711.  
  712.         movq C2mC6,%%mm0                                 #load C2mC6                                     # Odd 4 
  713.  
  714.     psllw $0x2, %%mm1
  715.  
  716.  
  717.  
  718.     pmulhw C6,%%mm1                                      #z5=(tmp10-tmp12)*c6            # Odd 4 
  719.  
  720.     psllw $0x2, %%mm5
  721.  
  722.  
  723.  
  724.     pmulhw %%mm0,%%mm4                                    #tmp10*(c2-c6)                          # Odd 4 
  725.  
  726.  
  727.  
  728. # Stage 5 
  729. #    z11 = tmp7 + z3#            
  730. #    z13 = tmp7 - z3#
  731.  
  732.  
  733.     pmulhw C4,%%mm5                                      #z3=tmp11*c4                            # Odd 4 
  734.  
  735.     psllw $0x2, %%mm2
  736.  
  737.  
  738.  
  739.     pmulhw C2pC6,%%mm2                                   #tmp12*(c2+c6)                          # Odd 4 
  740.  
  741.         movq %%mm3,%%mm0                                  #copy tmp7                              # Stage 5 
  742.  
  743.  
  744.  
  745.         movq 8+2*8*4(%0),%%mm7     # m03:m02|m01:m00 - first line (line 4)
  746.  
  747.         paddw %%mm1,%%mm4                                 #z2=tmp10*(c2-c6)+z5            # Odd 4 
  748.  
  749.  
  750.  
  751.         paddw %%mm5,%%mm0                                 #z11 = tmp7 + z3#               # Stage 5 
  752.  
  753.         psubw %%mm5,%%mm3                                 #z13 = tmp7 - z3#               # Stage 5 
  754.  
  755.  
  756.  
  757. # Stage 6 
  758. #    dataptr[8*5] = z13 + z2# 
  759. #    dataptr[8*3] = z13 - z2#
  760. #    dataptr[8*1] = z11 + z4#
  761. #    dataptr[8*7] = z11 - z4#
  762.  
  763.  
  764.         movq %%mm3,%%mm5                                  #copy z13                               # Stage 6 
  765.  
  766.         paddw %%mm1,%%mm2                                 #z4=tmp12*(c2+c6)+z5            # Odd 4 
  767.  
  768.  
  769.  
  770.         movq %%mm0,%%mm6                                  #copy z11                               # Stage 6 
  771.  
  772.         psubw %%mm4,%%mm5                                 #y3=z13 - z2                    # Stage 6 
  773.  
  774.  
  775.  
  776.         paddw %%mm2,%%mm6                                 #y1=z11 + z4                    # Stage 6 
  777.  
  778.         paddw %%mm4,%%mm3                                 #y5=z13 + z2                    # Stage 6 
  779.  
  780.  
  781.  
  782.         movq %%mm5,8+2*8*3(%0)             #save y3                                # Stage 6 
  783.  
  784.  
  785.  
  786.         movq %%mm6,8+2*8*1(%0)             #save y1                                # Stage 6 
  787.  
  788.         psubw %%mm2,%%mm0                                 #y7=z11 - z4                    # Stage 6 
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797. #Do fourth quadrant after DCT
  798.  
  799.         movq 8+2*8*6(%0),%%mm6     # m23:m22|m21:m20 - third line (line 6)
  800.  
  801.         movq %%mm7,%%mm5                  # copy first line
  802.  
  803.  
  804.  
  805.         punpcklwd %%mm3,%%mm7                             # m11:m01|m10:m00 - interleave first and second lines
  806.  
  807.         movq %%mm6,%%mm2                  # copy third line
  808.  
  809.  
  810.  
  811.         punpcklwd %%mm0,%%mm6                             # m31:m21|m30:m20 - interleave third and fourth lines
  812.  
  813.         movq %%mm7,%%mm1                  # copy first intermediate result
  814.  
  815.  
  816.  
  817.         punpckldq %%mm6,%%mm7             # m30:m20|m10:m00 - interleave to produce result 1
  818.  
  819.  
  820.  
  821.         punpckhdq %%mm6,%%mm1             # m31:m21|m11:m01 - interleave to produce result 2
  822.  
  823.  
  824.  
  825.         movq %%mm7,8+2*8*4(%0)      # write result 1
  826.  
  827.         punpckhwd %%mm3,%%mm5             # m13:m03|m12:m02 - interleave first and second lines
  828.  
  829.  
  830.  
  831.         movq %%mm1,8+2*8*5(%0)     # write result 2
  832.  
  833.         punpckhwd %%mm0,%%mm2             # m33:m23|m32:m22 - interleave third and fourth lines
  834.  
  835.  
  836.  
  837.         movq %%mm5,%%mm1                  # copy first intermediate result
  838.  
  839.         punpckldq %%mm2,%%mm5             # m32:m22|m12:m02 - interleave to produce result 3
  840.  
  841.  
  842.  
  843.         movq 8(%0),%%mm0                                 # m03:m02|m01:m00 - first line
  844.  
  845.         punpckhdq %%mm2,%%mm1                             # m33:m23|m13:m03 - interleave to produce result 4
  846.  
  847.  
  848.  
  849.         movq %%mm5,8+2*8*6(%0)     # write result 3
  850.  
  851.   #***********************Last 4x4 done
  852.  
  853.  
  854.  
  855.  
  856.  
  857. #do_4x4_blocks_x_and_y_not_equal:
  858.  
  859.  
  860.  
  861. # transpose the two mirror image 4x4 sets so that the writes 
  862.  
  863. # can be done without overwriting unused data 
  864.  
  865.  
  866.  
  867.         movq %%mm1,8+2*8*7(%0)     # write result 4
  868.  
  869.  
  870.  
  871.         movq 8+2*8*2(%0),%%mm2     # m23:m22|m21:m20 - third line
  872.  
  873.         movq %%mm0,%%mm6                                                  # copy first line
  874.  
  875.  
  876.  
  877.         punpcklwd 8+2*8*1(%0),%%mm0    # m11:m01|m10:m00 - interleave first and second lines
  878.  
  879.         movq %%mm2,%%mm7                  # copy third line
  880.  
  881.  
  882.  
  883.         punpcklwd 8+2*8*3(%0),%%mm2    # m31:m21|m30:m20 - interleave third and fourth lines
  884.  
  885.         movq %%mm0,%%mm4                  # copy first intermediate result
  886.  
  887. # all references for second 4 x 4 block are referred by \"n\" instead of \"m\"
  888.  
  889.         movq 2*8*4(%0),%%mm1                 # n03:n02|n01:n00 - first line 
  890.  
  891.         punpckldq %%mm2,%%mm0
  892.  
  893.         # m30:m20|m10:m00 - interleave to produce first result
  894.  
  895.  
  896.  
  897.         movq 2*8*6(%0),%%mm3           # n23:n22|n21:n20 - third line
  898.  
  899.         punpckhdq %%mm2,%%mm4             # m31:m21|m11:m01 - interleave to produce second result
  900.  
  901.  
  902.  
  903.         punpckhwd 8+2*8*1(%0),%%mm6 #m13:m03|m12:m02 - interleave first and second lines
  904.  
  905.         movq %%mm1,%%mm2                  # copy first line
  906.  
  907.  
  908.  
  909.         punpckhwd 8+2*8*3(%0),%%mm7     # m33:m23|m32:m22 - interleave third and fourth lines
  910.  
  911.         movq %%mm6,%%mm5                  # copy first intermediate result
  912.  
  913.  
  914.  
  915.         movq %%mm0,2*8*4(%0)                 # write result 1
  916.  
  917.         punpckhdq %%mm7,%%mm5                     # m33:m23|m13:m03 - produce third result
  918.  
  919.  
  920.  
  921.         punpcklwd 2*8*5(%0),%%mm1    # n11:n01|n10:n00 - interleave first and second lines
  922.  
  923.         movq %%mm3,%%mm0                  # copy third line
  924.  
  925.  
  926.  
  927.         punpckhwd 2*8*5(%0),%%mm2  # n13:n03|n12:n02 - interleave first and second lines
  928.  
  929.  
  930.  
  931.         movq %%mm4,2*8*5(%0)           # write result 2 out
  932.  
  933.         punpckldq %%mm7,%%mm6                  # m32:m22|m12:m02 - produce fourth result
  934.  
  935.  
  936.  
  937.         punpcklwd 2*8*7(%0),%%mm3 # n31:n21|n30:n20 - interleave third and fourth lines
  938.  
  939.         movq %%mm1,%%mm4                  # copy first intermediate result
  940.  
  941.  
  942.  
  943.         movq %%mm6,2*8*6(%0)           # write result 3 out
  944.  
  945.         punpckldq %%mm3,%%mm1            # n30:n20|n10:n00 - produce first result
  946.  
  947.  
  948.  
  949.         punpckhwd 2*8*7(%0),%%mm0        # n33:n23|n32:n22 - interleave third and fourth lines
  950.  
  951.         movq %%mm2,%%mm6                  # copy second intermediate result
  952.  
  953.  
  954.  
  955.         movq %%mm5,2*8*7(%0)             # write result 4 out
  956.  
  957.         punpckhdq %%mm3,%%mm4            # n31:n21|n11:n01- produce second result
  958.  
  959.  
  960.  
  961.         movq %%mm1,8+2*8*0(%0)       # write result 5 out - (first result for other 4 x 4 block)
  962.  
  963.         punpckldq %%mm0,%%mm2           # n32:n22|n12:n02- produce third result
  964.  
  965.  
  966.  
  967.         movq %%mm4,8+2*8*1(%0)         # write result 6 out
  968.  
  969.         punpckhdq %%mm0,%%mm6            # n33:n23|n13:n03 - produce fourth result
  970.  
  971.  
  972.  
  973.         movq %%mm2,8+2*8*2(%0)         # write result 7 out
  974.  
  975.  
  976.  
  977.         movq 2*8*0(%0),%%mm0     # m03:m02|m01:m00 - first line, first 4x4
  978.  
  979.  
  980.  
  981.         movq %%mm6,8+2*8*3(%0)           # write result 8 out
  982.  
  983.  
  984.  
  985.  
  986.  
  987. #Do first 4x4 quadrant, which is used in the beginning of the DCT:
  988.  
  989.         movq 2*8*2(%0),%%mm7     # m23:m22|m21:m20 - third line
  990.  
  991.         movq %%mm0,%%mm2                  # copy first line
  992.  
  993.  
  994.  
  995.         punpcklwd 2*8*1(%0),%%mm0# m11:m01|m10:m00 - interleave first and second lines
  996.  
  997.         movq %%mm7,%%mm4                  # copy third line
  998.  
  999.  
  1000.  
  1001.         punpcklwd 2*8*3(%0),%%mm7# m31:m21|m30:m20 - interleave third and fourth lines
  1002.  
  1003.         movq %%mm0,%%mm1                  # copy first intermediate result
  1004.  
  1005.  
  1006.  
  1007.         movq 2*8*1(%0),%%mm6     # m13:m12|m11:m10 - second line
  1008.  
  1009.         punpckldq %%mm7,%%mm0             # m30:m20|m10:m00 - interleave to produce result 1
  1010.  
  1011.  
  1012.  
  1013.         movq 2*8*3(%0),%%mm5     # m33:m32|m31:m30 - fourth line
  1014.  
  1015.         punpckhdq %%mm7,%%mm1             # m31:m21|m11:m01 - interleave to produce result 2
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.         movq %%mm0,%%mm7                              # write result 1
  1022.  
  1023.         punpckhwd %%mm6,%%mm2             # m13:m03|m12:m02 - interleave first and second lines
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.         psubw 2*8*7(%0),%%mm7    #tmp07=x0-x7    # Stage 1 
  1030.  
  1031.         movq %%mm1,%%mm6                                  # write result 2
  1032.  
  1033.  
  1034.  
  1035.         paddw 2*8*7(%0),%%mm0    #tmp00=x0+x7    # Stage 1 
  1036.  
  1037.         punpckhwd %%mm5,%%mm4             # m33:m23|m32:m22 - interleave third and fourth lines
  1038.  
  1039.  
  1040.  
  1041.         paddw 2*8*6(%0),%%mm1    #tmp01=x1+x6    # Stage 1 
  1042.  
  1043.         movq %%mm2,%%mm3                  # copy first intermediate result
  1044.  
  1045.  
  1046.  
  1047.         psubw 2*8*6(%0),%%mm6    #tmp06=x1-x6    # Stage 1 
  1048.  
  1049.         punpckldq %%mm4,%%mm2             # m32:m22|m12:m02 - interleave to produce result 3
  1050.  
  1051.  
  1052.  
  1053.         movq %%mm7,%2                         #save tmp07             # Stage 1 
  1054.  
  1055.         movq %%mm2,%%mm5                                  # write result 3
  1056.  
  1057.  
  1058.  
  1059.         movq %%mm6,%1                         #save tmp06             # Stage 1 
  1060.  
  1061.  
  1062.  
  1063.         punpckhdq %%mm4,%%mm3                             # m33:m23|m13:m03 - interleave to produce result 4
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.         paddw 2*8*5(%0),%%mm2    #tmp02=x2+x5    # Stage 1 
  1070.  
  1071.         movq %%mm3,%%mm4                                  # write result 4
  1072.  
  1073.  
  1074.  
  1075. # Pass 1: process rows. 
  1076. # Stage 1, above
  1077. #  dataptr = data#
  1078. #  for (ctr = 8-1# ctr >= 0# ctr--) {
  1079. #    tmp0 = dataptr[8*0] + dataptr[8*7]#
  1080. #    tmp7 = dataptr[8*0] - dataptr[8*7]#
  1081. #    tmp1 = dataptr[8*1] + dataptr[8*6]#
  1082. #    tmp6 = dataptr[8*1] - dataptr[8*6]#
  1083. #    tmp2 = dataptr[8*2] + dataptr[8*5]#
  1084. #    tmp5 = dataptr[8*2] - dataptr[8*5]#
  1085. #    tmp3 = dataptr[8*3] + dataptr[8*4]#
  1086. #    tmp4 = dataptr[8*3] - dataptr[8*4]#
  1087.  
  1088.  
  1089. # Stage 2, Even part
  1090. #    tmp10 = tmp0 + tmp3#        
  1091. #    tmp13 = tmp0 - tmp3#
  1092. #    tmp11 = tmp1 + tmp2#
  1093. #    tmp12 = tmp1 - tmp2#
  1094.  
  1095.         paddw 2*8*4(%0),%%mm3    #tmp03=x3+x4    # Stage 1 
  1096.  
  1097.         movq %%mm0,%%mm7                          #copy tmp00                                     # Even 2 
  1098.  
  1099.  
  1100.  
  1101.         psubw 2*8*4(%0),%%mm4    #tmp04=x3-x4    # Stage 1 
  1102.  
  1103.         movq %%mm1,%%mm6                          #copy tmp01                                     # Even 2 
  1104.  
  1105.  
  1106.  
  1107.         paddw %%mm3,%%mm0                         #tmp10 = tmp00 + tmp03#         # Even 2 
  1108.  
  1109.         psubw %%mm3,%%mm7                         #tmp13 = tmp00 - tmp03#         # Even 2 
  1110.  
  1111.  
  1112.  
  1113.     psubw %%mm2,%%mm6                             #tmp12 = tmp01 - tmp02#         # Even 2 
  1114.  
  1115.     paddw %%mm2,%%mm1                             #tmp11 = tmp01 + tmp02#         # Even 2      
  1116.  
  1117.  
  1118.  
  1119.         psubw 2*8*5(%0),%%mm5    #tmp05=x2-x5    # Stage 1 
  1120.  
  1121.         paddw %%mm7,%%mm6                         #tmp12+tmp13                    # Even 4 
  1122.  
  1123.  
  1124.  
  1125.  
  1126.  
  1127. # Stage 3, Even                and                                             Stage 4 & 5, Even
  1128. #    dataptr[8*0] =y0= tmp10 + tmp11#      z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781)#  c4 
  1129. #    dataptr[8*4] =y4= tmp10 - tmp11#      dataptr[8*2] = tmp13 + z1#
  1130.  
  1131.  
  1132.         movq %1,%%mm2                         #load tmp6                                      # Odd 2 
  1133.  
  1134.         movq %%mm0,%%mm3                          #copy tmp10                     # Even 3 
  1135.  
  1136.  
  1137.  
  1138.     psllw $0x2, %%mm6
  1139.  
  1140.         paddw %%mm1,%%mm0                         #y0=tmp10 + tmp11       # Even 3 
  1141.  
  1142.  
  1143.  
  1144.     pmulhw C4,%%mm6                      #z1 = (tmp12+tmp13)*c4  # Even 4 
  1145.  
  1146.         psubw %%mm1,%%mm3                         #y4=tmp10 - tmp11       # Even 3 
  1147.  
  1148.  
  1149.  
  1150.     movq %%mm0,2*8*0(%0) #save y0                        # Even 3 
  1151.  
  1152.         movq %%mm7,%%mm0                          #copy tmp13                             # Even 4 
  1153.  
  1154.  
  1155.  
  1156. # Odd part 
  1157. # Stage 2 
  1158. #mm4=tmp4, mm5=tmp5, load mm2=tmp6, load mm3=tmp7
  1159. #    tmp10 = tmp4 + tmp5#
  1160. #    tmp11 = tmp5 + tmp6#
  1161. #    tmp12 = tmp6 + tmp7#
  1162.  
  1163.  
  1164.     movq %%mm3,2*8*4(%0) #save y4                        # Even 3 
  1165.  
  1166.         paddw %%mm5,%%mm4                         #tmp10 = tmp4 + tmp5#           # Odd 2 
  1167.  
  1168.  
  1169.  
  1170.         movq %2,%%mm3                         #load tmp7                                      # Odd 2 
  1171.  
  1172.         paddw %%mm6,%%mm0                         #tmp32 = tmp13 + z1             # Even 5 
  1173.  
  1174.  
  1175.  
  1176.         paddw %%mm2,%%mm5                         #tmp11 = tmp5 + tmp6#           # Odd 2 
  1177.  
  1178.         psubw %%mm6,%%mm7                         #tmp33 = tmp13 - z1             # Even 5 
  1179.  
  1180.  
  1181.  
  1182.         movq %%mm0,2*8*2(%0)     #save tmp32=y2          # Even 5 
  1183.  
  1184.         paddw %%mm3,%%mm2                         #tmp12 = tmp6 + tmp7#           # Odd 2 
  1185.  
  1186.  
  1187.  
  1188. #      Stage 4 
  1189. #The rotator is modified from fig 4-8 to avoid extra negations. 
  1190. #    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433)#  c6 
  1191. #    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5#  c2-c6 
  1192. #    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5#  c2+c6 
  1193. #    z3 = MULTIPLY(tmp11, FIX_0_707106781)#  c4 
  1194.  
  1195.         movq %%mm7,2*8*6(%0)     #save tmp32=y6          # Even 5 
  1196.  
  1197.         movq %%mm4,%%mm1                                  #copy of tmp10                          # Odd 4 
  1198.  
  1199.  
  1200.  
  1201.         psubw %%mm2,%%mm1                                 #tmp10-tmp12                            # Odd 4 
  1202.  
  1203.     psllw $0x2, %%mm4
  1204.  
  1205.  
  1206.  
  1207.         movq C2mC6,%%mm0                                 #load C2mC6                                     # Odd 4 
  1208.  
  1209.     psllw $0x2, %%mm1
  1210.  
  1211.  
  1212.  
  1213.     pmulhw C6,%%mm1                                      #z5=(tmp10-tmp12)*c6            # Odd 4 
  1214.  
  1215.     psllw $0x2, %%mm2
  1216.  
  1217.  
  1218.  
  1219.     pmulhw %%mm0,%%mm4                                    #tmp10*(c2-c6)                          # Odd 4 
  1220.  
  1221.  
  1222.  
  1223. # Stage 5 
  1224. #    z11 = tmp7 + z3#            
  1225. #    z13 = tmp7 - z3#
  1226.  
  1227.     pmulhw C2pC6,%%mm2                                   #tmp12*(c2+c6)                          # Odd 4 
  1228.  
  1229.     psllw $0x2, %%mm5
  1230.  
  1231.  
  1232.  
  1233.     pmulhw C4,%%mm5                                      #z3=tmp11*c4                            # Odd 4 
  1234.  
  1235.         movq %%mm3,%%mm0                                  #copy tmp7                              # Stage 5 
  1236.  
  1237.  
  1238.  
  1239.         movq 8+2*8*0(%0),%%mm7     #load x0                # Stage 1, next set of 4 
  1240.  
  1241.         paddw %%mm1,%%mm4                                 #z2=tmp10*(c2-c6)+z5            # Odd 4 
  1242.  
  1243.  
  1244.  
  1245.         paddw %%mm1,%%mm2                                 #z4=tmp12*(c2+c6)+z5            # Odd 4 
  1246.  
  1247.  
  1248.  
  1249.         paddw %%mm5,%%mm0                                 #z11 = tmp7 + z3#               # Stage 5 
  1250.  
  1251.         psubw %%mm5,%%mm3                                 #z13 = tmp7 - z3#               # Stage 5 
  1252.  
  1253.  
  1254.  
  1255. # Stage 6 
  1256. #    dataptr[8*5] = z13 + z2# 
  1257. #    dataptr[8*3] = z13 - z2#
  1258. #    dataptr[8*1] = z11 + z4#
  1259. #    dataptr[8*7] = z11 - z4#
  1260.  
  1261.         movq %%mm3,%%mm5                                  #copy z13                               # Stage 6 
  1262.  
  1263.         psubw %%mm4,%%mm3                                 #y3=z13 - z2                    # Stage 6 
  1264.  
  1265.  
  1266.  
  1267.         paddw %%mm4,%%mm5                                 #y5=z13 + z2                    # Stage 6 
  1268.  
  1269.         movq %%mm0,%%mm6                                  #copy z11                               # Stage 6 
  1270.  
  1271.  
  1272.  
  1273.         movq %%mm3,2*8*3(%0)             #save y3                                # Stage 6 
  1274.  
  1275.         psubw %%mm2,%%mm0                                 #y7=z11 - z4                    # Stage 6 
  1276.  
  1277.  
  1278.  
  1279.         movq %%mm5,2*8*5(%0)             #save y5                                # Stage 6 
  1280.  
  1281.         paddw %%mm2,%%mm6                                 #y1=z11 + z4                    # Stage 6 
  1282.  
  1283.  
  1284.  
  1285.         movq %%mm0,2*8*7(%0)             #save y7                                # Stage 6 
  1286.  
  1287.  
  1288.  
  1289. # Pass 2: process rows. 
  1290.  
  1291. #  dataptr = data#
  1292. #  for (ctr = 8-1# ctr >= 0# ctr--) {
  1293. #    tmp0 = dataptr[8*0] + dataptr[8*7]#
  1294. #    tmp7 = dataptr[8*0] - dataptr[8*7]#
  1295. #    tmp1 = dataptr[8*1] + dataptr[8*6]#
  1296. #    tmp6 = dataptr[8*1] - dataptr[8*6]#
  1297. #    tmp2 = dataptr[8*2] + dataptr[8*5]#
  1298. #    tmp5 = dataptr[8*2] - dataptr[8*5]#
  1299. #    tmp3 = dataptr[8*3] + dataptr[8*4]#
  1300. #    tmp4 = dataptr[8*3] - dataptr[8*4]#
  1301.  
  1302. #Stage 1,even
  1303.  
  1304.  
  1305.  
  1306.         movq 8+2*8*1(%0),%%mm1     #load x1                # Stage 1 
  1307.  
  1308.         movq %%mm7,%%mm0                          #copy x0                                # Stage 1 
  1309.  
  1310.  
  1311.  
  1312.         movq %%mm6,2*8*1(%0)             #save y1                                # Stage 6 
  1313.  
  1314.  
  1315.  
  1316.         movq 8+2*8*2(%0),%%mm2     #load x2                # Stage 1 
  1317.  
  1318.         movq %%mm1,%%mm6                          #copy x1                                # Stage 1 
  1319.  
  1320.  
  1321.  
  1322.         paddw 8+2*8*7(%0),%%mm0    #tmp00=x0+x7    # Stage 1 
  1323.  
  1324.  
  1325.  
  1326.         movq 8+2*8*3(%0),%%mm3     #load x3                # Stage 1 
  1327.  
  1328.         movq %%mm2,%%mm5                          #copy x2                                # Stage 1 
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.         psubw 8+2*8*7(%0),%%mm7    #tmp07=x0-x7    # Stage 1 
  1335.  
  1336.         movq %%mm3,%%mm4                          #copy x3                                # Stage 1 
  1337.  
  1338.  
  1339.  
  1340.         paddw 8+2*8*6(%0),%%mm1    #tmp01=x1+x6    # Stage 1 
  1341.  
  1342.  
  1343.  
  1344.         movq %%mm7,%2                         #save tmp07                             # Stage 1 
  1345.  
  1346.         movq %%mm0,%%mm7                          #copy tmp00                                     # Even 2 
  1347.  
  1348.  
  1349.  
  1350.         psubw 8+2*8*6(%0),%%mm6    #tmp06=x1-x6    # Stage 1 
  1351.  
  1352.  
  1353.  
  1354. # Stage 2, Even part
  1355. #    tmp10 = tmp0 + tmp3#        
  1356. #    tmp13 = tmp0 - tmp3#
  1357. #    tmp11 = tmp1 + tmp2#
  1358. #    tmp12 = tmp1 - tmp2#
  1359.  
  1360.         paddw 8+2*8*4(%0),%%mm3    #tmp03=x3+x4    # Stage 1 
  1361.  
  1362.  
  1363.  
  1364.         movq %%mm6,%1                         #save tmp06             # Stage 1 
  1365.  
  1366.         movq %%mm1,%%mm6                          #copy tmp01                                     # Even 2 
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.         paddw 8+2*8*5(%0),%%mm2    #tmp02=x2+x5    # Stage 1 
  1373.  
  1374.         paddw %%mm3,%%mm0                         #tmp10 = tmp00 + tmp03#         # Even 2 
  1375.  
  1376.  
  1377.  
  1378.         psubw %%mm3,%%mm7                         #tmp13 = tmp00 - tmp03#         # Even 2 
  1379.  
  1380.  
  1381.  
  1382.         psubw 8+2*8*4(%0),%%mm4    #tmp04=x3-x4    # Stage 1 
  1383.  
  1384.     psubw %%mm2,%%mm6                             #tmp12 = tmp01 - tmp02#         # Even 2 
  1385.  
  1386.  
  1387.  
  1388.     paddw %%mm2,%%mm1                             #tmp11 = tmp01 + tmp02#         # Even 2      
  1389.  
  1390.  
  1391.  
  1392.         psubw 8+2*8*5(%0),%%mm5    #tmp05=x2-x5    # Stage 1 
  1393.  
  1394.         paddw %%mm7,%%mm6                         #tmp12+tmp13                    # Even 4 
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400. # Stage 3, Even                and                                             Stage 4 & 5, Even
  1401. #    dataptr[8*0] =y0= tmp10 + tmp11#      z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781)#  c4 
  1402. #    dataptr[8*4] =y4= tmp10 - tmp11#      dataptr[8*2] = tmp13 + z1#
  1403.  
  1404.  
  1405.         movq %1,%%mm2                         #load tmp6                                      # Odd 2 
  1406.  
  1407.         movq %%mm0,%%mm3                          #copy tmp10                     # Even 3 
  1408.  
  1409.  
  1410.  
  1411.     psllw $0x2, %%mm6
  1412.  
  1413.         paddw %%mm1,%%mm0                         #y0=tmp10 + tmp11       # Even 3 
  1414.  
  1415.  
  1416.  
  1417.     pmulhw C4,%%mm6                      #z1 = (tmp12+tmp13)*c4  # Even 4 
  1418.  
  1419.         psubw %%mm1,%%mm3                         #y4=tmp10 - tmp11       # Even 3 
  1420.  
  1421.  
  1422.  
  1423.     movq %%mm0,8+2*8*0(%0) #save y0                        # Even 3 
  1424.  
  1425.         movq %%mm7,%%mm0                          #copy tmp13                             # Even 4 
  1426.  
  1427.  
  1428.  
  1429. # Odd part 
  1430. # Stage 2 
  1431. #
  1432. #mm4=tmp4, mm5=tmp5, load mm2=tmp6, load mm3=tmp7
  1433. #    tmp10 = tmp4 + tmp5#
  1434. #    tmp11 = tmp5 + tmp6#
  1435. #    tmp12 = tmp6 + tmp7#
  1436.  
  1437.     movq %%mm3,8+2*8*4(%0) #save y4                        # Even 3 
  1438.  
  1439.         paddw %%mm5,%%mm4                         #tmp10 = tmp4 + tmp5#           # Odd 2 
  1440.  
  1441.  
  1442.  
  1443.         movq %2,%%mm3                         #load tmp7                                      # Odd 2 
  1444.  
  1445.         paddw %%mm6,%%mm0                         #tmp32 = tmp13 + z1             # Even 5 
  1446.  
  1447.  
  1448.  
  1449.         paddw %%mm2,%%mm5                         #tmp11 = tmp5 + tmp6#           # Odd 2 
  1450.  
  1451.         psubw %%mm6,%%mm7                         #tmp33 = tmp13 - z1             # Even 5 
  1452.  
  1453.  
  1454.  
  1455.         movq %%mm0,8+2*8*2(%0)     #save tmp32=y2          # Even 5 
  1456.  
  1457.         paddw %%mm3,%%mm2                         #tmp12 = tmp6 + tmp7#           # Odd 2 
  1458.  
  1459.  
  1460.  
  1461. #      Stage 4 
  1462. # The rotator is modified from fig 4-8 to avoid extra negations. 
  1463. #    z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433)# // c6 
  1464. #    z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5# // c2-c6 
  1465. #    z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5# // c2+c6 
  1466. #    z3 = MULTIPLY(tmp11, FIX_0_707106781)# // c4 
  1467.  
  1468.  
  1469.         movq %%mm7,8+2*8*6(%0)     #save tmp32=y6          # Even 5 
  1470.  
  1471.         movq %%mm4,%%mm1                                  #copy of tmp10                          # Odd 4 
  1472.  
  1473.  
  1474.  
  1475.         psubw %%mm2,%%mm1                                 #tmp10-tmp12                            # Odd 4 
  1476.  
  1477.     psllw $0x2, %%mm4
  1478.  
  1479.  
  1480.  
  1481.         movq C2mC6,%%mm0                                 #load C2mC6                                     # Odd 4 
  1482.  
  1483.     psllw $0x2, %%mm1
  1484.  
  1485.  
  1486.  
  1487.     pmulhw C6,%%mm1                                      #z5=(tmp10-tmp12)*c6            # Odd 4 
  1488.  
  1489.     psllw $0x2, %%mm5
  1490.  
  1491.  
  1492.  
  1493.     pmulhw %%mm0,%%mm4                                    #tmp10*(c2-c6)                          # Odd 4 
  1494.  
  1495.  
  1496.  
  1497. # Stage 5 
  1498. #    z11 = tmp7 + z3#            
  1499. #    z13 = tmp7 - z3#
  1500.  
  1501.     pmulhw C4,%%mm5                                      #z3=tmp11*c4                            # Odd 4 
  1502.  
  1503.     psllw $0x2, %%mm2
  1504.  
  1505.  
  1506.  
  1507.     pmulhw C2pC6,%%mm2                                   #tmp12*(c2+c6)                          # Odd 4 
  1508.  
  1509.         movq %%mm3,%%mm0                                  #copy tmp7                              # Stage 5 
  1510.  
  1511.  
  1512.  
  1513.         movq 8+2*8*4(%0),%%mm7     # m03:m02|m01:m00 - first line (line 4)
  1514.  
  1515.         paddw %%mm1,%%mm4                                 #z2=tmp10*(c2-c6)+z5            # Odd 4 
  1516.  
  1517.  
  1518.  
  1519.         paddw %%mm5,%%mm0                                 #z11 = tmp7 + z3#               # Stage 5 
  1520.  
  1521.         psubw %%mm5,%%mm3                                 #z13 = tmp7 - z3#               # Stage 5 
  1522.  
  1523.  
  1524.  
  1525. # Stage 6 
  1526. #    dataptr[8*5] = z13 + z2# 
  1527. #    dataptr[8*3] = z13 - z2#
  1528. #    dataptr[8*1] = z11 + z4#
  1529. #    dataptr[8*7] = z11 - z4#
  1530.  
  1531.  
  1532.         movq %%mm3,%%mm5                                  #copy z13                               # Stage 6 
  1533.  
  1534.         paddw %%mm1,%%mm2                                 #z4=tmp12*(c2+c6)+z5            # Odd 4 
  1535.  
  1536.  
  1537.  
  1538.         movq %%mm0,%%mm6                                  #copy z11                               # Stage 6 
  1539.  
  1540.         psubw %%mm4,%%mm5                                 #y3=z13 - z2                    # Stage 6 
  1541.  
  1542.  
  1543.  
  1544.         paddw %%mm2,%%mm6                                 #y1=z11 + z4                    # Stage 6 
  1545.  
  1546.         paddw %%mm4,%%mm3                                 #y5=z13 + z2                    # Stage 6 
  1547.  
  1548.  
  1549.  
  1550.         movq %%mm5,8+2*8*3(%0)             #save y3                                # Stage 6 
  1551.  
  1552.         psubw %%mm2,%%mm0                                 #y7=z11 - z4                    # Stage 6 
  1553.  
  1554.  
  1555.  
  1556.         movq %%mm3,8+2*8*5(%0)             #save y5                                # Stage 6 
  1557.  
  1558.  
  1559.  
  1560.         movq %%mm6,8+2*8*1(%0)             #save y1                                # Stage 6 
  1561.  
  1562.  
  1563.  
  1564.         movq %%mm0,8+2*8*7(%0)             #save y7                                # Stage 6 
  1565.  
  1566.  
  1567.         emms"
  1568.   :
  1569.   : "r" (data), "o" (temp6), "o" (temp7)
  1570.   );
  1571.  
  1572. }
  1573.  
  1574.  
  1575.