Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © <2013>, 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: mpeg2_inter_gen8.asm
  10. //
  11. // Make inter predition estimation for MPEG2 Inter-frame on gen8
  12. //
  13.  
  14. //
  15. //  Now, begin source code....
  16. //
  17.  
  18. #define SAVE_RET        add (1) RETURN_REG<1>:ud   ip:ud        32:ud
  19. #define RETURN          mov (1) ip:ud   RETURN_REG<0,1,0>:ud
  20.  
  21. /*
  22.  * __START
  23.  */
  24. __INTER_START:
  25. mov  (16) tmp_reg0.0<1>:UD      0x0:UD {align1};
  26. mov  (16) tmp_reg2.0<1>:UD      0x0:UD {align1};
  27. mov  (16) tmp_reg4.0<1>:UD      0x0:UD {align1} ;
  28. mov  (16) tmp_reg6.0<1>:UD      0x0:UD {align1} ;
  29.  
  30.        
  31. shl  (2) vme_m0.8<1>:UW         orig_xy_ub<2,2,1>:UB 4:UW {align1};    /* (x, y) * 16 */
  32. mov  (1) vme_m0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  33.  
  34. mul  (1) obw_m0.8<1>:UD         w_in_mb_uw<0,1,0>:UW orig_y_ub<0,1,0>:UB {align1};
  35. add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD orig_x_ub<0,1,0>:UB {align1};
  36. mul  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 24:UD {align1};
  37. mov  (1) obw_m0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  38.  
  39.        
  40. shl     (2) pic_ref.0<1>:uw     r4.24<2,2,1>:uw 4:uw    {align1};
  41. mov     (2) pic_ref.16<1>:uw    r4.20<2,2,1>:uw {align1};
  42. mov  (8) mb_mvp_ref.0<1>:ud     0:ud            {align1};
  43. mov  (8) mb_ref_win.0<1>:ud     0:ud            {align1};
  44. mov  (8) mba_result.0<1>:ud     0x0:ud          {align1};
  45. mov  (8) mbb_result.0<1>:ud     0x0:ud          {align1};
  46. mov  (8) mbc_result.0<1>:ud     0x0:ud          {align1};
  47.  
  48. and.z.f0.0 (1)          null:uw mb_hwdep<0,1,0>:uw              0x04:uw   {align1};
  49. (f0.0) jmpi (1) __mb_hwdep_end;
  50. /* read back the data for MB A */
  51. /* the layout of MB result is: rx.0(Available). rx.4(MVa), rX.8(MVb), rX.16(Pred_L0 flag),
  52. *  rX.18 (Pred_L1 flag), rX.20(Forward reference ID), rX.22(Backwared reference ID)
  53. */
  54. mba_start:
  55. mov  (8) mb_msg0.0<1>:ud        0:ud            {align1};
  56. and.z.f0.0 (1)          null:uw input_mb_intra_ub<0,1,0>:ub     INTRA_PRED_AVAIL_FLAG_AE:uw   {align1};
  57. /* MB A doesn't exist. Zero MV. mba_flag is zero and ref ID = -1 */
  58. (f0.0)  mov  (2)        mba_result.20<1>:w      -1:w    {align1};
  59. (f0.0)  jmpi (1)        mbb_start;
  60. mov  (1) mba_result.0<1>:d      MB_AVAIL                {align1};      
  61. mov  (2) tmp_reg0.0<1>:UW       orig_xy_ub<2,2,1>:UB    {align1};
  62. add  (1) tmp_reg0.0<1>:w        tmp_reg0.0<0,1,0>:w     -1:w    {align1};
  63. mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
  64. add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
  65. mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD 24:UD {align1};
  66. mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  67.  
  68. /* bind index 3, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
  69. send (16)
  70.        mb_ind
  71.        mb_wb.0<1>:ud
  72.         NULL
  73.        data_port(
  74.                OBR_CACHE_TYPE,
  75.                OBR_MESSAGE_TYPE,
  76.                OBR_CONTROL_4,
  77.                OBR_BIND_IDX,
  78.                OBR_WRITE_COMMIT_CATEGORY,
  79.                OBR_HEADER_PRESENT
  80.        )
  81.        mlen 1
  82.        rlen 2
  83.        {align1};
  84.  
  85. /* TODO: RefID is required after multi-references are added */
  86. cmp.l.f0.0 (1)          null:w  mb_intra_wb.16<0,1,0>:uw        mb_inter_wb.8<0,1,0>:uw {align1};
  87. (f0.0)   mov (2)        mba_result.20<1>:w                      -1:w    {align1};
  88. (f0.0)   jmpi   (1)     mbb_start;
  89.  
  90. add   (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:ud     3:ud {align1};
  91. /* Read MV for MB A */
  92. /* bind index 3, read 2 oword (32 bytes), msg type: 0(OWord Block Read) */
  93. send (16)
  94.        mb_ind
  95.        mb_mv0.0<1>:ud
  96.         NULL
  97.        data_port(
  98.                OBR_CACHE_TYPE,
  99.                OBR_MESSAGE_TYPE,
  100.                OBR_CONTROL_2,
  101.                OBR_BIND_IDX,
  102.                OBR_WRITE_COMMIT_CATEGORY,
  103.                OBR_HEADER_PRESENT
  104.        )
  105.        mlen 1
  106.        rlen 1
  107.        {align1};
  108. /* TODO: RefID is required after multi-references are added */
  109. /* MV */
  110. mov        (2)          mba_result.4<1>:ud              mb_mv0.0<2,2,1>:ud      {align1};
  111. mov        (1)          mba_result.16<1>:w              MB_PRED_FLAG            {align1};
  112.  
  113. mbb_start:
  114. mov  (8) mb_msg0.0<1>:ud        0:ud            {align1};
  115. and.z.f0.0 (1)          null:uw input_mb_intra_ub<0,1,0>:ub     INTRA_PRED_AVAIL_FLAG_B:uw   {align1};
  116. /* MB B doesn't exist. Zero MV. mba_flag is zero */
  117. /* If MB B doesn't exist, neither MB C nor D exists */
  118. (f0.0)  mov  (2)        mbb_result.20<1>:w      -1:w            {align1};
  119. (f0.0)  mov  (2)        mbc_result.20<1>:w      -1:w            {align1};
  120. (f0.0)  jmpi (1)        mb_mvp_start;
  121. mov  (1) mbb_result.0<1>:d      MB_AVAIL                {align1};      
  122. mov  (2) tmp_reg0.0<1>:UW       orig_xy_ub<2,2,1>:UB    {align1};
  123. add  (1) tmp_reg0.2<1>:w        tmp_reg0.2<0,1,0>:w     -1:w    {align1};
  124. mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
  125. add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
  126. mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD 24:UD {align1};
  127. mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  128.  
  129. /* bind index 3, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
  130. send (16)
  131.        mb_ind
  132.        mb_wb.0<1>:ud
  133.         NULL
  134.        data_port(
  135.                OBR_CACHE_TYPE,
  136.                OBR_MESSAGE_TYPE,
  137.                OBR_CONTROL_4,
  138.                OBR_BIND_IDX,
  139.                OBR_WRITE_COMMIT_CATEGORY,
  140.                OBR_HEADER_PRESENT
  141.        )
  142.        mlen 1
  143.        rlen 2
  144.        {align1};
  145.  
  146. /* TODO: RefID is required after multi-references are added */
  147. cmp.l.f0.0 (1)          null:w  mb_intra_wb.16<0,1,0>:uw        mb_inter_wb.8<0,1,0>:uw {align1};
  148. (f0.0)   mov (2)        mbb_result.20<1>:w                      -1:w    {align1};
  149. (f0.0)   jmpi   (1)     mbc_start;
  150. add   (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:ud     3:ud {align1};
  151. /* Read MV for MB B */
  152. /* bind index 3, read 2 oword (32bytes), msg type: 0(OWord Block Read) */
  153. send (16)
  154.        mb_ind
  155.        mb_mv0.0<1>:ud
  156.         NULL
  157.        data_port(
  158.                OBR_CACHE_TYPE,
  159.                OBR_MESSAGE_TYPE,
  160.                OBR_CONTROL_2,
  161.                OBR_BIND_IDX,
  162.                OBR_WRITE_COMMIT_CATEGORY,
  163.                OBR_HEADER_PRESENT
  164.        )
  165.        mlen 1
  166.        rlen 1
  167.        {align1};
  168. /* TODO: RefID is required after multi-references are added */
  169. mov        (2)          mbb_result.4<1>:ud              mb_mv0.0<2,2,1>:ud      {align1};
  170. mov        (1)          mbb_result.16<1>:w              MB_PRED_FLAG            {align1};
  171.  
  172. mbc_start:
  173. mov  (8) mb_msg0.0<1>:ud        0:ud            {align1};
  174. and.z.f0.0 (1)          null:uw input_mb_intra_ub<0,1,0>:ub     INTRA_PRED_AVAIL_FLAG_C:uw   {align1};
  175. /* MB C doesn't exist. Zero MV. mba_flag is zero */
  176. /* Based on h264 spec the MB D will be replaced if MB C doesn't exist */
  177. (f0.0)  jmpi (1)        mbd_start;
  178. mov  (1) mbc_result.0<1>:d      MB_AVAIL                {align1};      
  179. mov  (2) tmp_reg0.0<1>:UW       orig_xy_ub<2,2,1>:UB    {align1};
  180. add  (1) tmp_reg0.2<1>:w        tmp_reg0.2<0,1,0>:w     -1:w    {align1};
  181. add  (1) tmp_reg0.0<1>:w        tmp_reg0.0<0,1,0>:w     1:w     {align1};
  182. mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
  183. add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
  184. mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD 24:UD {align1};
  185. mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  186.  
  187. /* bind index 3, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
  188. send (16)
  189.        mb_ind
  190.        mb_wb.0<1>:ud
  191.         NULL
  192.        data_port(
  193.                OBR_CACHE_TYPE,
  194.                OBR_MESSAGE_TYPE,
  195.                OBR_CONTROL_4,
  196.                OBR_BIND_IDX,
  197.                OBR_WRITE_COMMIT_CATEGORY,
  198.                OBR_HEADER_PRESENT
  199.        )
  200.        mlen 1
  201.        rlen 2
  202.        {align1};
  203.  
  204. /* TODO: RefID is required after multi-references are added */
  205. cmp.l.f0.0 (1)          null:w  mb_intra_wb.16<0,1,0>:uw        mb_inter_wb.8<0,1,0>:uw {align1};
  206. (f0.0)   mov (2)        mbc_result.20<1>:w                      -1:w    {align1};
  207. (f0.0)   jmpi   (1)     mb_mvp_start;
  208. add   (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:ud     3:ud {align1};
  209. /* Read MV for MB C */
  210. /* bind index 3, read 2 oword (32bytes), msg type: 0(OWord Block Read) */
  211. send (16)
  212.        mb_ind
  213.        mb_mv0.0<1>:ud
  214.         NULL
  215.        data_port(
  216.                OBR_CACHE_TYPE,
  217.                OBR_MESSAGE_TYPE,
  218.                OBR_CONTROL_2,
  219.                OBR_BIND_IDX,
  220.                OBR_WRITE_COMMIT_CATEGORY,
  221.                OBR_HEADER_PRESENT
  222.        )
  223.        mlen 1
  224.        rlen 1
  225.        {align1};
  226. /* TODO: RefID is required after multi-references are added */
  227. /* Forward MV */
  228. mov        (2)          mbc_result.4<1>:ud              mb_mv0.0<2,2,1>:ud      {align1};
  229. mov        (1)          mbc_result.16<1>:w              MB_PRED_FLAG            {align1};
  230.  
  231. jmpi   (1)    mb_mvp_start;
  232. mbd_start:
  233. mov  (8) mb_msg0.0<1>:ud        0:ud            {align1};
  234. and.z.f0.0 (1)          null:uw input_mb_intra_ub<0,1,0>:ub     INTRA_PRED_AVAIL_FLAG_D:uw   {align1};
  235. (f0.0)  mov (2) mbc_result.20<1>:w      -1:w    {align1};
  236. (f0.0)  jmpi (1)        mb_mvp_start;
  237. mov  (1) mbc_result.0<1>:d      MB_AVAIL                {align1};      
  238. mov  (2) tmp_reg0.0<1>:UW       orig_xy_ub<2,2,1>:UB    {align1};
  239. add  (2) tmp_reg0.0<1>:w        tmp_reg0.0<2,2,1>:w     -1:w    {align1};
  240. mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
  241. add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
  242. mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD 24:UD {align1};
  243. mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
  244.  
  245. /* bind index 3, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
  246. send (16)
  247.        mb_ind
  248.        mb_wb.0<1>:ud
  249.         NULL
  250.        data_port(
  251.                OBR_CACHE_TYPE,
  252.                OBR_MESSAGE_TYPE,
  253.                OBR_CONTROL_4,
  254.                OBR_BIND_IDX,
  255.                OBR_WRITE_COMMIT_CATEGORY,
  256.                OBR_HEADER_PRESENT
  257.        )
  258.        mlen 1
  259.        rlen 2
  260.        {align1};
  261.  
  262. cmp.l.f0.0 (1)          null:w  mb_intra_wb.16<0,1,0>:uw        mb_inter_wb.8<0,1,0>:uw {align1};
  263. (f0.0)   mov (2)        mbc_result.20<1>:w                      -1:w    {align1};
  264. (f0.0)   jmpi   (1)     mb_mvp_start;
  265.  
  266. add   (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:ud     3:ud {align1};
  267. /* Read MV for MB D */
  268. /* bind index 3, read 2 oword (32bytes), msg type: 0(OWord Block Read) */
  269. send (16)
  270.        mb_ind
  271.        mb_mv0.0<1>:ub
  272.         NULL
  273.        data_port(
  274.                OBR_CACHE_TYPE,
  275.                OBR_MESSAGE_TYPE,
  276.                OBR_CONTROL_2,
  277.                OBR_BIND_IDX,
  278.                OBR_WRITE_COMMIT_CATEGORY,
  279.                OBR_HEADER_PRESENT
  280.        )
  281.        mlen 1
  282.        rlen 1
  283.        {align1};
  284.  
  285. /* TODO: RefID is required after multi-references are added */
  286.  
  287. /* Forward MV */
  288. mov        (2)          mbc_result.4<1>:ud              mb_mv0.0<2,2,1>:ud      {align1};
  289. mov        (1)          mbc_result.16<1>:w              MB_PRED_FLAG            {align1};
  290.        
  291. mb_mvp_start:
  292. /*TODO: Add the skip prediction */
  293. /* Check whether both MB B and C are inavailable */
  294. add     (1)     tmp_reg0.0<1>:d         mbb_result.0<0,1,0>:d   mbc_result.0<0,1,0>:d   {align1};
  295. cmp.z.f0.0 (1)  null:d                  tmp_reg0.0<0,1,0>:d     0:d     {align1};
  296. (-f0.0) jmpi (1)        mb_median_start;
  297. cmp.nz.f0.0 (1) null:d  mba_result.0<0,1,0>:d           0:d             {align1};
  298. (f0.0)  mov     (1)     mbb_result.4<1>:ud              mba_result.4<0,1,0>:ud  {align1};      
  299. (f0.0)  mov     (1)     mbc_result.4<1>:ud              mba_result.4<0,1,0>:ud  {align1};      
  300. (f0.0)  mov     (1)     mbb_result.20<1>:uw             mba_result.20<0,1,0>:uw {align1};      
  301. (f0.0)  mov     (1)     mbc_result.20<1>:uw             mba_result.20<0,1,0>:uw {align1};      
  302. (f0.0)  mov     (1)     mb_mvp_ref.0<1>:ud              mba_result.4<0,1,0>:ud  {align1};
  303. (-f0.0) mov     (1)     mb_mvp_ref.0<1>:ud              0:ud                    {align1};
  304. jmpi    (1)     __mb_hwdep_end;
  305.        
  306. mb_median_start:
  307. /* check whether only one neighbour MB has the same ref ID with the current MB */
  308. mov (8) tmp_reg0.0<1>:ud                0:ud            {align1};
  309. cmp.z.f0.0      (1)     null:d  mba_result.20<0,1,0>:w  0:w     {align1};
  310. (f0.0)  add     (1)     tmp_reg0.0<1>:w         tmp_reg0.0<0,1,0>:w     1:w     {align1};
  311. (f0.0)  mov     (1)     tmp_reg0.4<1>:ud        mba_result.4<0,1,0>:ud  {align1};
  312. cmp.z.f0.0      (1)     null:d  mbb_result.20<0,1,0>:w  0:w     {align1};
  313. (f0.0)  add     (1)     tmp_reg0.0<1>:w         tmp_reg0.0<0,1,0>:w     1:w     {align1};
  314. (f0.0)  mov     (1)     tmp_reg0.4<1>:ud        mbb_result.4<0,1,0>:ud  {align1};
  315. cmp.z.f0.0      (1)     null:d  mbc_result.20<0,1,0>:w  0:w     {align1};
  316. (f0.0)  add     (1)     tmp_reg0.0<1>:w         tmp_reg0.0<0,1,0>:w     1:w     {align1};
  317. (f0.0)  mov     (1)     tmp_reg0.4<1>:ud        mbc_result.4<0,1,0>:ud  {align1};
  318. cmp.e.f0.0      (1)     null:d  tmp_reg0.0<0,1,0>:w      1:w    {align1};
  319. (f0.0)  mov     (1)     mb_mvp_ref.0<1>:ud      tmp_reg0.4<0,1,0>:ud    {align1};
  320. (f0.0)  jmpi (1)  __mb_hwdep_end;
  321.  
  322. mov     (1)     INPUT_ARG0.0<1>:w       mba_result.4<0,1,0>:w   {align1};
  323. mov     (1)     INPUT_ARG0.4<1>:w       mbb_result.4<0,1,0>:w   {align1};
  324. mov     (1)     INPUT_ARG0.8<1>:w       mbc_result.4<0,1,0>:w   {align1};
  325. SAVE_RET        {align1};
  326.  jmpi   (1)     word_imedian;
  327. mov     (1)     mb_mvp_ref.0<1>:w               RET_ARG<0,1,0>:w        {align1};
  328. mov     (1)     INPUT_ARG0.0<1>:w       mba_result.6<0,1,0>:w   {align1};
  329. mov     (1)     INPUT_ARG0.4<1>:w       mbb_result.6<0,1,0>:w   {align1};
  330. mov     (1)     INPUT_ARG0.8<1>:w       mbc_result.6<0,1,0>:w   {align1};
  331. SAVE_RET        {align1};
  332. jmpi    (1)     word_imedian;
  333. mov     (1)     mb_mvp_ref.2<1>:w               RET_ARG<0,1,0>:w        {align1};
  334.  
  335. __mb_hwdep_end:
  336.  
  337. mov     (2)     mv_cc_ref.0<1>:w        mba_result.4<2,2,1>:w   {align1};
  338.  
  339. /* Calibrate the ref window for MPEG2 */
  340. mov  (1) vme_m0.0<1>:W          -16:W                   {align1};
  341. mov  (1) vme_m0.2<1>:W          -12:W                   {align1};
  342.  
  343. mov  (1) INPUT_ARG0.0<1>:ud     vme_m0.0<0,1,0>:ud      {align1};
  344. mov  (1) INPUT_ARG0.8<1>:ud     vme_m0.8<0,1,0>:ud      {align1};
  345. mov  (8) INPUT_ARG1.0<1>:ud     pic_ref.0<8,8,1>:ud     {align1};
  346.  
  347. SAVE_RET        {align1};
  348. jmpi    (1)     ref_boundary_check;
  349. mov  (2) vme_m0.0<1>:w          RET_ARG<2,2,1>:w        {align1};
  350.  
  351. /* m2, get the MV/Mb cost passed from constant buffer when
  352. spawning thread by MEDIA_OBJECT */      
  353. mov (8) vme_m2<1>:UD            r1.0<8,8,1>:UD {align1};
  354.  
  355. mov (8) vme_msg_2<1>:UD         vme_m2.0<8,8,1>:UD {align1};
  356.  
  357. /* m3 FWD/BWD cost center*/
  358. mov (8) vme_msg_3<1>:UD         0x0:UD {align1};               
  359.  
  360. /* m4 skip center*/
  361. mov (8) vme_msg_4<1>:UD         0x0:UD {align1};               
  362.  
  363. /* m5 */
  364. mov  (8) vme_msg_5<1>:UD        0x0:UD {align1};
  365.  
  366.  
  367. /* Use the Luma mode */
  368. mov  (1) tmp_reg0.0<1>:UW       LUMA_INTRA_MODE:UW {align1};
  369. mov  (1) vme_msg_5.5<1>:UB      tmp_reg0.0<0,1,0>:UB {align1};
  370.  
  371. mov  (1) tmp_reg0.0<1>:UW       INTRA16_DC_PRED:UW {align1};
  372. mov  (1) vme_msg_5.4<1>:ub      tmp_reg0.0<0,1,0>:UB {align1};
  373.  
  374. /* m6 */        
  375. mov  (8) vme_msg_6<1>:UD         0x0:UD {align1};
  376. mov  (1) vme_msg_6.16<1>:UD      INTRA_PREDICTORE_MODE {align1};
  377.  
  378. /* the penalty for Intra mode */
  379. mov  (1) vme_msg_6.28<1>:UD     0x010101:UD {align1};
  380.  
  381.  
  382. /* m7 */
  383.  
  384. mov  (8) vme_msg_7.0<1>:ud       0x0:ud {align1};
  385.  
  386. /*
  387. * SIC VME message
  388. */
  389.  
  390. /* Disable Intra8x8/Intra4x4 Intra-prediction */
  391. /* m1 */
  392. mov  (8) vme_m1.0<1>:ud         0x0:UD  {align1};
  393.  
  394. mov  (1) intra_flag<1>:UW       0x0:UW {align1}                     ;
  395. mov   (1) tmp_reg0.0<1>:uw      LUMA_INTRA_8x8_DISABLE:uw               {align1};
  396. add   (1) tmp_reg0.0<1>:uw      tmp_reg0.0<0,1,0>:uw    LUMA_INTRA_4x4_DISABLE:uw {align1};
  397. mov  (1) intra_part_mask_ub<1>:UB  tmp_reg0.0<0,1,0>:ub {align1};
  398.  
  399. /* assign MB intra struct from the thread payload*/
  400. mov (1) mb_intra_struct_ub<1>:UB input_mb_intra_ub<0,1,0>:UB {align1};
  401.  
  402. /* Enable DC HAAR component when calculating HARR SATD block */
  403. mov  (1) tmp_reg0.0<1>:UW       DC_HARR_ENABLE:UW               {align1};
  404. mov  (1) vme_m1.30<1>:UB        tmp_reg0.0<0,1,0>:UB  {align1};
  405. mov  (8) vme_msg_1<1>:UD        vme_m1.0<8,8,1>:UD {align1};
  406.  
  407. /* m0 */        
  408. mov  (1) vme_m0.12<1>:UD        INTRA_SAD_HAAR:UD {align1};    /* 16x16 Source, Intra_harr */
  409. mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
  410.  
  411. /* after verification it will be passed by using payload */
  412. send (8)
  413.        vme_msg_ind
  414.        vme_wb<1>:UD
  415.        null
  416.        cre(
  417.                BIND_IDX_VME,
  418.                VME_SIC_MESSAGE_TYPE
  419.        )
  420.        mlen sic_vme_msg_length
  421.        rlen vme_wb_length
  422.        {align1};
  423. /*
  424. * Oword Block Write message
  425. */
  426. mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
  427.        
  428. mov  (1) msg_reg1.0<1>:UD       vme_wb.0<0,1,0>:UD      {align1};
  429. mov  (1) msg_reg1.4<1>:UD       vme_wb.16<0,1,0>:UD     {align1};
  430. mov  (1) msg_reg1.8<1>:UD       vme_wb.20<0,1,0>:UD     {align1};
  431. mov  (1) msg_reg1.12<1>:UD      vme_wb.24<0,1,0>:UD     {align1};
  432.  
  433. /* Distortion, Intra (17-16), */
  434. mov  (1) msg_reg1.16<1>:UW      vme_wb.12<0,1,0>:UW     {align1};
  435.  
  436. mov  (1) msg_reg1.20<1>:UD      vme_wb.8<0,1,0>:UD     {align1};
  437. /* VME clock counts */
  438. mov  (1) msg_reg1.24<1>:UD      vme_wb.28<0,1,0>:UD     {align1};
  439.  
  440. mov  (1) msg_reg1.28<1>:UD      obw_m0.8<0,1,0>:UD     {align1};
  441.  
  442. /* bind index 3, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
  443. send (16)
  444.        msg_ind
  445.        obw_wb
  446.        null
  447.        data_port(
  448.                OBW_CACHE_TYPE,
  449.                OBW_MESSAGE_TYPE,
  450.                OBW_CONTROL_2,
  451.                OBW_BIND_IDX,
  452.                OBW_WRITE_COMMIT_CATEGORY,
  453.                OBW_HEADER_PRESENT
  454.        )
  455.        mlen 2
  456.        rlen obw_wb_length
  457.        {align1};
  458.  
  459. /* IME search */
  460. mov  (1) vme_m0.12<1>:UD        SEARCH_CTRL_SINGLE + INTER_PART_MASK + INTER_SAD_HAAR:UD {align1};    /* 16x16 Source, harr */
  461. mov  (1) vme_m0.22<1>:UW        REF_REGION_SIZE {align1};         /* Reference Width&Height, 48x40 */
  462.  
  463. mov  (1) vme_m0.4<1>:UD         vme_m0.0<0,1,0>:UD      {align1};
  464.  
  465. mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
  466.  
  467. mov  (1) vme_m1.0<1>:UD         ADAPTIVE_SEARCH_ENABLE:ud {align1} ;
  468. /* the Max MV number is passed by constant buffer */
  469. mov  (1) vme_m1.4<1>:UB         r4.28<0,1,0>:UB {align1};          
  470. mov  (1) vme_m1.8<1>:UD         START_CENTER + SEARCH_PATH_LEN:UD {align1};
  471. mov  (8) vme_msg_1.0<1>:UD      vme_m1.0<8,8,1>:UD {align1};
  472.  
  473. /* Setup the Cost center */
  474. /* currently four 8x8 share the same cost center */
  475. mov  (4) vme_m3.0<2>:ud         mv_cc_ref.0<0,1,0>:ud   {align1};
  476. mov  (4) vme_m3.4<2>:ud         mv_cc_ref.0<0,1,0>:ud   {align1};
  477.  
  478. mov (8) vme_msg_3<1>:UD         vme_m3.0<8,8,1>:UD {align1};
  479. mov (8) vme_msg_2<1>:UD         vme_m2.0<8,8,1>:UD {align1};
  480.  
  481. /* M4/M5 search path */
  482. mov  (1) vme_msg_4.0<1>:UD      0x01010101:UD {align1};
  483. mov  (1) vme_msg_4.4<1>:UD      0x10010101:UD {align1};
  484. mov  (1) vme_msg_4.8<1>:UD      0x0F0F0F0F:UD {align1};
  485. mov  (1) vme_msg_4.12<1>:UD     0x100F0F0F:UD {align1};
  486. mov  (1) vme_msg_4.16<1>:UD     0x01010101:UD {align1};
  487. mov  (1) vme_msg_4.20<1>:UD     0x10010101:UD {align1};
  488. mov  (1) vme_msg_4.24<1>:UD     0x0F0F0F0F:UD {align1};
  489. mov  (1) vme_msg_4.28<1>:UD     0x100F0F0F:UD {align1};
  490.  
  491. mov  (1) vme_msg_5.0<1>:UD      0x01010101:UD {align1};
  492. mov  (1) vme_msg_5.4<1>:UD      0x10010101:UD {align1};
  493. mov  (1) vme_msg_5.8<1>:UD      0x0F0F0F0F:UD {align1};
  494. mov  (1) vme_msg_5.12<1>:UD     0x000F0F0F:UD {align1};
  495.  
  496. mov  (4) vme_msg_5.16<1>:UD     0x0:UD {align1};
  497.  
  498. send (8)
  499.        vme_msg_ind
  500.        vme_wb<1>:UD
  501.        null
  502.        vme(
  503.                BIND_IDX_VME,
  504.                0,
  505.                0,
  506.                VME_IME_MESSAGE_TYPE
  507.        )
  508.        mlen ime_vme_msg_length
  509.        rlen vme_wb_length {align1};
  510.  
  511. /* Set Macroblock-shape/mode for FBR */
  512.  
  513. mov  (1) vme_m2.20<1>:UD        0x0:UD {align1};
  514. mov  (1) vme_m2.21<1>:UB        vme_wb.25<0,1,0>:UB     {align1};
  515. mov  (1) vme_m2.22<1>:UB        vme_wb.26<0,1,0>:UB     {align1};
  516.  
  517. and  (1) tmp_reg0.0<1>:UW       vme_wb.0<0,1,0>:UW      0x03:UW {align1};
  518. mov  (1) vme_m2.20<1>:UB        tmp_reg0.0<0,1,0>:UB    {align1};
  519.  
  520. /* Send FBR message into CRE */
  521.  
  522. mov  (8) vme_msg_4.0<1>:UD       vme_wb1.0<8,8,1>:UD {align1};
  523. mov  (8) vme_msg_5.0<1>:ud       vme_wb2.0<8,8,1>:ud {align1};
  524. mov  (8) vme_msg_6.0<1>:ud       vme_wb3.0<8,8,1>:ud {align1};
  525. mov  (8) vme_msg_7.0<1>:ud       vme_wb4.0<8,8,1>:ud {align1};                
  526.  
  527. mov  (1) vme_m0.12<1>:UD        INTER_SAD_HAAR + SUB_PEL_MODE_HALF + FBR_BME_DISABLE:UD {align1};    /* 16x16 Source, 1/2 pixel, harr, BME disable */
  528. /* Bilinear filter */
  529. mov  (1) tmp_reg0.0<1>:uw       0x04:uw {align1};
  530. add  (1) vme_m1.30<1>:ub        vme_m1.30<0,1,0>:ub     tmp_reg0.0<0,1,0>:ub    {align1};
  531.  
  532. mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD  {align1};
  533. mov  (8) vme_msg_1.0<1>:UD      vme_m1.0<8,8,1>:UD  {align1};
  534.  
  535. mov  (8) vme_msg_2.0<1>:UD              vme_m2.0<8,8,1>:UD      {align1};
  536. mov  (8) vme_msg_3.0<1>:UD              vme_m3.0<8,8,1>:UD      {align1};
  537.  
  538. /* after verification it will be passed by using payload */
  539. send (8)
  540.        vme_msg_ind
  541.        vme_wb<1>:UD
  542.        null
  543.        cre(
  544.                BIND_IDX_VME,
  545.                VME_FBR_MESSAGE_TYPE
  546.        )
  547.        mlen fbr_vme_msg_length
  548.        rlen vme_wb_length
  549.        {align1};
  550.  
  551. and.z.f0.0 (1)          null:uw mb_hwdep<0,1,0>:uw              0x04:uw   {align1};
  552. (-f0.0) jmpi (1) vme_run_again;
  553. nop;
  554. vme_mv_output:
  555.  
  556. add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x02:UD {align1};
  557. mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
  558. /* write FME info */
  559. mov  (1) msg_reg1.0<1>:UD       vme_wb.0<0,1,0>:UD      {align1};
  560.  
  561. mov  (1) msg_reg1.4<1>:UD       vme_wb.24<0,1,0>:UD     {align1};
  562. /* Inter distortion of FME */
  563. mov  (1) msg_reg1.8<1>:UD       vme_wb.8<0,1,0>:UD     {align1};
  564.  
  565. mov  (1) msg_reg1.12<1>:UD      vme_m2.20<0,1,0>:UD {align1};
  566.  
  567. /* bind index 3, write  oword (16bytes), msg type: 8(OWord Block Write) */
  568. send (16)
  569.        msg_ind
  570.        obw_wb
  571.        null
  572.        data_port(
  573.                OBW_CACHE_TYPE,
  574.                OBW_MESSAGE_TYPE,
  575.                OBW_CONTROL_0,
  576.                OBW_BIND_IDX,
  577.                OBW_WRITE_COMMIT_CATEGORY,
  578.                OBW_HEADER_PRESENT
  579.        )
  580.        mlen 2
  581.        rlen obw_wb_length
  582.        {align1};
  583.  
  584. /* Write FME/BME MV */
  585. add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x01:UD {align1};
  586. mov  (8) msg_reg0.0<1>:UD       obw_m0.0<8,8,1>:UD {align1};
  587.  
  588.  
  589. mov  (8) msg_reg1.0<1>:UD       vme_wb1.0<8,8,1>:UD {align1};
  590. mov  (8) msg_reg2.0<1>:ud       vme_wb2.0<8,8,1>:ud {align1};
  591. mov  (8) msg_reg3.0<1>:ud       vme_wb3.0<8,8,1>:ud {align1};
  592. mov  (8) msg_reg4.0<1>:ud       vme_wb4.0<8,8,1>:ud {align1};                
  593. /* bind index 3, write  2 oword (32 bytes), msg type: 8(OWord Block Write) */
  594. send (16)
  595.        msg_ind
  596.        obw_wb
  597.        null
  598.        data_port(
  599.                OBW_CACHE_TYPE,
  600.                OBW_MESSAGE_TYPE,
  601.                OBW_CONTROL_2,
  602.                OBW_BIND_IDX,
  603.                OBW_WRITE_COMMIT_CATEGORY,
  604.                OBW_HEADER_PRESENT
  605.        )
  606.        mlen 2
  607.        rlen obw_wb_length
  608.        {align1};
  609.  
  610. /* Write FME/BME RefID */
  611. add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x08:UD {align1};
  612. mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
  613.  
  614. mov  (8) msg_reg1.0<1>:UD       vme_wb6.0<8,8,1>:UD {align1};
  615.  
  616. /* bind index 3, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
  617. send (16)
  618.        msg_ind
  619.        obw_wb
  620.        null
  621.        data_port(
  622.                OBW_CACHE_TYPE,
  623.                OBW_MESSAGE_TYPE,
  624.                OBW_CONTROL_2,
  625.                OBW_BIND_IDX,
  626.                OBW_WRITE_COMMIT_CATEGORY,
  627.                OBW_HEADER_PRESENT
  628.        )
  629.        mlen 2
  630.        rlen obw_wb_length
  631.        {align1};
  632.  
  633. /* Issue message fence so that the previous write message is committed */
  634. send (16)
  635.        mb_ind
  636.        mb_wb.0<1>:ud
  637.         NULL
  638.        data_port(
  639.                OBR_CACHE_TYPE,
  640.                OBR_MESSAGE_FENCE,
  641.                OBR_MF_COMMIT,
  642.                OBR_BIND_IDX,
  643.                OBR_WRITE_COMMIT_CATEGORY,
  644.                OBR_HEADER_PRESENT
  645.        )
  646.        mlen 1
  647.        rlen 1
  648.        {align1};
  649.  
  650. __EXIT:
  651. /*
  652. * kill thread
  653. */        
  654. mov  (8) ts_msg_reg0<1>:UD         r0<8,8,1>:UD {align1};
  655. send (16) ts_msg_ind acc0<1>UW null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT};
  656.  
  657.  
  658.         nop             ;
  659.         nop             ;
  660.        
  661. word_imedian:
  662.         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.4<0,1,0>:w {align1};
  663.         (f0.0)  jmpi (1) cmp_a_ge_b;
  664.         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
  665.         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
  666.         (f0.0) jmpi (1) cmp_end;
  667.         cmp.ge.f0.0 (1) null:w INPUT_ARG0.4<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
  668.         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
  669.         (-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.4<0,1,0>:w {align1};
  670.         jmpi (1) cmp_end;
  671. cmp_a_ge_b:
  672.         cmp.ge.f0.0 (1) null:w INPUT_ARG0.4<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
  673.         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.4<0,1,0>:w {align1};
  674.         (f0.0) jmpi (1) cmp_end;
  675.         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
  676.         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
  677.         (-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
  678. cmp_end:
  679.         RETURN  {align1};
  680.  
  681. nop;
  682. nop;
  683. ref_boundary_check:
  684.  
  685. /* The left/up coordinate of reference window */
  686. add  (2) TEMP_VAR0.0<1>:w       INPUT_ARG0.8<2,2,1>:w   INPUT_ARG0.0<2,2,1>:w   {align1};
  687. /* The right/bottom coordinate of reference window */
  688. add  (1) TEMP_VAR0.16<1>:w      TEMP_VAR0.0<0,1,0>:w    48:w                    {align1};
  689. add  (1) TEMP_VAR0.18<1>:w      TEMP_VAR0.2<0,1,0>:w    40:w                    {align1};
  690.  
  691. /* Firstly the MV range is checked */
  692. mul  (2) TEMP_VAR1.16<1>:w      INPUT_ARG1.16<2,2,1>:w  -1:w    {align1};
  693. add  (2) TEMP_VAR1.0<1>:w       INPUT_ARG0.8<2,2,1>:w   TEMP_VAR1.16<2,2,1>:w   {align1};
  694. add  (2) TEMP_VAR1.4<1>:w       INPUT_ARG0.8<2,2,1>:w   INPUT_ARG1.16<2,2,1>:w  {align1};
  695.  
  696. cmp.l.f0.0 (1)  null:w  TEMP_VAR0.0<0,1,0>:w    TEMP_VAR1.0<0,1,0>:w    {align1};
  697. (f0.0)  mov     (1) TEMP_VAR0.0<1>:w    TEMP_VAR1.0<0,1,0>:w    {align1};
  698. cmp.g.f0.0 (1)  null:w  TEMP_VAR0.16<0,1,0>:w   TEMP_VAR1.4<0,1,0>:w    {align1};
  699. (f0.0)  add     (1) TEMP_VAR0.0<1>:w    TEMP_VAR1.4<0,1,0>:w    -48:w   {align1};
  700. cmp.l.f0.0 (1)  null:w  TEMP_VAR0.2<0,1,0>:w    TEMP_VAR1.2<0,1,0>:w    {align1};
  701. (f0.0)  mov     (1) TEMP_VAR0.2<1>:w    TEMP_VAR1.2<0,1,0>:w    {align1};
  702. cmp.g.f0.0 (1)  null:w  TEMP_VAR0.18<0,1,0>:w   TEMP_VAR1.6<0,1,0>:w    {align1};
  703. (f0.0)  add     (1) TEMP_VAR0.2<1>:w    TEMP_VAR1.6<0,1,0>:w    -40:w   {align1};
  704.  
  705. x_left_cmp:
  706.         cmp.l.f0.0 (1)          null:w          TEMP_VAR0.0<0,1,0>:w    0:w     {align1};
  707.         (-f0.0) jmpi    (1)     x_right_cmp;
  708.         (f0.0)  mov     (1)     TEMP_VAR0.0<1>:w        0:w             {align1};
  709.         jmpi    (1)     y_top_cmp;
  710. x_right_cmp:
  711.         cmp.g.f0.0 (1)  null:w  TEMP_VAR0.16<0,1,0>:w   INPUT_ARG1.0<0,1,0>:w   {align1};
  712.         (-f0.0) jmpi    (1)     y_top_cmp;     
  713.         (f0.0)  add     (1)     TEMP_VAR0.0<1>:w        INPUT_ARG1.0<0,1,0>:w   -48:w   {align1};
  714. y_top_cmp:
  715.         cmp.l.f0.0  (1)         null:w  TEMP_VAR0.2<0,1,0>:w    0:w             {align1};
  716.         (-f0.0) jmpi    (1)     y_bottom_cmp;
  717.         (f0.0)  mov     (1)     TEMP_VAR0.2<1>:w        0:w             {align1};
  718.         jmpi    (1)     y_bottom_end;
  719. y_bottom_cmp:
  720.         cmp.g.f0.0  (1)         null:w  TEMP_VAR0.18<0,1,0>:w   INPUT_ARG1.2<0,1,0>:w {align1};
  721.         (f0.0)  add     (1)     TEMP_VAR0.2<1>:w                INPUT_ARG1.2<0,1,0>:w   -40:w   {align1};
  722.  
  723. y_bottom_end:
  724. mul     (2)     TEMP_VAR1.0<1>:w        INPUT_ARG0.8<2,2,1>:w   -1:w    {align1};
  725. add     (2)     RET_ARG<1>:w            TEMP_VAR0.0<2,2,1>:w    TEMP_VAR1.0<2,2,1>:w    {align1};      
  726.         RETURN  {align1};
  727. nop;
  728. nop;
  729.  
  730. vme_run_again:
  731.  
  732. asr     (2)     mb_ref_win.0<1>:w       mb_mvp_ref.0<2,2,1>:w   2:w     {align1};
  733. mov     (2)     tmp_reg0.0<1>:w         mb_ref_win.0<2,2,1>:w           {align1};
  734. add     (2)     mb_ref_win.8<1>:w       mb_ref_win.0<2,2,1>:w   3:w     {align1};
  735. and     (2)     mb_ref_win.16<1>:uw     mb_ref_win.8<2,2,1>:uw  0xFFFC:uw {align1};
  736.  
  737. cmp.l.f0.0      (1) null:w      tmp_reg0.0<0,1,0>:w     0:w     {align1};
  738. (f0.0)  mul     (1) tmp_reg0.0<1>:w     tmp_reg0.0<0,1,0>:w     -1:w    {align1};
  739. cmp.l.f0.0      (1) null:w      tmp_reg0.2<0,1,0>:w     0:w     {align1};
  740. (f0.0)  mul     (1) tmp_reg0.2<1>:w     tmp_reg0.2<0,1,0>:w     -1:w    {align1};
  741.  
  742. cmp.ge.f0.0     (1) null:w      tmp_reg0.0<0,1,0>:w     4:w     {align1};
  743. (f0.0)  jmpi (1)        vme_start;
  744. cmp.ge.f0.0     (1) null:w      tmp_reg0.2<0,1,0>:w     4:w     {align1};
  745. (f0.0)  jmpi (1)        vme_start;
  746.  
  747. jmpi (1) vme_done;
  748.  
  749. vme_start:
  750.         mov (8) tmp_vme_wb0.0<1>:ud     vme_wb0.0<8,8,1>:ud     {align1};
  751.         mov (8) tmp_vme_wb1.0<1>:ud     vme_wb1.0<8,8,1>:ud     {align1};
  752.  
  753. /* Calibrate the ref window for MPEG2 */
  754. mov  (1) vme_m0.0<1>:W          -16:W                   {align1};
  755. mov  (1) vme_m0.2<1>:W          -12:W                   {align1};
  756. mov  (1) INPUT_ARG0.8<1>:ud     vme_m0.8<0,1,0>:ud      {align1};
  757. add  (2) INPUT_ARG0.0<1>:w      vme_m0.0<2,2,1>:w       mb_ref_win.16<2,2,1>:w  {align1};
  758. mov  (8) INPUT_ARG1.0<1>:ud     pic_ref.0<8,8,1>:ud     {align1};
  759.  
  760. SAVE_RET        {align1};
  761. jmpi    (1)     ref_boundary_check;
  762. mov  (2) vme_m0.0<1>:w          RET_ARG<2,2,1>:w        {align1};
  763.  
  764. /* IME search */
  765. mov  (1) vme_m0.12<1>:UD        SEARCH_CTRL_SINGLE + INTER_PART_MASK + INTER_SAD_HAAR:UD {align1};    /* 16x16 Source, harr */
  766. mov  (1) vme_m0.22<1>:UW        REF_REGION_SIZE {align1};         /* Reference Width&Height, 48x40 */
  767.  
  768. mov  (1) vme_m0.4<1>:UD         vme_m0.0<0,1,0>:UD      {align1};
  769.  
  770. mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
  771.  
  772. mov  (8) vme_m1.0<1>:ud         0x0:UD  {align1};
  773.  
  774. mov  (1) vme_m1.0<1>:UD         ADAPTIVE_SEARCH_ENABLE:ud {align1} ;
  775. /* the Max MV number is passed by constant buffer */
  776. mov  (1) vme_m1.4<1>:UB         r4.28<0,1,0>:UB {align1};          
  777. mov  (1) vme_m1.8<1>:UD         START_CENTER + SEARCH_PATH_LEN:UD {align1};
  778. mov  (8) vme_msg_1.0<1>:UD      vme_m1.0<8,8,1>:UD {align1};
  779.  
  780. /* Setup the Cost center */
  781. /* currently four 8x8 share the same cost center */
  782. mov  (4) vme_m3.0<2>:ud         mv_cc_ref.0<0,1,0>:ud   {align1};
  783. mov  (4) vme_m3.4<2>:ud         mv_cc_ref.0<0,1,0>:ud   {align1};
  784.  
  785. mov (8) vme_msg_3<1>:UD         vme_m3.0<8,8,1>:UD {align1};
  786. mov (8) vme_msg_2<1>:UD         vme_m2.0<8,8,1>:UD {align1};
  787.  
  788. /* M4/M5 search path */
  789. mov  (1) vme_msg_4.0<1>:UD      0x01010101:UD {align1};
  790. mov  (1) vme_msg_4.4<1>:UD      0x10010101:UD {align1};
  791. mov  (1) vme_msg_4.8<1>:UD      0x0F0F0F0F:UD {align1};
  792. mov  (1) vme_msg_4.12<1>:UD     0x100F0F0F:UD {align1};
  793. mov  (1) vme_msg_4.16<1>:UD     0x01010101:UD {align1};
  794. mov  (1) vme_msg_4.20<1>:UD     0x10010101:UD {align1};
  795. mov  (1) vme_msg_4.24<1>:UD     0x0F0F0F0F:UD {align1};
  796. mov  (1) vme_msg_4.28<1>:UD     0x100F0F0F:UD {align1};
  797.  
  798. mov  (1) vme_msg_5.0<1>:UD      0x01010101:UD {align1};
  799. mov  (1) vme_msg_5.4<1>:UD      0x10010101:UD {align1};
  800. mov  (1) vme_msg_5.8<1>:UD      0x0F0F0F0F:UD {align1};
  801. mov  (1) vme_msg_5.12<1>:UD     0x000F0F0F:UD {align1};
  802.  
  803. mov  (4) vme_msg_5.16<1>:UD     0x0:UD {align1};
  804.  
  805. send (8)
  806.        vme_msg_ind
  807.        vme_wb<1>:UD
  808.        null
  809.        vme(
  810.                BIND_IDX_VME,
  811.                0,
  812.                0,
  813.                VME_IME_MESSAGE_TYPE
  814.        )
  815.        mlen ime_vme_msg_length
  816.        rlen vme_wb_length {align1};
  817.  
  818. /* Set Macroblock-shape/mode for FBR */
  819.  
  820. mov  (1) vme_m2.20<1>:UD        0x0:UD {align1};
  821. mov  (1) vme_m2.21<1>:UB        vme_wb.25<0,1,0>:UB     {align1};
  822. mov  (1) vme_m2.22<1>:UB        vme_wb.26<0,1,0>:UB     {align1};
  823.  
  824. and  (1) tmp_reg0.0<1>:UW       vme_wb.0<0,1,0>:UW      0x03:UW {align1};
  825. mov  (1) vme_m2.20<1>:UB        tmp_reg0.0<0,1,0>:UB    {align1};
  826.  
  827. /* Send FBR message into CRE */
  828.  
  829. mov  (8) vme_msg_4.0<1>:UD       vme_wb1.0<8,8,1>:UD {align1};
  830. mov  (8) vme_msg_5.0<1>:ud       vme_wb2.0<8,8,1>:ud {align1};
  831. mov  (8) vme_msg_6.0<1>:ud       vme_wb3.0<8,8,1>:ud {align1};
  832. mov  (8) vme_msg_7.0<1>:ud       vme_wb4.0<8,8,1>:ud {align1};                
  833.  
  834. mov  (1) vme_m0.12<1>:UD        INTER_SAD_HAAR + SUB_PEL_MODE_HALF + FBR_BME_DISABLE:UD {align1};    /* 16x16 Source, 1/2 pixel, harr, BME disable */
  835. /* Bilinear filter */
  836. mov  (1) tmp_reg0.0<1>:uw       0x04:uw {align1};
  837. add  (1) vme_m1.30<1>:ub        vme_m1.30<0,1,0>:ub     tmp_reg0.0<0,1,0>:ub    {align1};
  838.  
  839. mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD  {align1};
  840. mov  (8) vme_msg_1.0<1>:UD      vme_m1.0<8,8,1>:UD  {align1};
  841.  
  842. mov  (8) vme_msg_2.0<1>:UD              vme_m2.0<8,8,1>:UD      {align1};
  843. mov  (8) vme_msg_3.0<1>:UD              vme_m3.0<8,8,1>:UD      {align1};
  844.  
  845. /* after verification it will be passed by using payload */
  846. send (8)
  847.        vme_msg_ind
  848.        vme_wb<1>:UD
  849.        null
  850.        cre(
  851.                BIND_IDX_VME,
  852.                VME_FBR_MESSAGE_TYPE
  853.        )
  854.        mlen fbr_vme_msg_length
  855.        rlen vme_wb_length
  856.        {align1};
  857.  
  858. cmp.l.f0.0 (1)  null:uw vme_wb0.8<0,1,0>:uw     tmp_vme_wb0.8<0,1,0>:uw {align1};
  859. (f0.0)  jmpi (1) vme_done;
  860. mov     (8)     vme_wb0.0<1>:ud tmp_vme_wb0.0<8,8,1>:ud {align1};
  861. mov     (8)     vme_wb1.0<1>:ud tmp_vme_wb1.0<8,8,1>:ud {align1};
  862.  
  863. vme_done:
  864.       jmpi (1) vme_mv_output;
  865. nop;
  866. nop;
  867. nop;
  868.  
  869.