Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Interpolation kernel for luminance motion compensation
  3.  * Copyright © <2010>, Intel Corporation.
  4.  *
  5.  * This program is licensed under the terms and conditions of the
  6.  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
  7.  * http://www.opensource.org/licenses/eclipse-1.0.php.
  8.  *
  9.  */
  10. // Kernel name: Interpolate_Y_8x8.asm
  11. //
  12. // Interpolation kernel for luminance motion compensation
  13. //
  14. //  $Revision: 13 $
  15. //  $Date: 10/09/06 4:00p $
  16. //
  17.  
  18.  
  19. //---------------------------------------------------------------
  20. // In: pMV => Source address of MV
  21. // In: gMVX_FRAC<2;2,1>:w => MV fractional components
  22. // In: f0.1 (1) => If 1, vertical MV is integer
  23. // In: gpINTPY:uw => Destination address for interpolated result
  24. // In: Reference area staring from R43
  25. //              If horizontal/vertical MVs are all integer, 8x8 pixels are on R43~R44 (2 GRFs)
  26. //              If only horz MV is integer, 8x13 pixels are on R43~R46 (4 GRFs)
  27. //              If only vert MV is integer, 13x8 pixels are on R43~R46 (4 GRFs)
  28. //              If no MVs are integer, 13x13 pixels are on R43~R49 (7 GRFs)
  29. //---------------------------------------------------------------
  30.  
  31.  
  32. INTERLABEL(Interpolate_Y_8x8_Func):
  33.  
  34.  
  35.  
  36.         // Check whether MVX is integer MV
  37.         and.z.f0.0 (1) null:w                   r[pMV,0]<0;1,0>:w                               0x3:w
  38.         (-f0.0) jmpi (1) INTERLABEL(Interpolate_Y_8x8_Func2)
  39.                
  40.         // TODO: remove this back-to-back read - huge latency..
  41.         mov (8) gubREF(6,2)<1>  gubREF(3,0)<8;8,1>
  42.     mov (8)     gubREF(5,18)<1> gubREF(2,24)<8;8,1>             {NoDDClr}
  43.         mov (8) gubREF(5,2)<1>  gubREF(2,16)<8;8,1>             {NoDDChk}
  44.         mov (8) gubREF(4,18)<1> gubREF(2,8)<8;8,1>              {NoDDClr}
  45.         mov (8) gubREF(4,2)<1>  gubREF(2,0)<8;8,1>              {NoDDChk}
  46.         mov (8) gubREF(3,18)<1> gubREF(1,24)<8;8,1>             {NoDDClr}
  47.         mov (8) gubREF(3,2)<1>  gubREF(1,16)<8;8,1>             {NoDDChk}
  48.         mov (8) gubREF(2,18)<1> gubREF(1,8)<8;8,1>              {NoDDClr}
  49.         mov (8) gubREF(2,2)<1>  gubREF(1,0)<8;8,1>              {NoDDChk}
  50.         mov (8) gubREF(1,18)<1> gubREF(0,24)<8;8,1>             {NoDDClr}
  51.         mov (8) gubREF(1,2)<1>  gubREF(0,16)<8;8,1>             {NoDDChk}
  52.         mov (8) gubREF(0,18)<1> gubREF(0,8)<8;8,1>     
  53.     mov (8)     gubREF(0,2)<1>  gubREF(0,0)<8;8,1>
  54.  
  55. INTERLABEL(Interpolate_Y_8x8_Func2):
  56.  
  57.         // Compute the GRF address of the starting position of the reference area
  58.     (-f0.1) mov (1)     pREF:w                  nOFFSET_REF+2+nGRFWIB:w
  59.     (f0.1) mov (1)      pREF:w                  nOFFSET_REF+2:w                
  60.         mov (1)         pRESULT:uw                      gpINTPY:uw     
  61.        
  62.         /*
  63.          *                       |               |
  64.          *               - - 0 1 2 3 + -
  65.          *                       4 5 6 7
  66.          *                       8 9 A B
  67.          *                       C D E F
  68.          *               - - + - - - + -
  69.      *                   |               |
  70.          */
  71.        
  72.         // Case 0
  73.         or.z.f0.1 (16) null:w                   gMVY_FRAC<0;1,0>:w                              gMVX_FRAC<0;1,0>:w     
  74.         (f0.1) mov (16) r[pRESULT]<1>:uw                                r[pREF]<16;8,1>:ub
  75.         (f0.1) mov (16) r[pRESULT,nGRFWIB]<1>:uw                r[pREF,nGRFWIB]<16;8,1>:ub
  76.         (f0.1) mov (16) r[pRESULT,nGRFWIB*2]<1>:uw              r[pREF,nGRFWIB*2]<16;8,1>:ub
  77.         (f0.1) mov (16) r[pRESULT,nGRFWIB*3]<1>:uw              r[pREF,nGRFWIB*3]<16;8,1>:ub
  78.         (f0.1) jmpi INTERLABEL(Exit_Interpolate_Y_8x8)
  79.        
  80.         // Store all address registers
  81.         mov (8)         gpADDR<1>:w                     a0<8;8,1>:w
  82.        
  83.         mul.z.f0.0 (1) gW4:w                    gMVY_FRAC:w                                             gMVX_FRAC:w
  84.         add (1)         pREF1:uw                        pREF0:uw                                                nGRFWIB/2:uw
  85.         and.nz.f0.1 (1) null                    gW4:w                                                   1:w
  86.         add (2)         pREF2<1>:uw                     pREF0<2;2,1>:uw                                 nGRFWIB:uw
  87.         mov (4)         gW0<1>:uw                       pREF0<4;4,1>:uw
  88.  
  89.         (f0.0) jmpi INTERLABEL(Interpolate_Y_H_8x8)
  90.         (f0.1) jmpi INTERLABEL(Interpolate_Y_H_8x8)
  91.        
  92.         //-----------------------------------------------------------------------
  93.         // CASE: A69BE (H/V interpolation)
  94.         //-----------------------------------------------------------------------
  95.        
  96.         // Compute interim horizontal intepolation of 12 lines (not 9 lines)
  97. //      add (1)         pREF0<1>:ud                     pREF0<0;1,0>:ud                                 0xffeeffde:ud   // (-18<<16)|(-34)
  98.         add (1)         pREF0<1>:uw                     pREF0<0;1,0>:uw                                 -34:w  
  99.         add (1)         pREF1<1>:uw                     pREF1<0;1,0>:uw                                 -18:w {NoDDClr}
  100.         mov (1)         pRESD:ud                        nOFFSET_INTERIM3:ud                                     {NoDDChk}                      
  101.        
  102.         // Check whether this position is 'A'    
  103.         cmp.e.f0.0 (1) null                             gW4:w                                                   4:w
  104.        
  105.         $for(0;<6;2) {
  106.         add (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1]<16;8,1>:ub                   r[pREF0,nGRFWIB*%1+5]<16;8,1>:ub                {Compr}
  107.         mac (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1+1]<16;8,1>:ub                 -5:w    {Compr}
  108.         mac (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1+2]<16;8,1>:ub                 20:w    {Compr}
  109.         mac (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1+3]<16;8,1>:ub                 20:w    {Compr}
  110.         mac (32)        r[pRES,nGRFWIB*%1]<1>:w         r[pREF,nGRFWIB*%1+4]<16;8,1>:ub -5:w    {Compr}
  111.         }
  112.         // last line
  113.         add (8)         acc0<1>:w                       r[pREF,nGRFWIB*6]<8;8,1>:ub                             r[pREF,nGRFWIB*6+5]<8;8,1>:ub
  114.         mac (8)         acc0<1>:w                       r[pREF,nGRFWIB*6+1]<8;8,1>:ub                   -5:w
  115.         mac (8)         acc0<1>:w                       r[pREF,nGRFWIB*6+2]<8;8,1>:ub                   20:w
  116.         mac (8)         acc0<1>:w                       r[pREF,nGRFWIB*6+3]<8;8,1>:ub                   20:w
  117.         mac (8)         r[pRES,nGRFWIB*6]<1>:w          r[pREF,nGRFWIB*6+4]<8;8,1>:ub   -5:w
  118.  
  119.     // Compute interim/output vertical interpolation
  120.     mov (1)             pREF0:ud                        nOFFSET_INTERIM2:ud     {NoDDClr}                       // set pREF0 and pREF1 at the same time
  121.         mov (1)         pREF2D:ud                       nOFFSET_INTERIM4:ud     {NoDDChk,NoDDClr}       // set pREF2 and pREF3 at the same time
  122.         (f0.0) sel (1) pRES:uw                  gpINTPY:uw      nOFFSET_INTERIM:uw {NoDDChk} // Case A vs. 69BE
  123.    
  124.         $for(0;<4;2) {
  125.         add (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1]<16;16,1>:w                          512:w   {Compr}
  126.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1]<8,1>:w                                      -5:w
  127.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:w                      -5:w
  128.         mac (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+nGRFWIB]<16;16,1>:w          20:w    {Compr}
  129.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:w                      20:w   
  130.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB+nGRFWIB]<8,1>:w      20:w   
  131.         mac (32)        acc0<1>:w                       r[pREF0,(2+%1)*nGRFWIB]<16;16,1>:w                      -5:w    {Compr}
  132.         mac (16)        acc0<1>:w                       r[pREF2,(2+%1)*nGRFWIB]<8,1>:w                          1:w
  133.         mac (16)        acc1<1>:w                       r[pREF2,(2+%1)*nGRFWIB+nGRFWIB]<8,1>:w          1:w
  134.         asr.sat (16) r[pRES,nGRFWIB*%1]<2>:ub                   acc0<16;16,1>:w                         10:w
  135.         asr.sat (16) r[pRES,nGRFWIB*%1+nGRFWIB]<2>:ub   acc1<16;16,1>:w                         10:w {SecHalf}
  136.         }
  137.        
  138.         (f0.0) jmpi INTERLABEL(Return_Interpolate_Y_8x8)
  139.        
  140. INTERLABEL(Interpolate_Y_H_8x8):
  141.        
  142.         cmp.e.f0.0 (1) null                             gMVX_FRAC:w                                             0:w
  143.         cmp.e.f0.1 (1) null                             gMVY_FRAC:w                                             2:w
  144.         (f0.0) jmpi INTERLABEL(Interpolate_Y_V_8x8)
  145.         (f0.1) jmpi INTERLABEL(Interpolate_Y_V_8x8)
  146.        
  147.         //-----------------------------------------------------------------------
  148.         // CASE: 123567DEF (H interpolation)
  149.         //-----------------------------------------------------------------------
  150.  
  151.         add (4)         pREF0<1>:uw                     gW0<4;4,1>:uw                                   -2:w           
  152.         cmp.g.f0.0 (4) null:w                   gMVY_FRAC<0;1,0>:w                              2:w
  153.         cmp.e.f0.1 (1) null                             gMVX_FRAC:w                                             2:w
  154.         (f0.0) add (4) pREF0<1>:uw              pREF0<4;4,1>:uw                                 nGRFWIB/2:uw
  155.  
  156.         cmp.e.f0.0 (1) null:w                   gMVY_FRAC<0;1,0>:w                              0:w
  157.  
  158.         (f0.1) sel (1) pRES:uw                  gpINTPY:uw                                              nOFFSET_INTERIM:uw // Case 26E vs. 1357DF
  159.        
  160.         // Compute interim/output horizontal interpolation
  161.         $for(0;<4;2) {
  162.         add (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1]<8,1>:ub                             16:w
  163.         add (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+nGRFWIB]<8,1>:ub             16:w
  164.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+1]<8,1>:ub                   -5:w
  165.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+1+nGRFWIB]<8,1>:ub   -5:w
  166.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+2]<8,1>:ub                   20:w
  167.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+2+nGRFWIB]<8,1>:ub   20:w
  168.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+3]<8,1>:ub                   20:w
  169.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+3+nGRFWIB]<8,1>:ub   20:w
  170.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+4]<8,1>:ub                   -5:w
  171.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+4+nGRFWIB]<8,1>:ub   -5:w
  172.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+5]<8,1>:ub                   1:w
  173.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+5+nGRFWIB]<8,1>:ub   1:w
  174.         asr.sat (16) r[pRES,nGRFWIB*%1]<2>:ub                   acc0<16;16,1>:w         5:w
  175.         asr.sat (16) r[pRES,nGRFWIB*%1+nGRFWIB]<2>:ub   acc1<16;16,1>:w         5:w {SecHalf}
  176.     }
  177.    
  178.     (-f0.1) jmpi INTERLABEL(Interpolate_Y_V_8x8)
  179.         (-f0.0) jmpi INTERLABEL(Average_8x8)
  180.        
  181.         jmpi INTERLABEL(Return_Interpolate_Y_8x8)
  182.  
  183. INTERLABEL(Interpolate_Y_V_8x8):
  184.  
  185.         cmp.e.f0.0 (1) null                             gMVY_FRAC:w                                             0:w
  186.         (f0.0) jmpi INTERLABEL(Interpolate_Y_I_8x8)
  187.        
  188.         //-----------------------------------------------------------------------
  189.         // CASE: 48C59D7BF (V interpolation)
  190.         //-----------------------------------------------------------------------
  191.  
  192.         mov (2)         pREF0<1>:uw                     gW0<4;2,2>:uw   {NoDDClr}
  193.         mov (2)         pREF2<1>:uw                     gW1<2;2,1>:uw   {NoDDChk,NoDDClr}
  194.         mov (1)         pRES:uw                         gpINTPY:uw              {NoDDChk}
  195.  
  196.         cmp.g.f0.1 (4) null:w                   gMVX_FRAC<0;1,0>:w                              2:w
  197.         cmp.e.f0.0 (1) null:w                   gMVX_FRAC<0;1,0>:w                              0:w
  198.         (f0.1) add (4) pREF0<1>:uw              pREF0<4;4,1>:uw                                 1:uw
  199.  
  200.         cmp.e.f0.1 (1) null                             gMVY_FRAC:w                                             2:w
  201.         (-f0.0) jmpi INTERLABEL(VFILTER_8x8)
  202.         (-f0.1) mov (1) pRES:uw         nOFFSET_INTERIM:uw
  203.        
  204.   INTERLABEL(VFILTER_8x8):
  205.  
  206.         // Compute interim/output vertical interpolation
  207.         $for(0;<4;2) {
  208.         add (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1-nGRFWIB]<16;8,1>:ub                  16:w {Compr}
  209.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1-nGRFWIB]<8,1>:ub                             -5:w
  210.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1]<8,1>:ub                                             -5:w
  211.         mac (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1]<16;8,1>:ub                                  20:w {Compr}
  212.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1]<8,1>:ub                                             20:w   
  213.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:ub                             20:w   
  214.         mac (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+nGRFWIB]<16;8,1>:ub                  -5:w {Compr}
  215.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:ub                             1:w
  216.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB+nGRFWIB]<8,1>:ub             1:w
  217.         asr.sat (16) r[pRES,nGRFWIB*%1]<2>:ub                   acc0<16;16,1>:w                                 5:w
  218.         asr.sat (16) r[pRES,nGRFWIB*%1+nGRFWIB]<2>:ub   acc1<16;16,1>:w                                 5:w     {SecHalf}
  219.         }
  220.  
  221.         (-f0.0) jmpi INTERLABEL(Average_8x8)
  222.         (f0.1) jmpi INTERLABEL(Return_Interpolate_Y_8x8)
  223.  
  224. INTERLABEL(Interpolate_Y_I_8x8):
  225.  
  226.         //-----------------------------------------------------------------------
  227.         // CASE: 134C (Integer position)
  228.         //-----------------------------------------------------------------------
  229.        
  230.         mov (2)         pREF0<1>:uw                     gW0<2;2,1>:uw           {NoDDClr}
  231.                        
  232.         mov (1)         pRES:uw                         gpINTPY:uw                      {NoDDChk}
  233.  
  234.         cmp.e.f0.0 (2) null:w                   gMVX_FRAC<0;1,0>:w                              3:w
  235.         cmp.e.f0.1 (2) null:w                   gMVY_FRAC<0;1,0>:w                              3:w
  236.         (f0.0) add (2) pREF0<1>:uw              pREF0<2;2,1>:uw                                 1:uw
  237.         (f0.1) add (2) pREF0<1>:uw              pREF0<2;2,1>:uw                                 nGRFWIB/2:uw
  238.        
  239.         mov (16)        r[pRES]<1>:uw                   r[pREF0]<8,1>:ub
  240.         mov (16)        r[pRES,nGRFWIB]<1>:uw   r[pREF0,nGRFWIB]<8,1>:ub
  241.         mov (16)        r[pRES,nGRFWIB*2]<1>:uw r[pREF0,nGRFWIB*2]<8,1>:ub
  242.         mov (16)        r[pRES,nGRFWIB*3]<1>:uw r[pREF0,nGRFWIB*3]<8,1>:ub
  243.        
  244. INTERLABEL(Average_8x8):
  245.  
  246.         //-----------------------------------------------------------------------
  247.         // CASE: 13456789BCDEF (Average)
  248.         //-----------------------------------------------------------------------
  249.  
  250.         // Average two interim results
  251.         avg.sat (16) r[pRES,0]<2>:ub                    r[pRES,0]<32;16,2>:ub                   gubINTERIM_BUF(0)      
  252.         avg.sat (16) r[pRES,nGRFWIB]<2>:ub              r[pRES,nGRFWIB]<32;16,2>:ub             gubINTERIM_BUF(1)      
  253.         avg.sat (16) r[pRES,nGRFWIB*2]<2>:ub    r[pRES,nGRFWIB*2]<32;16,2>:ub   gubINTERIM_BUF(2)      
  254.         avg.sat (16) r[pRES,nGRFWIB*3]<2>:ub    r[pRES,nGRFWIB*3]<32;16,2>:ub   gubINTERIM_BUF(3)      
  255.  
  256. INTERLABEL(Return_Interpolate_Y_8x8):
  257.         // Restore all address registers
  258.         mov (8)         a0<1>:w                                 gpADDR<8;8,1>:w
  259.        
  260. INTERLABEL(Exit_Interpolate_Y_8x8):
  261.                
  262. // end of file
  263.