Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * All Video Processing kernels
  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.  * Authors:
  40.  *    Halley Zhao <halley.zhao@intel.com>
  41.  */
  42.  
  43. // Module name: YUVX_Save_RGBX_Float.asm
  44. //----------------------------------------------------------------
  45.  
  46. #include "RGBX_Load_16x8.inc"
  47.  
  48. #if (0)
  49.     // 8 grf reg for one row of pixel (2 pixel per grf)
  50.     #define nTEMP0          34
  51.     #define nTEMP1          35
  52.     #define nTEMP2          36
  53.     #define nTEMP3          37
  54.     #define nTEMP4          38
  55.     #define nTEMP5          39
  56.     #define nTEMP6          40
  57.     #define nTEMP7          41
  58.    
  59.     #define nTEMP8          42        // transformation coefficient
  60.     #define nTEMP10         44        // transformation coefficient
  61.    
  62.     #define nTEMP12         46        // save Y/U/V in ub format
  63.     #define nTEMP14         48        // save YUV in ud format
  64.     #define nTEMP16         50        // dp4 result
  65.     #define nTEMP17         51        
  66.     #define nTEMP18         52       // temp used for repeat U/V in NV12_Load_8x4.asm
  67.    
  68.     #define nTEMP24         58       // it is not safe to use in my case. I try to use it for repeat U/V in NV12_Load_8x4.asm, Y data is taint in row 4/5
  69. #endif
  70.  
  71. #define ONE_ROW_DEBUG                      0
  72.  
  73. #if (ONE_ROW_DEBUG)
  74.     // if you want to debug a row which is not the first one, try the following:
  75.     // 1. define ROW_NUM_READ to the row you want to debug
  76.     // 2. ROW_NUM_WRITE can be same to DBG_ROWNUM_READ to overwrite original YUV data, or define it to a new row
  77.     // 3. change (DBG_ROWNUM_BASE+?)=ROW_NUM_READ or ROW_NUM_WRITE to DBG_ROWNUM_0, to not conflict with others
  78.     #define ROW_NUM_READ                   0
  79.     #define ROW_NUM_WRITE                  0
  80.     #define DBG_ROWNUM_BASE                1
  81.     #define DBG_ROWNUM_0                   0
  82. #else
  83.     #define ROW_NUM_READ                   %1
  84.     #define ROW_NUM_WRITE                  %1
  85.     $for(0; <nY_NUM_OF_ROWS; 1) {
  86. #endif    
  87.     // YUVX | Y | U | V | X |
  88.     // XRGB | B | G | R | X |
  89.     // ###### save one row of pixel to temp grf with float format (required by dp4)
  90.     // C = Y' - 16          D = U - 128         E = V - 128
  91.  
  92.    // the follow sentence doesn't work, I have to split it into two step
  93.     // add (4) REG(r, nTEMP0)<1>:f       r[SRC_RGBA_OFFSET_1,ROW_NUM_READ*32 +  0]<4,1>:ub           REG2(r, nTEMP10,  16)<0;4,1>:b
  94.  
  95.     add (16)     REG2(r,nTEMP12,0)<1>:w           ubDEST_RGBX(0,ROW_NUM_READ*64   )<0;16,1>           bYUV_OFF<0;4,1>:b
  96.     add (16)     REG2(r,nTEMP14,0)<1>:w           ubDEST_RGBX(0,ROW_NUM_READ*64+16)<0;16,1>           bYUV_OFF<0;4,1>:b
  97.     add (16)     REG2(r,nTEMP16,0)<1>:w           ubDEST_RGBX(0,ROW_NUM_READ*64+32)<0;16,1>           bYUV_OFF<0;4,1>:b
  98.     add (16)     REG2(r,nTEMP17,0)<1>:w           ubDEST_RGBX(0,ROW_NUM_READ*64+48)<0;16,1>           bYUV_OFF<0;4,1>:b
  99.    
  100.     mov (8)      fROW_YUVA(0,0)<1>            REG2(r, nTEMP12, 0)<0;8,1>:w
  101.     mov (8)      fROW_YUVA(1,0)<1>            REG2(r, nTEMP12, 8)<0;8,1>:w
  102.     mov (8)      fROW_YUVA(2,0)<1>            REG2(r, nTEMP14, 0)<0;8,1>:w
  103.     mov (8)      fROW_YUVA(3,0)<1>            REG2(r, nTEMP14, 8)<0;8,1>:w
  104.     mov (8)      fROW_YUVA(4,0)<1>            REG2(r, nTEMP16, 0)<0;8,1>:w
  105.     mov (8)      fROW_YUVA(5,0)<1>            REG2(r, nTEMP16, 8)<0;8,1>:w
  106.     mov (8)      fROW_YUVA(6,0)<1>            REG2(r, nTEMP17, 0)<0;8,1>:w
  107.     mov (8)      fROW_YUVA(7,0)<1>            REG2(r, nTEMP17, 8)<0;8,1>:w
  108.  
  109.   #if (ONE_ROW_DEBUG)
  110.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(0,0)<0;8,1>:f
  111.     mov (8)  REG2(r, nTEMP12,   0)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  112.    
  113.         // write Y-16, U-128, V-128 to the 2nd row of RGB (convert float to int first, write whole ud): 1st half, 2 pixels
  114.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64   )<1>  REG2(r,nTEMP14,  0)<0;16,1>:ub
  115.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64+16)<1>  REG2(r,nTEMP14, 16)<0;16,1>:ub
  116.  
  117.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(1,0)<0;8,1>:f
  118.     mov (8)  REG2(r, nTEMP12,   8)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  119.    
  120.         // write Y-16, U-128, V-128 to the 2nd row of RGB (convert float to int first, write whole ud): 2nd half, 2 pixels
  121.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64+32)<1>  REG2(r,nTEMP14,  0)<0;16,1>:ub
  122.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE)*64+48)<1>  REG2(r,nTEMP14, 16)<0;16,1>:ub
  123.  
  124.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(2,0)<0;8,1>:f
  125.     mov (8)  REG2(r, nTEMP12,  16)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  126.    
  127.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(3,0)<0;8,1>:f
  128.     mov (8)  REG2(r, nTEMP12,  24)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  129.  
  130.         // write Y-16, U-128, V-128 to the 3rd row of RGB (convert float to int first, only LSB is used): 1st half, 8 pixels
  131.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+1)*64   )<1>  REG2(r,nTEMP12,  0)<0;16,1>:ub
  132.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+1)*64+16)<1>  REG2(r,nTEMP12, 16)<0;16,1>:ub
  133.    
  134.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(4,0)<0;8,1>:f
  135.     mov (8)  REG2(r, nTEMP12,   0)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  136.    
  137.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(5,0)<0;8,1>:f
  138.     mov (8)  REG2(r, nTEMP12,   8)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  139.  
  140.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(6,0)<0;8,1>:f
  141.     mov (8)  REG2(r, nTEMP12,  16)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  142.    
  143.     mov.sat (8)  REG2(r, nTEMP14,  0)<1>:ud     fROW_YUVA(7,0)<0;8,1>:f
  144.     mov (8)  REG2(r, nTEMP12,  24)<1>:ub        REG2(r, nTEMP14, 0)<0;8,4>:ub
  145.  
  146.         // write Y-16, U-128, V-128 to the 3rd row of RGB (convert float to int first, only LSB is used): 2nd half, 8 pixels
  147.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+1)*64+32)<1>  REG2(r,nTEMP12,  0)<0;16,1>:ub
  148.         mov (16) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+1)*64+48)<1>  REG2(r,nTEMP12, 16)<0;16,1>:ub
  149.   #endif
  150.  
  151.         // ######## do one row for Red ########
  152.     #define fCOEF_REG  fYUV_to_RGB_CH2_Coef_Float
  153.     #define CHANNEL   2
  154.     // ##### dp4(nTEMP16) and save result to uw format(nTEMP12)
  155.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(0, 0)<0;8,1>   fCOEF_REG<0;4,1>:f
  156.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  157.     mov (2)  REG2(r, nTEMP12,  0)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  158.  
  159.   #if (ONE_ROW_DEBUG)
  160.     // write dp4 (raw float) of 2 pixel to the 4/5th row
  161.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL   )<4>  REG2(r,nTEMP16,  0)<0;8,1>:ub
  162.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL+32)<4>  REG2(r,nTEMP16,  8)<0;8,1>:ub
  163.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL   )<4>  REG2(r,nTEMP16, 16)<0;8,1>:ub
  164.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL+32)<4>  REG2(r,nTEMP16, 24)<0;8,1>:ub
  165.  
  166.     // write dp4 (convert float to ud first, write whole ud) of 2 pixel to the 6/7th row
  167.     mov (8)  REG2(r, nTEMP17,  0)<1>:d     REG2(r, nTEMP16, 0)<0;8,1>:f
  168.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL   )<4>  REG2(r,nTEMP17,  0)<0;8,1>:ub
  169.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL+32)<4>  REG2(r,nTEMP17,  8)<0;8,1>:ub
  170.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+5)*64+CHANNEL   )<4>  REG2(r,nTEMP17, 16)<0;8,1>:ub
  171.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+5)*64+CHANNEL+32)<4>  REG2(r,nTEMP17, 24)<0;8,1>:ub
  172.   #endif    
  173.  
  174.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(1, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  175.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  176.     mov (2)  REG2(r, nTEMP12,  2)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  177.    
  178.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(2, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  179.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  180.     mov (2)  REG2(r, nTEMP12,  4)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  181.    
  182.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(3, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  183.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  184.     mov (2)  REG2(r, nTEMP12,  6)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  185.    
  186.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(4, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  187.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  188.     mov (2)  REG2(r, nTEMP12,  8)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  189.    
  190.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(5, 0)<5;8,1>         fCOEF_REG<0;4,1>:f
  191.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  192.     mov (2)  REG2(r, nTEMP12, 10)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  193.    
  194.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(6, 0)<6;8,1>         fCOEF_REG<0;4,1>:f
  195.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  196.     mov (2)  REG2(r, nTEMP12, 12)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  197.    
  198.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(7, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  199.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  200.     mov (2)  REG2(r, nTEMP12, 14)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  201.  
  202.     // ####  write this channel
  203.     mov (8) ubDEST_RGBX(0,ROW_NUM_WRITE*64+CHANNEL   )<4>  REG2(r,nTEMP12, 0)<0;8,1>:ub
  204.     mov (8) ubDEST_RGBX(0,ROW_NUM_WRITE*64+CHANNEL+32)<4>  REG2(r,nTEMP12, 8)<0;8,1>:ub
  205.    
  206.         // ######## do one row for Green ########
  207.     #define fCOEF_REG  fYUV_to_RGB_CH1_Coef_Float  // reg for green coefficient
  208.     #define CHANNEL   1
  209.     // ##### dp4(nTEMP16) and save result to uw format(nTEMP12)
  210.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(0, 0)<0;8,1>   fCOEF_REG<0;4,1>:f
  211.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  212.     mov (2)  REG2(r, nTEMP12,  0)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  213.  
  214.   #if (ONE_ROW_DEBUG)
  215.     // write dp4 (raw float) of 2 pixel to the 4/5th row
  216.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL   )<4>  REG2(r,nTEMP16,  0)<0;8,1>:ub
  217.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL+32)<4>  REG2(r,nTEMP16,  8)<0;8,1>:ub
  218.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL   )<4>  REG2(r,nTEMP16, 16)<0;8,1>:ub
  219.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL+32)<4>  REG2(r,nTEMP16, 24)<0;8,1>:ub
  220.  
  221.     // write dp4 (convert float to ud first, write whole ud) of 2 pixel to the 6/7th row
  222.     mov (8)  REG2(r, nTEMP17,  0)<1>:d     REG2(r, nTEMP16, 0)<0;8,1>:f
  223.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL   )<4>  REG2(r,nTEMP17,  0)<0;8,1>:ub
  224.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL+32)<4>  REG2(r,nTEMP17,  8)<0;8,1>:ub
  225.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+5)*64+CHANNEL   )<4>  REG2(r,nTEMP17, 16)<0;8,1>:ub
  226.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+5)*64+CHANNEL+32)<4>  REG2(r,nTEMP17, 24)<0;8,1>:ub
  227.   #endif    
  228.  
  229.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(1, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  230.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  231.     mov (2)  REG2(r, nTEMP12,  2)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  232.    
  233.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(2, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  234.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  235.     mov (2)  REG2(r, nTEMP12,  4)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  236.    
  237.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(3, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  238.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  239.     mov (2)  REG2(r, nTEMP12,  6)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  240.    
  241.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(4, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  242.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  243.     mov (2)  REG2(r, nTEMP12,  8)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  244.    
  245.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(5, 0)<5;8,1>         fCOEF_REG<0;4,1>:f
  246.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  247.     mov (2)  REG2(r, nTEMP12, 10)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  248.    
  249.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(6, 0)<6;8,1>         fCOEF_REG<0;4,1>:f
  250.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  251.     mov (2)  REG2(r, nTEMP12, 12)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  252.    
  253.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(7, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  254.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  255.     mov (2)  REG2(r, nTEMP12, 14)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  256.  
  257.     // ####  write this channel
  258.     mov (8) ubDEST_RGBX(0,ROW_NUM_WRITE*64+CHANNEL   )<4>  REG2(r,nTEMP12, 0)<0;8,1>:ub
  259.     mov (8) ubDEST_RGBX(0,ROW_NUM_WRITE*64+CHANNEL+32)<4>  REG2(r,nTEMP12, 8)<0;8,1>:ub
  260.    
  261.     // ###### do one row for Blue channel
  262.     #define fCOEF_REG  fYUV_to_RGB_CH0_Coef_Float  // reg for Blue coefficient
  263.     #define CHANNEL   0
  264.     // ##### dp4(nTEMP16) and save result to uw format(nTEMP12)
  265.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(0, 0)<0;8,1>   fCOEF_REG<0;4,1>:f
  266.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  267.     mov (2)  REG2(r, nTEMP12,  0)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  268.  
  269.   #if (ONE_ROW_DEBUG)
  270.     // write dp4 (raw float) of 2 pixel to the 4/5th row
  271.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL   )<4>  REG2(r,nTEMP16,  0)<0;8,1>:ub
  272.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+2)*64+CHANNEL+32)<4>  REG2(r,nTEMP16,  8)<0;8,1>:ub
  273.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL   )<4>  REG2(r,nTEMP16, 16)<0;8,1>:ub
  274.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+3)*64+CHANNEL+32)<4>  REG2(r,nTEMP16, 24)<0;8,1>:ub
  275.  
  276.     // write dp4 (convert float to ud first, write whole ud) of 2 pixel to the 6/7th row
  277.     mov (8)  REG2(r, nTEMP17,  0)<1>:d     REG2(r, nTEMP16, 0)<0;8,1>:f
  278.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL   )<4>  REG2(r,nTEMP17,  0)<0;8,1>:ub
  279.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+4)*64+CHANNEL+32)<4>  REG2(r,nTEMP17,  8)<0;8,1>:ub
  280.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+5)*64+CHANNEL   )<4>  REG2(r,nTEMP17, 16)<0;8,1>:ub
  281.     mov (8) ubDEST_RGBX(0,(DBG_ROWNUM_BASE+5)*64+CHANNEL+32)<4>  REG2(r,nTEMP17, 24)<0;8,1>:ub
  282.   #endif    
  283.  
  284.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(1, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  285.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  286.     mov (2)  REG2(r, nTEMP12,  2)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  287.    
  288.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(2, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  289.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  290.     mov (2)  REG2(r, nTEMP12,  4)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  291.    
  292.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(3, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  293.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  294.     mov (2)  REG2(r, nTEMP12,  6)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  295.    
  296.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(4, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  297.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  298.     mov (2)  REG2(r, nTEMP12,  8)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  299.    
  300.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(5, 0)<5;8,1>         fCOEF_REG<0;4,1>:f
  301.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  302.     mov (2)  REG2(r, nTEMP12, 10)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  303.    
  304.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(6, 0)<6;8,1>         fCOEF_REG<0;4,1>:f
  305.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  306.     mov (2)  REG2(r, nTEMP12, 12)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  307.    
  308.     dp4 (8)  REG2(r, nTEMP16,  0)<1>:f          fROW_YUVA(7, 0)<0;8,1>         fCOEF_REG<0;4,1>:f
  309.     mov.sat (2)  REG2(r, nTEMP14,  0)<1>:ud     REG2(r, nTEMP16, 0)<0;2,4>:f
  310.     mov (2)  REG2(r, nTEMP12, 14)<1>:ub         REG2(r, nTEMP14, 0)<0;2,4>:ub
  311.  
  312.     // ####  write this channel
  313.     mov (8) ubDEST_RGBX(0,ROW_NUM_WRITE*64+CHANNEL   )<4>  REG2(r,nTEMP12, 0)<0;8,1>:ub
  314.     mov (8) ubDEST_RGBX(0,ROW_NUM_WRITE*64+CHANNEL+32)<4>  REG2(r,nTEMP12, 8)<0;8,1>:ub
  315. #if (!ONE_ROW_DEBUG)
  316.     }
  317. #endif    
  318.