Optimize the VME shader for MPEG2 encoding on Gen8
[platform/upstream/libva-intel-driver.git] / src / shaders / vme / mpeg2_inter_gen8.asm
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           1: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