Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Weighted prediction of luminance and chrominance
  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: WeightedPred.asm
  11. //
  12. // Weighted prediction of luminance and chrominance
  13. //
  14.  
  15.  
  16. //#if !defined(__WeightedPred__)                // Make sure this is only included once
  17. //#define __WeightedPred__
  18.  
  19.  
  20.         and.z.f0.0 (1) gWEIGHTFLAG:w    gWPREDFLAG:ub                                   nWBIDIR_MASK:w
  21.         cmp.e.f0.1 (1) null:w                   gPREDFLAG:w                                             2:w
  22.         (-f0.0) jmpi INTERLABEL(WeightedPred)
  23.         (f0.1) jmpi INTERLABEL(DefaultWeightedPred_BiPred)
  24.        
  25. INTERLABEL(DefaultWeightedPred_UniPred):
  26.  
  27.         cmp.e.f0.0 (1) null:w                   gPREDFLAG:w                                             0:w
  28.         (f0.0) jmpi INTERLABEL(Return_WeightedPred)
  29.  
  30.         // luma
  31.         mov (32)        gubYPRED(0)<2>          gubINTPY1(0)    {Compr}
  32.         mov (32)        gubYPRED(2)<2>          gubINTPY1(2)    {Compr}
  33.  
  34. #ifndef MONO
  35.         // chroma      
  36.         mov (32)        gubCPRED(0)<2>          gubINTPC1(0)    {Compr}
  37. #endif
  38.  
  39.         jmpi INTERLABEL(Return_WeightedPred)
  40.        
  41. INTERLABEL(DefaultWeightedPred_BiPred):
  42.  
  43.         // luma
  44.         avg.sat (32) gubYPRED(0)<2>             gubINTPY0(0)                                    gubINTPY1(0)    {Compr}
  45.         avg.sat (32) gubYPRED(2)<2>             gubINTPY0(2)                                    gubINTPY1(2)    {Compr}
  46.        
  47. #ifndef MONO
  48.         // chroma
  49.         avg.sat (32) gubCPRED(0)<2>             gubINTPC0(0)                                    gubINTPC1(0)    {Compr}
  50. #endif
  51.        
  52.         jmpi INTERLABEL(Return_WeightedPred)
  53.        
  54. INTERLABEL(WeightedPred):
  55.         cmp.e.f0.1 (1) null:w                   gWEIGHTFLAG:w                                   0x80:w
  56.         (-f0.1) jmpi INTERLABEL(WeightedPred_Explicit)
  57.        
  58.         cmp.e.f0.0 (1) null:w                   gPREDFLAG:w                                             2:w
  59.         (-f0.0) jmpi INTERLABEL(DefaultWeightedPred_UniPred)
  60.  
  61.         mov (2)         gYADD<1>:w                      32:w                                                            {NoDDClr}      
  62.         mov (2)         gYSHIFT<1>:w            6:w                                                                     {NoDDChk}
  63.         mov (4)         gOFFSET<1>:w            0:w
  64.         mov (8)         gWT0<2>:w                       r[pWGT,0]<0;2,1>:w
  65.        
  66.         jmpi INTERLABEL(WeightedPred_LOOP)
  67.        
  68.         // Explicit Prediction
  69. INTERLABEL(WeightedPred_Explicit):
  70.        
  71.         // WA for weighted prediction - 2007/09/06     
  72. #ifdef  SW_W_128                // CTG SW WA
  73.         cmp.e.f0.1 (8) null:ud                  r[pWGT,0]<8;8,1>:uw                             gudW128(0)<0;1,0>
  74. #else                                   // ILK HW solution
  75.         and.ne.f0.1 (8) null:uw                 r[pWGT,12]<0;1,0>:ub                    0x88848421:v    // Expand W=128 flag to all components. 2 MSB are don't care
  76. #endif 
  77.         asr.nz.f0.0 (2) gBIPRED<1>:w    gPREDFLAG<0;1,0>:w                              1:w
  78.         asr (1)         gWEIGHTFLAG:w           gWEIGHTFLAG:w                                   6:w    
  79.         (-f0.0) mov (2) gPREDFLAG1<1>:w gPREDFLAG<0;1,0>:w                                                             
  80.         (f0.0) mov (2)  gPREDFLAG0<1>:ud 0x00010001:ud
  81.         (-f0.0) add (2) gPREDFLAG0<1>:w -gPREDFLAG1<2;2,1>:w                    1:w
  82.        
  83.         // WA for weighted prediction - 2007/09/06     
  84.         (f0.1) mov (8)  gWT0<1>:ud              0x00000080:ud
  85.         (-f0.1) mov (8) gWT0<2>:w               r[pWGT,0]<16;8,2>:b
  86.         (-f0.1) mov (8) gO0<2>:w                r[pWGT,1]<16;8,2>:b
  87.         mul (16)                gWT0<1>:w               gWT0<16;16,1>:w                                 gPREDFLAG0<0;4,1>:w
  88.  
  89.         // Compute addition
  90.         cmp.e.f0.1 (2) null<1>:w                gYWDENOM<2;2,1>:ub                              0:w
  91.         (-f0.1) shl (2) gW0<1>:w                gWEIGHTFLAG<0;1,0>:w                    gYWDENOM<2;2,1>:ub
  92.         (f0.1) mov (2) gW0<1>:w                 0:w
  93.         (-f0.1) asr (2) gW0<1>:w                gW0<2;2,1>:w                                    1:w
  94.         shl (2)         gYADD<1>:w                      gW0<2;2,1>:w                                    gBIPRED<0;1,0>:w
  95.         (f0.1) add (2)  gYADD<1>:w              gYADD<2;2,1>:w                                  gBIPRED<0;1,0>:w
  96.        
  97.         // Compute shift
  98.         add (2)         gYSHIFT<1>:w            gYWDENOM<2;2,1>:ub                              gBIPRED<0;1,0>:w
  99.        
  100.         // Compute offset
  101.         add (4)         acc0<1>:w                       gO0<16;4,4>:w                                   gO1<16;4,4>:w
  102.         add (4)         acc0<1>:w                       acc0<4;4,1>:w                                   gBIPRED<0;1,0>:w
  103.         asr (4)         gOFFSET<1>:w            acc0<4;4,1>:w                                   gBIPRED<0;1,0>:w
  104.  
  105. INTERLABEL(WeightedPred_LOOP): 
  106.         // luma
  107.         $for(0;<4;2) { 
  108.         mul (16)        acc0<1>:w                       gubINTPY0(%1)                                   gWT0<0;1,0>:w
  109.         mul (16)        acc1<1>:w                       gubINTPY0(%1+1)                                 gWT0<0;1,0>:w
  110.         mac (16)        acc0<1>:w                       gubINTPY1(%1)                                   gWT1<0;1,0>:w
  111.         mac (16)        acc1<1>:w                       gubINTPY1(%1+1)                                 gWT1<0;1,0>:w
  112.         add (16)        acc0<1>:w                       acc0<16;16,1>:w                                 gYADD:w
  113.         add (16)        acc1<1>:w                       acc1<16;16,1>:w                                 gYADD:w
  114.         // Accumulator cannot be used as destination for ASR
  115.         asr (16)        gwINTERIM_BUF3(0)<1> acc0<16;16,1>:w                            gYSHIFT:w
  116.         asr (16)        gwINTERIM_BUF3(1)<1> acc1<16;16,1>:w                            gYSHIFT:w
  117.         add.sat (16) gubYPRED(%1)<2>    gwINTERIM_BUF3(0)                               gOFFSET:w
  118.         add.sat (16) gubYPRED(%1+1)<2>  gwINTERIM_BUF3(1)                               gOFFSET:w
  119.         }      
  120.  
  121. #ifndef MONO
  122.         // chroma
  123.         mul (16)        acc0<1>:w                       gubINTPC0(0)                                    gUW0<0;2,4>:w
  124.         mul (16)        acc1<1>:w                       gubINTPC0(1)                                    gUW0<0;2,4>:w
  125.         mac (16)        acc0<1>:w                       gubINTPC1(0)                                    gUW1<0;2,4>:w
  126.         mac (16)        acc1<1>:w                       gubINTPC1(1)                                    gUW1<0;2,4>:w
  127.         add (16)        acc0<1>:w                       acc0<16;16,1>:w                                 gCADD:w
  128.         add (16)        acc1<1>:w                       acc1<16;16,1>:w                                 gCADD:w
  129.         // Accumulator cannot be used as destination for ASR
  130.         asr (16)        gwINTERIM_BUF3(0)<1> acc0<16;16,1>:w                            gCSHIFT:w
  131.         asr (16)        gwINTERIM_BUF3(1)<1> acc1<16;16,1>:w                            gCSHIFT:w
  132.         add.sat (16) gubCPRED(0)<2>             gwINTERIM_BUF3(0)                               gUOFFSET<0;2,1>:w
  133.         add.sat (16) gubCPRED(1)<2>             gwINTERIM_BUF3(1)                               gUOFFSET<0;2,1>:w
  134. #endif
  135.  
  136.  
  137. INTERLABEL(Return_WeightedPred):
  138.  
  139.        
  140. //#endif        // !defined(__WeightedPred__)
  141.