Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © <2010>, Intel Corporation.
  3.  *
  4.  * This program is licensed under the terms and conditions of the
  5.  * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
  6.  * http://www.opensource.org/licenses/eclipse-1.0.php.
  7.  *
  8.  */
  9. // Modual name: IntraFrame.asm
  10. //
  11. // Make intra predition estimation for Intra frame
  12. //
  13.  
  14. //
  15. //  Now, begin source code....
  16. //
  17.  
  18. /*
  19.  * __START
  20.  */
  21. __INTRA_START:
  22. mov  (16) tmp_reg0.0<1>:UD      0x0:UD {align1};
  23. mov  (16) tmp_reg2.0<1>:UD      0x0:UD {align1};
  24. mov  (16) tmp_reg4.0<1>:UD      0x0:UD {align1} ;
  25. mov  (16) tmp_reg6.0<1>:UD      0x0:UD {align1} ;
  26.  
  27. shl  (2) read0_header.0<1>:D    orig_xy_ub<2,2,1>:UB 4:UW {align1};    /* (x, y) * 16 */
  28. add  (1) read0_header.0<1>:D    read0_header.0<0,1,0>:D -8:W {align1};     /* X offset */
  29. add  (1) read0_header.4<1>:D    read0_header.4<0,1,0>:D -1:W {align1};     /* Y offset */
  30. mov  (1) read0_header.8<1>:UD   BLOCK_32X1 {align1};
  31. mov  (1) read0_header.20<1>:UB  thread_id_ub {align1};                  /* dispatch id */
  32.  
  33. shl  (2) read1_header.0<1>:D    orig_xy_ub<2,2,1>:UB 4:UW {align1};    /* (x, y) * 16 */
  34. add  (1) read1_header.0<1>:D    read1_header.0<0,1,0>:D -4:W {align1};     /* X offset */
  35. mov  (1) read1_header.8<1>:UD   BLOCK_4X16 {align1};
  36. mov  (1) read1_header.20<1>:UB  thread_id_ub {align1};                  /* dispatch id */
  37.        
  38. shl  (2) vme_m0.8<1>:UW         orig_xy_ub<2,2,1>:UB 4:UW {align1};    /* (x, y) * 16 */
  39. mov  (1) vme_m0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  40.  
  41. mul  (1) obw_m0.8<1>:UD         w_in_mb_uw<0,1,0>:UW orig_y_ub<0,1,0>:UB {align1};
  42. add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD orig_x_ub<0,1,0>:UB {align1};
  43. mov  (1) obw_m0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  44.        
  45. /*
  46.  * Media Read Message -- fetch Luma neighbor edge pixels
  47.  */
  48. /* ROW */
  49. mov  (8) msg_reg0.0<1>:UD       read0_header.0<8,8,1>:UD {align1};        
  50. send (8) msg_ind INEP_ROW<1>:UB null read(BIND_IDX_INEP, 0, 0, 4) mlen 1 rlen 1 {align1};
  51.  
  52. /* COL */
  53. mov  (8) msg_reg0.0<1>:UD       read1_header.0<8,8,1>:UD {align1};                
  54. send (8) msg_ind INEP_COL0<1>:UB null read(BIND_IDX_INEP, 0, 0, 4) mlen 1 rlen 2 {align1};
  55.        
  56. /* m0 */        
  57. mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
  58.  
  59. /* m2 */        
  60. mov  (8) vme_msg_2<1>:UD        0x0:UD {align1};
  61.  
  62. /*
  63.  * VME message
  64.  */
  65. /* m0 */        
  66. mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
  67.  
  68. /* m1 */
  69. mov  (8) vme_m1.0<1>:ud         0x0:ud  {align1};
  70. and.z.f0.0 (1) null<1>:UW transform_8x8_ub<0,1,0>:UB 1:UW {align1};
  71. (f0.0) mov  (1) intra_part_mask_ub<1>:UB  LUMA_INTRA_8x8_DISABLE:uw {align1};
  72.  
  73. /* assign MB intra struct from the thread payload*/
  74. mov (1) mb_intra_struct_ub<1>:UB input_mb_intra_ub<0,1,0>:UB {align1};
  75.                            
  76. mov  (8) vme_msg_1<1>:UD        vme_m1.0<8,8,1>:UD {align1};
  77.  
  78. /* m2 */        
  79. mov (8) vme_msg_2<1>:UD         0x0:UD {align1};
  80.  
  81. /* m3 */
  82. mov  (1) INEP_ROW.0<1>:UD       0x0:UD {align1};
  83. and  (1) INEP_ROW.4<1>:UD       INEP_ROW.4<0,1,0>:UD            0xFF000000:UD {align1};
  84. mov  (8) vme_msg_3<1>:UD         INEP_ROW.0<8,8,1>:UD {align1};
  85.  
  86. /* m4 */        
  87. mov  (8) vme_msg_4<1>:UD         0x0 {align1};
  88. mov (16) vme_msg_4.0<1>:UB       INEP_COL0.3<32,8,4>:UB {align1};
  89. mov  (1) vme_msg_4.16<1>:UD      INTRA_PREDICTORE_MODE {align1};
  90.  
  91. send (8)
  92.         vme_msg_ind
  93.         vme_wb
  94.         null
  95.         vme(
  96.                 BIND_IDX_VME,
  97.                 0,
  98.                 0,
  99.                 VME_MESSAGE_TYPE_INTRA
  100.         )
  101.         mlen vme_msg_length
  102.         rlen vme_intra_wb_length
  103.         {align1};
  104.  
  105.  
  106. /*
  107.  * Oword Block Write message
  108.  */
  109. mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
  110.        
  111. mov  (1) msg_reg1.0<1>:UD       vme_wb.0<0,1,0>:UD      {align1};
  112. mov  (1) msg_reg1.4<1>:UD       vme_wb.16<0,1,0>:UD     {align1};
  113. mov  (1) msg_reg1.8<1>:UD       vme_wb.20<0,1,0>:UD     {align1};
  114. mov  (1) msg_reg1.12<1>:UD      vme_wb.24<0,1,0>:UD     {align1};
  115.  
  116. /* bind index 3, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
  117. send (16)
  118.         msg_ind
  119.         obw_wb
  120.         null
  121.         data_port(
  122.                 OBW_CACHE_TYPE,
  123.                 OBW_MESSAGE_TYPE,
  124.                 OBW_CONTROL_0,
  125.                 OBW_BIND_IDX,
  126.                 OBW_WRITE_COMMIT_CATEGORY,
  127.                 OBW_HEADER_PRESENT
  128.         )
  129.         mlen 2
  130.         rlen obw_wb_length
  131.         {align1};
  132.  
  133. __EXIT:
  134. /*
  135.  * kill thread
  136.  */        
  137. mov  (8) ts_msg_reg0<1>:UD         r0<8,8,1>:UD {align1};
  138. send (16) ts_msg_ind acc0<1>UW null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT};
  139.