Rewrite the GPU 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 /* Calibrate the ref window for MPEG2 */
338 mov  (1) vme_m0.0<1>:W          -16:W                   {align1};
339 mov  (1) vme_m0.2<1>:W          -12:W                   {align1};
340
341 mov  (1) INPUT_ARG0.0<1>:ud     vme_m0.0<0,1,0>:ud      {align1};
342 mov  (1) INPUT_ARG0.8<1>:ud     vme_m0.8<0,1,0>:ud      {align1};
343 mov  (8) INPUT_ARG1.0<1>:ud     pic_ref.0<8,8,1>:ud     {align1};
344
345 SAVE_RET        {align1};
346 jmpi    (1)     ref_boundary_check;
347 mov  (2) vme_m0.0<1>:w          RET_ARG<2,2,1>:w        {align1};
348
349 /* m2, get the MV/Mb cost passed from constant buffer when
350 spawning thread by MEDIA_OBJECT */       
351 mov (8) vme_m2<1>:UD            r1.0<8,8,1>:UD {align1};
352
353 mov (8) vme_msg_2<1>:UD         vme_m2.0<8,8,1>:UD {align1};
354
355 /* m3 FWD/BWD cost center*/
356 mov (8) vme_msg_3<1>:UD         0x0:UD {align1};                
357
358 /* m4 skip center*/
359 mov (8) vme_msg_4<1>:UD         0x0:UD {align1};               
360
361 /* m5 */ 
362 mov  (8) vme_msg_5<1>:UD        0x0:UD {align1};
363
364
365 /* Use the Luma mode */
366 mov  (1) tmp_reg0.0<1>:UW       LUMA_INTRA_MODE:UW {align1};
367 mov  (1) vme_msg_5.5<1>:UB      tmp_reg0.0<0,1,0>:UB {align1};
368
369 mov  (1) tmp_reg0.0<1>:UW       INTRA16_DC_PRED:UW {align1};
370 mov  (1) vme_msg_5.4<1>:ub      tmp_reg0.0<0,1,0>:UB {align1};
371
372 /* m6 */        
373 mov  (8) vme_msg_6<1>:UD         0x0:UD {align1};
374 mov  (1) vme_msg_6.16<1>:UD      INTRA_PREDICTORE_MODE {align1};
375
376 /* the penalty for Intra mode */
377 mov  (1) vme_msg_6.28<1>:UD     0x010101:UD {align1};
378
379
380 /* m7 */
381
382 mov  (8) vme_msg_7.0<1>:ud       0x0:ud {align1};
383
384 /*
385  * SIC VME message
386  */
387
388 /* Disable Intra8x8/Intra4x4 Intra-prediction */
389 /* m1 */
390 mov  (8) vme_m1.0<1>:ud         0x0:UD  {align1};
391
392 mov  (1) intra_flag<1>:UW       0x0:UW {align1}                     ;
393 mov   (1) tmp_reg0.0<1>:uw      LUMA_INTRA_8x8_DISABLE:uw               {align1};
394 add   (1) tmp_reg0.0<1>:uw      tmp_reg0.0<0,1,0>:uw    LUMA_INTRA_4x4_DISABLE:uw {align1};
395 mov  (1) intra_part_mask_ub<1>:UB  tmp_reg0.0<0,1,0>:ub {align1};
396
397 /* assign MB intra struct from the thread payload*/
398 mov (1) mb_intra_struct_ub<1>:UB input_mb_intra_ub<0,1,0>:UB {align1}; 
399
400 /* Enable DC HAAR component when calculating HARR SATD block */
401 mov  (1) tmp_reg0.0<1>:UW       DC_HARR_ENABLE:UW               {align1};
402 mov  (1) vme_m1.30<1>:UB        tmp_reg0.0<0,1,0>:UB  {align1};
403 mov  (8) vme_msg_1<1>:UD        vme_m1.0<8,8,1>:UD {align1};
404
405 /* m0 */        
406 mov  (1) vme_m0.12<1>:UD        INTRA_SAD_HAAR:UD {align1};    /* 16x16 Source, Intra_harr */
407 mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
408
409 /* after verification it will be passed by using payload */
410 send (8)
411         vme_msg_ind
412         vme_wb<1>:UD
413         null
414         cre(
415                 BIND_IDX_VME,
416                 VME_SIC_MESSAGE_TYPE
417         )
418         mlen sic_vme_msg_length
419         rlen vme_wb_length
420         {align1};
421 /*
422  * Oword Block Write message
423  */
424 mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
425         
426 mov  (1) msg_reg1.0<1>:UD       vme_wb.0<0,1,0>:UD      {align1};
427 mov  (1) msg_reg1.4<1>:UD       vme_wb.16<0,1,0>:UD     {align1};
428 mov  (1) msg_reg1.8<1>:UD       vme_wb.20<0,1,0>:UD     {align1};
429 mov  (1) msg_reg1.12<1>:UD      vme_wb.24<0,1,0>:UD     {align1};
430
431 /* Distortion, Intra (17-16), */
432 mov  (1) msg_reg1.16<1>:UW      vme_wb.12<0,1,0>:UW     {align1};
433
434 mov  (1) msg_reg1.20<1>:UD      vme_wb.8<0,1,0>:UD     {align1};
435 /* VME clock counts */
436 mov  (1) msg_reg1.24<1>:UD      vme_wb.28<0,1,0>:UD     {align1};
437
438 mov  (1) msg_reg1.28<1>:UD      obw_m0.8<0,1,0>:UD     {align1};
439
440 /* bind index 3, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
441 send (16)
442         msg_ind
443         obw_wb
444         null
445         data_port(
446                 OBW_CACHE_TYPE,
447                 OBW_MESSAGE_TYPE,
448                 OBW_CONTROL_2,
449                 OBW_BIND_IDX,
450                 OBW_WRITE_COMMIT_CATEGORY,
451                 OBW_HEADER_PRESENT
452         )
453         mlen 2
454         rlen obw_wb_length
455         {align1};
456
457 /* IME search */
458 mov  (1) vme_m0.12<1>:UD        SEARCH_CTRL_SINGLE + INTER_PART_MASK + INTER_SAD_HAAR:UD {align1};    /* 16x16 Source, harr */
459 mov  (1) vme_m0.22<1>:UW        REF_REGION_SIZE {align1};         /* Reference Width&Height, 48x40 */
460
461 mov  (1) vme_m0.4<1>:UD         vme_m0.0<0,1,0>:UD      {align1};
462
463 mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
464
465 mov  (1) vme_m1.0<1>:UD         ADAPTIVE_SEARCH_ENABLE:ud {align1} ;
466 /* the Max MV number is passed by constant buffer */
467 mov  (1) vme_m1.4<1>:UB         r4.28<0,1,0>:UB {align1};          
468 mov  (1) vme_m1.8<1>:UD         START_CENTER + SEARCH_PATH_LEN:UD {align1};
469 mov  (8) vme_msg_1.0<1>:UD      vme_m1.0<8,8,1>:UD {align1};
470
471 /* Setup the Cost center */
472 /* currently four 8x8 share the same cost center */
473 mov  (4) vme_m3.0<2>:ud         0x0:ud  {align1};
474 mov  (4) vme_m3.4<2>:ud         0x0:ud  {align1};
475
476 mov (8) vme_msg_3<1>:UD         vme_m3.0<8,8,1>:UD {align1};
477 mov (8) vme_msg_2<1>:UD         vme_m2.0<8,8,1>:UD {align1};
478
479 /* M4/M5 search path */
480 mov  (1) vme_msg_4.0<1>:UD      0x01010101:UD {align1};
481 mov  (1) vme_msg_4.4<1>:UD      0x10010101:UD {align1};
482 mov  (1) vme_msg_4.8<1>:UD      0x0F0F0F0F:UD {align1};
483 mov  (1) vme_msg_4.12<1>:UD     0x100F0F0F:UD {align1};
484 mov  (1) vme_msg_4.16<1>:UD     0x01010101:UD {align1};
485 mov  (1) vme_msg_4.20<1>:UD     0x10010101:UD {align1};
486 mov  (1) vme_msg_4.24<1>:UD     0x0F0F0F0F:UD {align1};
487 mov  (1) vme_msg_4.28<1>:UD     0x100F0F0F:UD {align1};
488
489 mov  (1) vme_msg_5.0<1>:UD      0x01010101:UD {align1};
490 mov  (1) vme_msg_5.4<1>:UD      0x10010101:UD {align1};
491 mov  (1) vme_msg_5.8<1>:UD      0x0F0F0F0F:UD {align1};
492 mov  (1) vme_msg_5.12<1>:UD     0x000F0F0F:UD {align1};
493
494 mov  (4) vme_msg_5.16<1>:UD     0x0:UD {align1};
495
496 send (8)
497         vme_msg_ind
498         vme_wb<1>:UD
499         null
500         vme(
501                 BIND_IDX_VME,
502                 0,
503                 0,
504                 VME_IME_MESSAGE_TYPE
505         )
506         mlen ime_vme_msg_length
507         rlen vme_wb_length {align1};
508
509 /* Set Macroblock-shape/mode for FBR */
510
511 mov  (1) vme_m2.20<1>:UD        0x0:UD {align1};
512 mov  (1) vme_m2.21<1>:UB        vme_wb.25<0,1,0>:UB     {align1};
513 mov  (1) vme_m2.22<1>:UB        vme_wb.26<0,1,0>:UB     {align1};
514
515 and  (1) tmp_reg0.0<1>:UW       vme_wb.0<0,1,0>:UW      0x03:UW {align1};
516 mov  (1) vme_m2.20<1>:UB        tmp_reg0.0<0,1,0>:UB    {align1};
517
518 /* Send FBR message into CRE */
519
520 mov  (8) vme_msg_4.0<1>:UD       vme_wb1.0<8,8,1>:UD {align1};
521 mov  (8) vme_msg_5.0<1>:ud       vme_wb2.0<8,8,1>:ud {align1};
522 mov  (8) vme_msg_6.0<1>:ud       vme_wb3.0<8,8,1>:ud {align1};
523 mov  (8) vme_msg_7.0<1>:ud       vme_wb4.0<8,8,1>:ud {align1};                
524
525 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 */
526 /* Bilinear filter */
527 mov  (1) tmp_reg0.0<1>:uw       0x04:uw {align1};
528 add  (1) vme_m1.30<1>:ub        vme_m1.30<0,1,0>:ub     tmp_reg0.0<0,1,0>:ub    {align1};
529
530 mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD  {align1};
531 mov  (8) vme_msg_1.0<1>:UD      vme_m1.0<8,8,1>:UD  {align1};
532
533 mov  (8) vme_msg_2.0<1>:UD              vme_m2.0<8,8,1>:UD      {align1};
534 mov  (8) vme_msg_3.0<1>:UD              vme_m3.0<8,8,1>:UD      {align1};
535
536 /* after verification it will be passed by using payload */
537 send (8)
538         vme_msg_ind
539         vme_wb<1>:UD
540         null
541         cre(
542                 BIND_IDX_VME,
543                 VME_FBR_MESSAGE_TYPE
544         )
545         mlen fbr_vme_msg_length
546         rlen vme_wb_length
547         {align1};
548
549 add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x02:UD {align1};
550 mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
551 /* write FME info */
552 mov  (1) msg_reg1.0<1>:UD       vme_wb.0<0,1,0>:UD      {align1};
553
554 mov  (1) msg_reg1.4<1>:UD       vme_wb.24<0,1,0>:UD     {align1};
555 /* Inter distortion of FME */
556 mov  (1) msg_reg1.8<1>:UD       vme_wb.8<0,1,0>:UD     {align1};
557
558 mov  (1) msg_reg1.12<1>:UD      vme_m2.20<0,1,0>:UD {align1};
559
560 /* bind index 3, write  oword (16bytes), msg type: 8(OWord Block Write) */
561 send (16)
562         msg_ind
563         obw_wb
564         null
565         data_port(
566                 OBW_CACHE_TYPE,
567                 OBW_MESSAGE_TYPE,
568                 OBW_CONTROL_0,
569                 OBW_BIND_IDX,
570                 OBW_WRITE_COMMIT_CATEGORY,
571                 OBW_HEADER_PRESENT
572         )
573         mlen 2
574         rlen obw_wb_length
575         {align1};
576
577 /* Write FME/BME MV */
578 add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x01:UD {align1};
579 mov  (8) msg_reg0.0<1>:UD       obw_m0.0<8,8,1>:UD {align1};
580
581
582 mov  (8) msg_reg1.0<1>:UD       vme_wb1.0<8,8,1>:UD {align1};
583 mov  (8) msg_reg2.0<1>:ud       vme_wb2.0<8,8,1>:ud {align1};
584 mov  (8) msg_reg3.0<1>:ud       vme_wb3.0<8,8,1>:ud {align1};
585 mov  (8) msg_reg4.0<1>:ud       vme_wb4.0<8,8,1>:ud {align1};                
586 /* bind index 3, write  2 oword (32 bytes), msg type: 8(OWord Block Write) */
587 send (16)
588         msg_ind
589         obw_wb
590         null
591         data_port(
592                 OBW_CACHE_TYPE,
593                 OBW_MESSAGE_TYPE,
594                 OBW_CONTROL_2,
595                 OBW_BIND_IDX,
596                 OBW_WRITE_COMMIT_CATEGORY,
597                 OBW_HEADER_PRESENT
598         )
599         mlen 2
600         rlen obw_wb_length
601         {align1};
602
603 /* Write FME/BME RefID */
604 add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x08:UD {align1};
605 mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
606
607 mov  (8) msg_reg1.0<1>:UD       vme_wb6.0<8,8,1>:UD {align1};
608
609 /* bind index 3, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
610 send (16)
611         msg_ind
612         obw_wb
613         null
614         data_port(
615                 OBW_CACHE_TYPE,
616                 OBW_MESSAGE_TYPE,
617                 OBW_CONTROL_2,
618                 OBW_BIND_IDX,
619                 OBW_WRITE_COMMIT_CATEGORY,
620                 OBW_HEADER_PRESENT
621         )
622         mlen 2
623         rlen obw_wb_length
624         {align1};
625
626 /* Issue message fence so that the previous write message is committed */
627 send (16)
628         mb_ind
629         mb_wb.0<1>:ud
630         NULL
631         data_port(
632                 OBR_CACHE_TYPE,
633                 OBR_MESSAGE_FENCE,
634                 OBR_MF_COMMIT,
635                 OBR_BIND_IDX,
636                 OBR_WRITE_COMMIT_CATEGORY,
637                 OBR_HEADER_PRESENT
638         )
639         mlen 1
640         rlen 1
641         {align1};
642
643 __EXIT: 
644 /*
645  * kill thread
646  */        
647 mov  (8) ts_msg_reg0<1>:UD         r0<8,8,1>:UD {align1};
648 send (16) ts_msg_ind acc0<1>UW null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT};
649
650
651         nop             ;
652         nop             ;
653         
654 word_imedian:
655         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.4<0,1,0>:w {align1};
656         (f0.0)  jmpi (1) cmp_a_ge_b;
657         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
658         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
659         (f0.0) jmpi (1) cmp_end;
660         cmp.ge.f0.0 (1) null:w INPUT_ARG0.4<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
661         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
662         (-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.4<0,1,0>:w {align1};
663         jmpi (1) cmp_end;
664 cmp_a_ge_b:
665         cmp.ge.f0.0 (1) null:w INPUT_ARG0.4<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
666         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.4<0,1,0>:w {align1};
667         (f0.0) jmpi (1) cmp_end;
668         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
669         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
670         (-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
671 cmp_end:
672         RETURN  {align1};
673
674 nop;
675 nop;
676 ref_boundary_check:
677
678 /* The left/up coordinate of reference window */
679 add  (2) TEMP_VAR0.0<1>:w       INPUT_ARG0.8<2,2,1>:w   INPUT_ARG0.0<2,2,1>:w   {align1};
680 /* The right/bottom coordinate of reference window */
681 add  (1) TEMP_VAR0.16<1>:w      TEMP_VAR0.0<0,1,0>:w    48:w                    {align1};
682 add  (1) TEMP_VAR0.18<1>:w      TEMP_VAR0.2<0,1,0>:w    40:w                    {align1};
683
684 /* Firstly the MV range is checked */
685 mul  (2) TEMP_VAR1.16<1>:w      INPUT_ARG1.16<2,2,1>:w  -1:w    {align1};
686 add  (2) TEMP_VAR1.0<1>:w       INPUT_ARG0.8<2,2,1>:w   TEMP_VAR1.16<2,2,1>:w   {align1};
687 add  (2) TEMP_VAR1.4<1>:w       INPUT_ARG0.8<2,2,1>:w   INPUT_ARG1.16<2,2,1>:w  {align1};
688
689 cmp.l.f0.0 (1)  null:w  TEMP_VAR0.0<0,1,0>:w    TEMP_VAR1.0<0,1,0>:w    {align1};
690 (f0.0)  mov     (1) TEMP_VAR0.0<1>:w    TEMP_VAR1.0<0,1,0>:w    {align1};
691 cmp.g.f0.0 (1)  null:w  TEMP_VAR0.16<0,1,0>:w   TEMP_VAR1.4<0,1,0>:w    {align1};
692 (f0.0)  add     (1) TEMP_VAR0.0<1>:w    TEMP_VAR1.4<0,1,0>:w    -48:w   {align1};
693 cmp.l.f0.0 (1)  null:w  TEMP_VAR0.2<0,1,0>:w    TEMP_VAR1.2<0,1,0>:w    {align1};
694 (f0.0)  mov     (1) TEMP_VAR0.2<1>:w    TEMP_VAR1.2<0,1,0>:w    {align1};
695 cmp.g.f0.0 (1)  null:w  TEMP_VAR0.18<0,1,0>:w   TEMP_VAR1.6<0,1,0>:w    {align1};
696 (f0.0)  add     (1) TEMP_VAR0.2<1>:w    TEMP_VAR1.6<0,1,0>:w    -40:w   {align1};
697
698 x_left_cmp:
699         cmp.l.f0.0 (1)          null:w          TEMP_VAR0.0<0,1,0>:w    0:w     {align1};
700         (-f0.0) jmpi    (1)     x_right_cmp;
701         (f0.0)  mov     (1)     TEMP_VAR0.0<1>:w        0:w             {align1};
702         jmpi    (1)     y_top_cmp;
703 x_right_cmp:
704         cmp.g.f0.0 (1)  null:w  TEMP_VAR0.16<0,1,0>:w   INPUT_ARG1.0<0,1,0>:w   {align1};
705         (-f0.0) jmpi    (1)     y_top_cmp;      
706         (f0.0)  add     (1)     TEMP_VAR0.0<1>:w        INPUT_ARG1.0<0,1,0>:w   -48:w   {align1};
707 y_top_cmp:
708         cmp.l.f0.0  (1)         null:w  TEMP_VAR0.2<0,1,0>:w    0:w             {align1};
709         (-f0.0) jmpi    (1)     y_bottom_cmp;
710         (f0.0)  mov     (1)     TEMP_VAR0.2<1>:w        0:w             {align1};
711         jmpi    (1)     y_bottom_end;
712 y_bottom_cmp:
713         cmp.g.f0.0  (1)         null:w  TEMP_VAR0.18<0,1,0>:w   INPUT_ARG1.2<0,1,0>:w {align1};
714         (f0.0)  add     (1)     TEMP_VAR0.2<1>:w                INPUT_ARG1.2<0,1,0>:w   -40:w   {align1};
715
716 y_bottom_end:
717 mul     (2)     TEMP_VAR1.0<1>:w        INPUT_ARG0.8<2,2,1>:w   -1:w    {align1};
718 add     (2)     RET_ARG<1>:w            TEMP_VAR0.0<2,2,1>:w    TEMP_VAR1.0<2,2,1>:w    {align1};       
719         RETURN  {align1};
720 nop;
721 nop;
722