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.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the
  7.  * "Software"), to deal in the Software without restriction, including
  8.  * without limitation the rights to use, copy, modify, merge, publish,
  9.  * distribute, sub license, and/or sell copies of the Software, and to
  10.  * permit persons to whom the Software is furnished to do so, subject to
  11.  * the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice (including the
  14.  * next paragraph) shall be included in all copies or substantial portions
  15.  * of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  20.  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
  21.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  22.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  23.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24.  *
  25.  * This file was originally licensed under the following license
  26.  *
  27.  *  Licensed under the Apache License, Version 2.0 (the "License");
  28.  *  you may not use this file except in compliance with the License.
  29.  *  You may obtain a copy of the License at
  30.  *
  31.  *      http://www.apache.org/licenses/LICENSE-2.0
  32.  *
  33.  *  Unless required by applicable law or agreed to in writing, software
  34.  *  distributed under the License is distributed on an "AS IS" BASIS,
  35.  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  36.  *  See the License for the specific language governing permissions and
  37.  *  limitations under the License.
  38.  *
  39.  */
  40. // Kernel name: Interpolate_Y_8x8.asm
  41. //
  42. // Interpolation kernel for luminance motion compensation
  43. //
  44. //  $Revision: 13 $
  45. //  $Date: 10/09/06 4:00p $
  46. //
  47.  
  48.  
  49. //---------------------------------------------------------------
  50. // In: pMV => Source address of MV
  51. // In: gMVX_FRAC<2;2,1>:w => MV fractional components
  52. // In: f0.1 (1) => If 1, vertical MV is integer
  53. // In: gpINTPY:uw => Destination address for interpolated result
  54. // In: Reference area staring from R43
  55. //              If horizontal/vertical MVs are all integer, 8x8 pixels are on R43~R44 (2 GRFs)
  56. //              If only horz MV is integer, 8x13 pixels are on R43~R46 (4 GRFs)
  57. //              If only vert MV is integer, 13x8 pixels are on R43~R46 (4 GRFs)
  58. //              If no MVs are integer, 13x13 pixels are on R43~R49 (7 GRFs)
  59. //---------------------------------------------------------------
  60.  
  61.  
  62. INTERLABEL(Interpolate_Y_8x8_Func):
  63.  
  64.  
  65.  
  66.         // Check whether MVX is integer MV
  67.         and.z.f0.0 (1) null:w                   r[pMV,0]<0;1,0>:w                               0x3:w
  68.         (-f0.0) jmpi (1) INTERLABEL(Interpolate_Y_8x8_Func2)
  69.                
  70.         // TODO: remove this back-to-back read - huge latency..
  71.         mov (8) gubREF(6,2)<1>  gubREF(3,0)<8;8,1>
  72.     mov (8)     gubREF(5,18)<1> gubREF(2,24)<8;8,1>             {NoDDClr}
  73.         mov (8) gubREF(5,2)<1>  gubREF(2,16)<8;8,1>             {NoDDChk}
  74.         mov (8) gubREF(4,18)<1> gubREF(2,8)<8;8,1>              {NoDDClr}
  75.         mov (8) gubREF(4,2)<1>  gubREF(2,0)<8;8,1>              {NoDDChk}
  76.         mov (8) gubREF(3,18)<1> gubREF(1,24)<8;8,1>             {NoDDClr}
  77.         mov (8) gubREF(3,2)<1>  gubREF(1,16)<8;8,1>             {NoDDChk}
  78.         mov (8) gubREF(2,18)<1> gubREF(1,8)<8;8,1>              {NoDDClr}
  79.         mov (8) gubREF(2,2)<1>  gubREF(1,0)<8;8,1>              {NoDDChk}
  80.         mov (8) gubREF(1,18)<1> gubREF(0,24)<8;8,1>             {NoDDClr}
  81.         mov (8) gubREF(1,2)<1>  gubREF(0,16)<8;8,1>             {NoDDChk}
  82.         mov (8) gubREF(0,18)<1> gubREF(0,8)<8;8,1>     
  83.     mov (8)     gubREF(0,2)<1>  gubREF(0,0)<8;8,1>
  84.  
  85. INTERLABEL(Interpolate_Y_8x8_Func2):
  86.  
  87.         // Compute the GRF address of the starting position of the reference area
  88.     (-f0.1) mov (1)     pREF:w                  nOFFSET_REF+2+nGRFWIB:w
  89.     (f0.1) mov (1)      pREF:w                  nOFFSET_REF+2:w                
  90.         mov (1)         pRESULT:uw                      gpINTPY:uw     
  91.        
  92.         /*
  93.          *                       |               |
  94.          *               - - 0 1 2 3 + -
  95.          *                       4 5 6 7
  96.          *                       8 9 A B
  97.          *                       C D E F
  98.          *               - - + - - - + -
  99.      *                   |               |
  100.          */
  101.        
  102.         // Case 0
  103.         or.z.f0.1 (16) null:w                   gMVY_FRAC<0;1,0>:w                              gMVX_FRAC<0;1,0>:w     
  104.         (f0.1) mov (16) r[pRESULT]<1>:uw                                r[pREF]<16;8,1>:ub
  105.         (f0.1) mov (16) r[pRESULT,nGRFWIB]<1>:uw                r[pREF,nGRFWIB]<16;8,1>:ub
  106.         (f0.1) mov (16) r[pRESULT,nGRFWIB*2]<1>:uw              r[pREF,nGRFWIB*2]<16;8,1>:ub
  107.         (f0.1) mov (16) r[pRESULT,nGRFWIB*3]<1>:uw              r[pREF,nGRFWIB*3]<16;8,1>:ub
  108.         (f0.1) jmpi INTERLABEL(Exit_Interpolate_Y_8x8)
  109.        
  110.         // Store all address registers
  111.         mov (8)         gpADDR<1>:w                     a0<8;8,1>:w
  112.        
  113.         mul.z.f0.0 (1) gW4:w                    gMVY_FRAC:w                                             gMVX_FRAC:w
  114.         add (1)         pREF1:uw                        pREF0:uw                                                nGRFWIB/2:uw
  115.         and.nz.f0.1 (1) null                    gW4:w                                                   1:w
  116.         add (2)         pREF2<1>:uw                     pREF0<2;2,1>:uw                                 nGRFWIB:uw
  117.         mov (4)         gW0<1>:uw                       pREF0<4;4,1>:uw
  118.  
  119.         (f0.0) jmpi INTERLABEL(Interpolate_Y_H_8x8)
  120.         (f0.1) jmpi INTERLABEL(Interpolate_Y_H_8x8)
  121.        
  122.         //-----------------------------------------------------------------------
  123.         // CASE: A69BE (H/V interpolation)
  124.         //-----------------------------------------------------------------------
  125.        
  126.         // Compute interim horizontal intepolation of 12 lines (not 9 lines)
  127. //      add (1)         pREF0<1>:ud                     pREF0<0;1,0>:ud                                 0xffeeffde:ud   // (-18<<16)|(-34)
  128.         add (1)         pREF0<1>:uw                     pREF0<0;1,0>:uw                                 -34:w  
  129.         add (1)         pREF1<1>:uw                     pREF1<0;1,0>:uw                                 -18:w {NoDDClr}
  130.         mov (1)         pRESD:ud                        nOFFSET_INTERIM3:ud                                     {NoDDChk}                      
  131.        
  132.         // Check whether this position is 'A'    
  133.         cmp.e.f0.0 (1) null                             gW4:w                                                   4:w
  134.        
  135.         $for(0;<6;2) {
  136.         add (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1]<16;8,1>:ub                   r[pREF0,nGRFWIB*%1+5]<16;8,1>:ub                {Compr}
  137.         mac (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1+1]<16;8,1>:ub                 -5:w    {Compr}
  138.         mac (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1+2]<16;8,1>:ub                 20:w    {Compr}
  139.         mac (32)        acc0<1>:w                       r[pREF,nGRFWIB*%1+3]<16;8,1>:ub                 20:w    {Compr}
  140.         mac (32)        r[pRES,nGRFWIB*%1]<1>:w         r[pREF,nGRFWIB*%1+4]<16;8,1>:ub -5:w    {Compr}
  141.         }
  142.         // last line
  143.         add (8)         acc0<1>:w                       r[pREF,nGRFWIB*6]<8;8,1>:ub                             r[pREF,nGRFWIB*6+5]<8;8,1>:ub
  144.         mac (8)         acc0<1>:w                       r[pREF,nGRFWIB*6+1]<8;8,1>:ub                   -5:w
  145.         mac (8)         acc0<1>:w                       r[pREF,nGRFWIB*6+2]<8;8,1>:ub                   20:w
  146.         mac (8)         acc0<1>:w                       r[pREF,nGRFWIB*6+3]<8;8,1>:ub                   20:w
  147.         mac (8)         r[pRES,nGRFWIB*6]<1>:w          r[pREF,nGRFWIB*6+4]<8;8,1>:ub   -5:w
  148.  
  149.     // Compute interim/output vertical interpolation
  150.     mov (1)             pREF0:ud                        nOFFSET_INTERIM2:ud     {NoDDClr}                       // set pREF0 and pREF1 at the same time
  151.         mov (1)         pREF2D:ud                       nOFFSET_INTERIM4:ud     {NoDDChk,NoDDClr}       // set pREF2 and pREF3 at the same time
  152.         (f0.0) sel (1) pRES:uw                  gpINTPY:uw      nOFFSET_INTERIM:uw {NoDDChk} // Case A vs. 69BE
  153.    
  154.         $for(0;<4;2) {
  155.         add (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1]<16;16,1>:w                          512:w   {Compr}
  156.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1]<8,1>:w                                      -5:w
  157.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:w                      -5:w
  158.         mac (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+nGRFWIB]<16;16,1>:w          20:w    {Compr}
  159.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:w                      20:w   
  160.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB+nGRFWIB]<8,1>:w      20:w   
  161.         mac (32)        acc0<1>:w                       r[pREF0,(2+%1)*nGRFWIB]<16;16,1>:w                      -5:w    {Compr}
  162.         mac (16)        acc0<1>:w                       r[pREF2,(2+%1)*nGRFWIB]<8,1>:w                          1:w
  163.         mac (16)        acc1<1>:w                       r[pREF2,(2+%1)*nGRFWIB+nGRFWIB]<8,1>:w          1:w
  164.         asr.sat (16) r[pRES,nGRFWIB*%1]<2>:ub                   acc0<16;16,1>:w                         10:w
  165.         asr.sat (16) r[pRES,nGRFWIB*%1+nGRFWIB]<2>:ub   acc1<16;16,1>:w                         10:w {SecHalf}
  166.         }
  167.        
  168.         (f0.0) jmpi INTERLABEL(Return_Interpolate_Y_8x8)
  169.        
  170. INTERLABEL(Interpolate_Y_H_8x8):
  171.        
  172.         cmp.e.f0.0 (1) null                             gMVX_FRAC:w                                             0:w
  173.         cmp.e.f0.1 (1) null                             gMVY_FRAC:w                                             2:w
  174.         (f0.0) jmpi INTERLABEL(Interpolate_Y_V_8x8)
  175.         (f0.1) jmpi INTERLABEL(Interpolate_Y_V_8x8)
  176.        
  177.         //-----------------------------------------------------------------------
  178.         // CASE: 123567DEF (H interpolation)
  179.         //-----------------------------------------------------------------------
  180.  
  181.         add (4)         pREF0<1>:uw                     gW0<4;4,1>:uw                                   -2:w           
  182.         cmp.g.f0.0 (4) null:w                   gMVY_FRAC<0;1,0>:w                              2:w
  183.         cmp.e.f0.1 (1) null                             gMVX_FRAC:w                                             2:w
  184.         (f0.0) add (4) pREF0<1>:uw              pREF0<4;4,1>:uw                                 nGRFWIB/2:uw
  185.  
  186.         cmp.e.f0.0 (1) null:w                   gMVY_FRAC<0;1,0>:w                              0:w
  187.  
  188.         (f0.1) sel (1) pRES:uw                  gpINTPY:uw                                              nOFFSET_INTERIM:uw // Case 26E vs. 1357DF
  189.        
  190.         // Compute interim/output horizontal interpolation
  191.         $for(0;<4;2) {
  192.         add (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1]<8,1>:ub                             16:w
  193.         add (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+nGRFWIB]<8,1>:ub             16:w
  194.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+1]<8,1>:ub                   -5:w
  195.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+1+nGRFWIB]<8,1>:ub   -5:w
  196.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+2]<8,1>:ub                   20:w
  197.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+2+nGRFWIB]<8,1>:ub   20:w
  198.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+3]<8,1>:ub                   20:w
  199.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+3+nGRFWIB]<8,1>:ub   20:w
  200.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+4]<8,1>:ub                   -5:w
  201.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+4+nGRFWIB]<8,1>:ub   -5:w
  202.         mac (16)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+5]<8,1>:ub                   1:w
  203.         mac (16)        acc1<1>:w                       r[pREF0,nGRFWIB*%1+5+nGRFWIB]<8,1>:ub   1:w
  204.         asr.sat (16) r[pRES,nGRFWIB*%1]<2>:ub                   acc0<16;16,1>:w         5:w
  205.         asr.sat (16) r[pRES,nGRFWIB*%1+nGRFWIB]<2>:ub   acc1<16;16,1>:w         5:w {SecHalf}
  206.     }
  207.    
  208.     (-f0.1) jmpi INTERLABEL(Interpolate_Y_V_8x8)
  209.         (-f0.0) jmpi INTERLABEL(Average_8x8)
  210.        
  211.         jmpi INTERLABEL(Return_Interpolate_Y_8x8)
  212.  
  213. INTERLABEL(Interpolate_Y_V_8x8):
  214.  
  215.         cmp.e.f0.0 (1) null                             gMVY_FRAC:w                                             0:w
  216.         (f0.0) jmpi INTERLABEL(Interpolate_Y_I_8x8)
  217.        
  218.         //-----------------------------------------------------------------------
  219.         // CASE: 48C59D7BF (V interpolation)
  220.         //-----------------------------------------------------------------------
  221.  
  222.         mov (2)         pREF0<1>:uw                     gW0<4;2,2>:uw   {NoDDClr}
  223.         mov (2)         pREF2<1>:uw                     gW1<2;2,1>:uw   {NoDDChk,NoDDClr}
  224.         mov (1)         pRES:uw                         gpINTPY:uw              {NoDDChk}
  225.  
  226.         cmp.g.f0.1 (4) null:w                   gMVX_FRAC<0;1,0>:w                              2:w
  227.         cmp.e.f0.0 (1) null:w                   gMVX_FRAC<0;1,0>:w                              0:w
  228.         (f0.1) add (4) pREF0<1>:uw              pREF0<4;4,1>:uw                                 1:uw
  229.  
  230.         cmp.e.f0.1 (1) null                             gMVY_FRAC:w                                             2:w
  231.         (-f0.0) jmpi INTERLABEL(VFILTER_8x8)
  232.         (-f0.1) mov (1) pRES:uw         nOFFSET_INTERIM:uw
  233.        
  234.   INTERLABEL(VFILTER_8x8):
  235.  
  236.         // Compute interim/output vertical interpolation
  237.         $for(0;<4;2) {
  238.         add (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1-nGRFWIB]<16;8,1>:ub                  16:w {Compr}
  239.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1-nGRFWIB]<8,1>:ub                             -5:w
  240.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1]<8,1>:ub                                             -5:w
  241.         mac (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1]<16;8,1>:ub                                  20:w {Compr}
  242.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1]<8,1>:ub                                             20:w   
  243.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:ub                             20:w   
  244.         mac (32)        acc0<1>:w                       r[pREF0,nGRFWIB*%1+nGRFWIB]<16;8,1>:ub                  -5:w {Compr}
  245.         mac (16)        acc0<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB]<8,1>:ub                             1:w
  246.         mac (16)        acc1<1>:w                       r[pREF2,nGRFWIB*%1+nGRFWIB+nGRFWIB]<8,1>:ub             1:w
  247.         asr.sat (16) r[pRES,nGRFWIB*%1]<2>:ub                   acc0<16;16,1>:w                                 5:w
  248.         asr.sat (16) r[pRES,nGRFWIB*%1+nGRFWIB]<2>:ub   acc1<16;16,1>:w                                 5:w     {SecHalf}
  249.         }
  250.  
  251.         (-f0.0) jmpi INTERLABEL(Average_8x8)
  252.         (f0.1) jmpi INTERLABEL(Return_Interpolate_Y_8x8)
  253.  
  254. INTERLABEL(Interpolate_Y_I_8x8):
  255.  
  256.         //-----------------------------------------------------------------------
  257.         // CASE: 134C (Integer position)
  258.         //-----------------------------------------------------------------------
  259.        
  260.         mov (2)         pREF0<1>:uw                     gW0<2;2,1>:uw           {NoDDClr}
  261.                        
  262.         mov (1)         pRES:uw                         gpINTPY:uw                      {NoDDChk}
  263.  
  264.         cmp.e.f0.0 (2) null:w                   gMVX_FRAC<0;1,0>:w                              3:w
  265.         cmp.e.f0.1 (2) null:w                   gMVY_FRAC<0;1,0>:w                              3:w
  266.         (f0.0) add (2) pREF0<1>:uw              pREF0<2;2,1>:uw                                 1:uw
  267.         (f0.1) add (2) pREF0<1>:uw              pREF0<2;2,1>:uw                                 nGRFWIB/2:uw
  268.        
  269.         mov (16)        r[pRES]<1>:uw                   r[pREF0]<8,1>:ub
  270.         mov (16)        r[pRES,nGRFWIB]<1>:uw   r[pREF0,nGRFWIB]<8,1>:ub
  271.         mov (16)        r[pRES,nGRFWIB*2]<1>:uw r[pREF0,nGRFWIB*2]<8,1>:ub
  272.         mov (16)        r[pRES,nGRFWIB*3]<1>:uw r[pREF0,nGRFWIB*3]<8,1>:ub
  273.        
  274. INTERLABEL(Average_8x8):
  275.  
  276.         //-----------------------------------------------------------------------
  277.         // CASE: 13456789BCDEF (Average)
  278.         //-----------------------------------------------------------------------
  279.  
  280.         // Average two interim results
  281.         avg.sat (16) r[pRES,0]<2>:ub                    r[pRES,0]<32;16,2>:ub                   gubINTERIM_BUF(0)      
  282.         avg.sat (16) r[pRES,nGRFWIB]<2>:ub              r[pRES,nGRFWIB]<32;16,2>:ub             gubINTERIM_BUF(1)      
  283.         avg.sat (16) r[pRES,nGRFWIB*2]<2>:ub    r[pRES,nGRFWIB*2]<32;16,2>:ub   gubINTERIM_BUF(2)      
  284.         avg.sat (16) r[pRES,nGRFWIB*3]<2>:ub    r[pRES,nGRFWIB*3]<32;16,2>:ub   gubINTERIM_BUF(3)      
  285.  
  286. INTERLABEL(Return_Interpolate_Y_8x8):
  287.         // Restore all address registers
  288.         mov (8)         a0<1>:w                                 gpADDR<8;8,1>:w
  289.        
  290. INTERLABEL(Exit_Interpolate_Y_8x8):
  291.                
  292. // end of file
  293.