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_4x4.asm
  11. //
  12. // Interpolation kernel for luminance motion compensation
  13. //
  14. //  $Revision: 10 $
  15. //  $Date: 10/09/06 4:00p $
  16. //
  17.  
  18.  
  19.         // Compute the GRF address of the starting position of the reference area
  20. #if 1
  21.     (-f0.1) mov (1)     pREF:w                  nOFFSET_REF+2+nGRFWIB:w
  22.     (f0.1) mov (1)      pREF:w                  nOFFSET_REF+2:w        
  23.         mov (1)         pRESULT:uw                      gpINTPY:uw                                                                                     
  24. #else
  25.     mov (1)             pREF:w                          nOFFSET_REF+2+nGRFWIB:w {NoDDClr}
  26.         mov (1)         pRESULT:uw                      gpINTPY:uw                              {NoDDChk}
  27. #endif
  28.        
  29.         /*
  30.          *                       |               |
  31.          *               - - 0 1 2 3 + -
  32.          *                       4 5 6 7
  33.          *                       8 9 A B
  34.          *                       C D E F
  35.          *               - - + - - - + -
  36.      *                   |               |
  37.          */
  38.        
  39.         // Case 0
  40.         or.z.f0.1 (16) null:w                   gMVY_FRAC<0;1,0>:w                              gMVX_FRAC<0;1,0>:w     
  41.         (f0.1) mov (4)  r[pRESULT]<1>:uw        r[pREF0]<4;4,1>:ub
  42.         (f0.1) mov (4)  r[pRESULT,16]<1>:uw     r[pREF0,16]<4;4,1>:ub
  43.         (f0.1) mov (4)  r[pRESULT,32]<1>:uw r[pREF0,32]<4;4,1>:ub
  44.         (f0.1) mov (4)  r[pRESULT,48]<1>:uw r[pREF0,48]<4;4,1>:ub
  45.         (f0.1) jmpi INTERLABEL(Exit_Interpolate_Y_4x4)
  46.        
  47.         // Store all address registers
  48.         mov (8)         gpADDR<1>:w                     a0<8;8,1>:w
  49.        
  50.         mul.z.f0.0 (1) gW4:w                    gMVY_FRAC:w                                             gMVX_FRAC:w
  51.         and.nz.f0.1 (1) null                    gW4:w                                                   1:w
  52.  
  53.         add (1)         pREF1:uw                        pREF0:uw                                                nGRFWIB/2:uw
  54.         add (2)         pREF2<1>:uw                     pREF0<2;2,1>:uw                                 nGRFWIB:uw
  55.         mov (4)         gW0<1>:uw                       pREF0<4;4,1>:uw
  56.  
  57.         (f0.0) jmpi INTERLABEL(Interpolate_Y_H_4x4)
  58.         (f0.1) jmpi INTERLABEL(Interpolate_Y_H_4x4)    
  59.        
  60.         //-----------------------------------------------------------------------
  61.         // CASE: A69BE (H/V interpolation)
  62.         //-----------------------------------------------------------------------
  63.  
  64.         // Compute interim horizontal intepolation
  65.         add (1)         pREF0<1>:uw                     pREF0<0;1,0>:uw                                 -34:w
  66.         add (1)         pREF1<1>:uw                     pREF1<0;1,0>:uw                                 -18:w {NoDDClr}
  67.         mov (1)         pRESD:ud                        nOFFSET_INTERIM4x4_5:ud                         {NoDDChk} // Case 69be
  68.        
  69.         // Check whether this position is 'A'
  70.         cmp.e.f0.0 (1) null                             gW4:w                                                   4:w
  71.  
  72.     $for(0;<2;1) {
  73.         add (16)        acc0<1>:w                       r[pREF0,nGRFWIB*2*%1]<16;4,1>:ub                        r[pREF0,nGRFWIB*2*%1+5]<16;4,1>:ub              {Compr}
  74.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*2*%1+1]<16;4,1>:ub                      -5:w    {Compr}
  75.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*2*%1+2]<16;4,1>:ub                      20:w    {Compr}
  76.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*2*%1+3]<16;4,1>:ub                      20:w    {Compr}
  77.         mac (16)        r[pRES,nGRFWIB*%1]<1>:w         r[pREF0,nGRFWIB*2*%1+4]<16;4,1>:ub      -5:w    {Compr}
  78.         }
  79.         // last line
  80.         add (4)         acc0<1>:w                       r[pREF0,nGRFWIB*2*2]<4;4,1>:ub                          r[pREF0,nGRFWIB*2*2+5]<4;4,1>:ub
  81.         mac (4)         acc0<1>:w                       r[pREF0,nGRFWIB*2*2+1]<4;4,1>:ub                        -5:w
  82.         mac (4)         acc0<1>:w                       r[pREF0,nGRFWIB*2*2+2]<4;4,1>:ub                        20:w
  83.         mac (4)         acc0<1>:w                       r[pREF0,nGRFWIB*2*2+3]<4;4,1>:ub                        20:w
  84.         mac (4)         r[pRES,nGRFWIB*2]<1>:w          r[pREF0,nGRFWIB*2*2+4]<4;4,1>:ub        -5:w
  85.        
  86.     // Compute interim/output vertical interpolation
  87.         mov (1)         pREF6D:ud                       nOFFSET_INTERIM4x4_4:ud         {NoDDClr}
  88.         mov (1)         pREF0D:ud                       nOFFSET_INTERIM4x4_7:ud         {NoDDChk,NoDDClr}
  89.         mov (1)         pREF2D:ud                       nOFFSET_INTERIM4x4_8:ud         {NoDDChk,NoDDClr}
  90.         mov (1)         pREF4D:ud                       nOFFSET_INTERIM4x4_9:ud         {NoDDChk}
  91.  
  92.         add (16)        acc0<1>:w                       gwINTERIM4x4_BUF(0)<16;16,1>            512:w
  93.         mac (16)        acc0<1>:w                       gwINTERIM4x4_BUF(1)<16;16,1>            -5:w
  94.         mac (16)        acc0<1>:w                       r[pREF6,0]<8,1>:w                               20:w
  95.        
  96.         (f0.0) mov (1) pRES:uw                  nOFFSET_RES:uw                                  // Case a
  97.         (-f0.0) mov (1) pRES:uw                 nOFFSET_INTERIM4x4:uw                           // Case 69be
  98.        
  99.         mac (16)        acc0<1>:w                       r[pREF0,0]<4,1>:w                               -5:w
  100.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB]<4,1>:w                 1:w
  101.         mac (16)        acc0<1>:w                       r[pREF2,0]<4,1>:w                               20:w   
  102.         asr.sat (16) r[pRES]<2>:ub              acc0<16;16,1>:w                                 10:w  
  103.        
  104.         (f0.0) jmpi INTERLABEL(Return_Interpolate_Y_4x4)
  105.  
  106. INTERLABEL(Interpolate_Y_H_4x4):
  107.        
  108.         cmp.e.f0.0 (1) null                             gMVX_FRAC:w                                             0:w
  109.         cmp.e.f0.1 (1) null                             gMVY_FRAC:w                                             2:w
  110.         (f0.0) jmpi INTERLABEL(Interpolate_Y_V_4x4)
  111.         (f0.1) jmpi INTERLABEL(Interpolate_Y_V_4x4)
  112.  
  113.         //-----------------------------------------------------------------------
  114.         // CASE: 123567DEF (H interpolation)
  115.         //-----------------------------------------------------------------------
  116.        
  117.         add (4)         pREF0<1>:uw                     gW0<4;4,1>:uw                                   -2:w           
  118.         cmp.g.f0.0 (4) null:w                   gMVY_FRAC<0;1,0>:w                              2:w
  119.         cmp.e.f0.1 (1) null                             gMVX_FRAC:w                                             2:w
  120.         (f0.0) add (4) pREF0<1>:uw              pREF0<4;4,1>:uw                                 nGRFWIB/2:uw
  121.        
  122.         cmp.e.f0.0 (1) null:w                   gMVY_FRAC<0;1,0>:w                              0:w
  123.  
  124.         (f0.1) mov (1) pRESULT:uw               nOFFSET_RES:uw                                  // Case 26E
  125.         (-f0.1) mov (1) pRESULT:uw              nOFFSET_INTERIM4x4:uw                   // Case 1357DF
  126.        
  127.         // Compute interim/output horizontal interpolation
  128.         add (16)        acc0<1>:w                       r[pREF0]<4,1>:ub                                16:w
  129.         mac (16)        acc0<1>:w                       r[pREF0,1]<4,1>:ub                              -5:w
  130.         mac (16)        acc0<1>:w                       r[pREF0,2]<4,1>:ub                              20:w
  131.         mac (16)        acc0<1>:w                       r[pREF0,3]<4,1>:ub                              20:w
  132.         mac (16)        acc0<1>:w                       r[pREF0,4]<4,1>:ub                              -5:w
  133.         mac (16)        acc0<1>:w                       r[pREF0,5]<4,1>:ub                              1:w
  134.         asr.sat (16) r[pRESULT]<2>:ub   acc0<16;16,1>:w                                 5:w
  135.        
  136.         (-f0.1) jmpi INTERLABEL(Interpolate_Y_V_4x4)
  137.         (-f0.0) jmpi INTERLABEL(Average_4x4)
  138.        
  139.         jmpi INTERLABEL(Return_Interpolate_Y_4x4)
  140.  
  141. INTERLABEL(Interpolate_Y_V_4x4):
  142.  
  143.         cmp.e.f0.0 (1) null                             gMVY_FRAC:w                                             0:w
  144.         (f0.0) jmpi INTERLABEL(Interpolate_Y_I_4x4)
  145.        
  146.         //-----------------------------------------------------------------------
  147.         // CASE: 48C59D7BF (V interpolation)
  148.         //-----------------------------------------------------------------------
  149.        
  150.         cmp.g.f0.1 (8) null:w                   gMVX_FRAC<0;1,0>:w                              2:w
  151.  
  152.         mov (4)         pREF0<1>:uw                     gW0<4;4,1>:uw                                                   {NoDDClr}
  153.         add (4)         pREF4<1>:w                      gW0<4;4,1>:uw                                   16:w    {NoDDChk}
  154.        
  155.         (f0.1) add (8) pREF0<1>:uw              pREF0<4;4,1>:uw                                 1:uw
  156.  
  157.         cmp.e.f0.0 (1) null:w                   gMVX_FRAC<0;1,0>:w                              0:w
  158.         cmp.e.f0.1 (1) null                             gMVY_FRAC:w                                             2:w
  159.  
  160.         // Compute interim/output vertical interpolation
  161.         add (16)        acc0<1>:w                       r[pREF0,-nGRFWIB]<4,1>:ub               16:w
  162.         mac (16)        acc0<1>:w                       r[pREF0]<4,1>:ub                                20:w
  163.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB]<4,1>:ub                -5:w
  164.         mac (16)        acc0<1>:w                       r[pREF4,-nGRFWIB]<4,1>:ub               -5:w
  165.         mac (16)        acc0<1>:w                       r[pREF4]<4,1>:ub                                20:w   
  166.         mac (16)        acc0<1>:w                       r[pREF4,nGRFWIB]<4,1>:ub                1:w
  167.        
  168.         mov (1)         pRESULT:uw                      nOFFSET_RES:uw
  169.         (-f0.0) jmpi INTERLABEL(VFILTER_4x4)
  170.         (-f0.1) mov (1) pRESULT:uw              nOFFSET_INTERIM4x4:uw
  171.  
  172.  INTERLABEL(VFILTER_4x4):
  173.  
  174.         asr.sat (16) r[pRESULT]<2>:ub   acc0<16;16,1>:w                                 5:w
  175.        
  176.         (-f0.0) jmpi INTERLABEL(Average_4x4)
  177.         (f0.1) jmpi INTERLABEL(Return_Interpolate_Y_4x4 )
  178.  
  179. INTERLABEL(Interpolate_Y_I_4x4):
  180.  
  181.         //-----------------------------------------------------------------------
  182.         // CASE: 134C (Integer position)
  183.         //-----------------------------------------------------------------------
  184.        
  185.         mov (4)         pREF0<1>:uw                     gW0<4;4,1>:uw
  186.                
  187.         cmp.e.f0.0 (4) null:w                   gMVX_FRAC<0;1,0>:w                              3:w
  188.         cmp.e.f0.1 (4) null:w                   gMVY_FRAC<0;1,0>:w                              3:w
  189.         (f0.0) add (4) pREF0<1>:uw              pREF0<4;4,1>:uw                                 1:uw
  190.         (f0.1) add (4) pREF0<1>:uw              pREF0<4;4,1>:uw                                 nGRFWIB/2:uw
  191.        
  192.         mov (16)        guwINTERIM_BUF2(0)<1>   r[pREF0]<4,1>:ub
  193.        
  194. INTERLABEL(Average_4x4):
  195.  
  196.         //-----------------------------------------------------------------------
  197.         // CASE: 13456789BCDEF (Average)
  198.         //-----------------------------------------------------------------------
  199.        
  200.         // Average two interim results
  201.         avg.sat (16) gubINTERIM_BUF2(0)<2>      gubINTERIM_BUF2(0)<32;16,2>             gINTERIM4x4<32;16,2>:ub
  202.  
  203. INTERLABEL(Return_Interpolate_Y_4x4):
  204.         // Move result
  205.         mov (1)         pRES:uw                         gpINTPY:uw
  206.         mov (4)         r[pRES,0]<2>:ub         gubINTERIM_BUF2(0,0)
  207.         mov (4)         r[pRES,16]<2>:ub        gubINTERIM_BUF2(0,8)
  208.         mov (4)         r[pRES,32]<2>:ub        gubINTERIM_BUF2(0,16)
  209.         mov (4)         r[pRES,48]<2>:ub        gubINTERIM_BUF2(0,24)
  210.  
  211.         // Restore all address registers
  212.         mov (8)         a0<1>:w                                 gpADDR<8;8,1>:w
  213.        
  214. INTERLABEL(Exit_Interpolate_Y_4x4):
  215.        
  216.        
  217. // end of file
  218.