Add the MVP in GPU shader to optimize 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 add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x02:UD {align1};
552 mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
553 /* write FME info */
554 mov  (1) msg_reg1.0<1>:UD       vme_wb.0<0,1,0>:UD      {align1};
555
556 mov  (1) msg_reg1.4<1>:UD       vme_wb.24<0,1,0>:UD     {align1};
557 /* Inter distortion of FME */
558 mov  (1) msg_reg1.8<1>:UD       vme_wb.8<0,1,0>:UD     {align1};
559
560 mov  (1) msg_reg1.12<1>:UD      vme_m2.20<0,1,0>:UD {align1};
561
562 /* bind index 3, write  oword (16bytes), msg type: 8(OWord Block Write) */
563 send (16)
564         msg_ind
565         obw_wb
566         null
567         data_port(
568                 OBW_CACHE_TYPE,
569                 OBW_MESSAGE_TYPE,
570                 OBW_CONTROL_0,
571                 OBW_BIND_IDX,
572                 OBW_WRITE_COMMIT_CATEGORY,
573                 OBW_HEADER_PRESENT
574         )
575         mlen 2
576         rlen obw_wb_length
577         {align1};
578
579 /* Write FME/BME MV */
580 add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x01:UD {align1};
581 mov  (8) msg_reg0.0<1>:UD       obw_m0.0<8,8,1>:UD {align1};
582
583
584 mov  (8) msg_reg1.0<1>:UD       vme_wb1.0<8,8,1>:UD {align1};
585 mov  (8) msg_reg2.0<1>:ud       vme_wb2.0<8,8,1>:ud {align1};
586 mov  (8) msg_reg3.0<1>:ud       vme_wb3.0<8,8,1>:ud {align1};
587 mov  (8) msg_reg4.0<1>:ud       vme_wb4.0<8,8,1>:ud {align1};                
588 /* bind index 3, write  2 oword (32 bytes), msg type: 8(OWord Block Write) */
589 send (16)
590         msg_ind
591         obw_wb
592         null
593         data_port(
594                 OBW_CACHE_TYPE,
595                 OBW_MESSAGE_TYPE,
596                 OBW_CONTROL_2,
597                 OBW_BIND_IDX,
598                 OBW_WRITE_COMMIT_CATEGORY,
599                 OBW_HEADER_PRESENT
600         )
601         mlen 2
602         rlen obw_wb_length
603         {align1};
604
605 /* Write FME/BME RefID */
606 add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD 0x08:UD {align1};
607 mov  (8) msg_reg0.0<1>:UD       obw_m0<8,8,1>:UD {align1};
608
609 mov  (8) msg_reg1.0<1>:UD       vme_wb6.0<8,8,1>:UD {align1};
610
611 /* bind index 3, write 2 oword (32bytes), msg type: 8(OWord Block Write) */
612 send (16)
613         msg_ind
614         obw_wb
615         null
616         data_port(
617                 OBW_CACHE_TYPE,
618                 OBW_MESSAGE_TYPE,
619                 OBW_CONTROL_2,
620                 OBW_BIND_IDX,
621                 OBW_WRITE_COMMIT_CATEGORY,
622                 OBW_HEADER_PRESENT
623         )
624         mlen 2
625         rlen obw_wb_length
626         {align1};
627
628 /* Issue message fence so that the previous write message is committed */
629 send (16)
630         mb_ind
631         mb_wb.0<1>:ud
632         NULL
633         data_port(
634                 OBR_CACHE_TYPE,
635                 OBR_MESSAGE_FENCE,
636                 OBR_MF_COMMIT,
637                 OBR_BIND_IDX,
638                 OBR_WRITE_COMMIT_CATEGORY,
639                 OBR_HEADER_PRESENT
640         )
641         mlen 1
642         rlen 1
643         {align1};
644
645 __EXIT: 
646 /*
647  * kill thread
648  */        
649 mov  (8) ts_msg_reg0<1>:UD         r0<8,8,1>:UD {align1};
650 send (16) ts_msg_ind acc0<1>UW null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT};
651
652
653         nop             ;
654         nop             ;
655         
656 word_imedian:
657         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.4<0,1,0>:w {align1};
658         (f0.0)  jmpi (1) cmp_a_ge_b;
659         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
660         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
661         (f0.0) jmpi (1) cmp_end;
662         cmp.ge.f0.0 (1) null:w INPUT_ARG0.4<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
663         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
664         (-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.4<0,1,0>:w {align1};
665         jmpi (1) cmp_end;
666 cmp_a_ge_b:
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.4<0,1,0>:w {align1};
669         (f0.0) jmpi (1) cmp_end;
670         cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
671         (f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
672         (-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
673 cmp_end:
674         RETURN  {align1};
675
676 nop;
677 nop;
678 ref_boundary_check:
679
680 /* The left/up coordinate of reference window */
681 add  (2) TEMP_VAR0.0<1>:w       INPUT_ARG0.8<2,2,1>:w   INPUT_ARG0.0<2,2,1>:w   {align1};
682 /* The right/bottom coordinate of reference window */
683 add  (1) TEMP_VAR0.16<1>:w      TEMP_VAR0.0<0,1,0>:w    48:w                    {align1};
684 add  (1) TEMP_VAR0.18<1>:w      TEMP_VAR0.2<0,1,0>:w    40:w                    {align1};
685
686 /* Firstly the MV range is checked */
687 mul  (2) TEMP_VAR1.16<1>:w      INPUT_ARG1.16<2,2,1>:w  -1:w    {align1};
688 add  (2) TEMP_VAR1.0<1>:w       INPUT_ARG0.8<2,2,1>:w   TEMP_VAR1.16<2,2,1>:w   {align1};
689 add  (2) TEMP_VAR1.4<1>:w       INPUT_ARG0.8<2,2,1>:w   INPUT_ARG1.16<2,2,1>:w  {align1};
690
691 cmp.l.f0.0 (1)  null:w  TEMP_VAR0.0<0,1,0>:w    TEMP_VAR1.0<0,1,0>:w    {align1};
692 (f0.0)  mov     (1) TEMP_VAR0.0<1>:w    TEMP_VAR1.0<0,1,0>:w    {align1};
693 cmp.g.f0.0 (1)  null:w  TEMP_VAR0.16<0,1,0>:w   TEMP_VAR1.4<0,1,0>:w    {align1};
694 (f0.0)  add     (1) TEMP_VAR0.0<1>:w    TEMP_VAR1.4<0,1,0>:w    -48:w   {align1};
695 cmp.l.f0.0 (1)  null:w  TEMP_VAR0.2<0,1,0>:w    TEMP_VAR1.2<0,1,0>:w    {align1};
696 (f0.0)  mov     (1) TEMP_VAR0.2<1>:w    TEMP_VAR1.2<0,1,0>:w    {align1};
697 cmp.g.f0.0 (1)  null:w  TEMP_VAR0.18<0,1,0>:w   TEMP_VAR1.6<0,1,0>:w    {align1};
698 (f0.0)  add     (1) TEMP_VAR0.2<1>:w    TEMP_VAR1.6<0,1,0>:w    -40:w   {align1};
699
700 x_left_cmp:
701         cmp.l.f0.0 (1)          null:w          TEMP_VAR0.0<0,1,0>:w    0:w     {align1};
702         (-f0.0) jmpi    (1)     x_right_cmp;
703         (f0.0)  mov     (1)     TEMP_VAR0.0<1>:w        0:w             {align1};
704         jmpi    (1)     y_top_cmp;
705 x_right_cmp:
706         cmp.g.f0.0 (1)  null:w  TEMP_VAR0.16<0,1,0>:w   INPUT_ARG1.0<0,1,0>:w   {align1};
707         (-f0.0) jmpi    (1)     y_top_cmp;      
708         (f0.0)  add     (1)     TEMP_VAR0.0<1>:w        INPUT_ARG1.0<0,1,0>:w   -48:w   {align1};
709 y_top_cmp:
710         cmp.l.f0.0  (1)         null:w  TEMP_VAR0.2<0,1,0>:w    0:w             {align1};
711         (-f0.0) jmpi    (1)     y_bottom_cmp;
712         (f0.0)  mov     (1)     TEMP_VAR0.2<1>:w        0:w             {align1};
713         jmpi    (1)     y_bottom_end;
714 y_bottom_cmp:
715         cmp.g.f0.0  (1)         null:w  TEMP_VAR0.18<0,1,0>:w   INPUT_ARG1.2<0,1,0>:w {align1};
716         (f0.0)  add     (1)     TEMP_VAR0.2<1>:w                INPUT_ARG1.2<0,1,0>:w   -40:w   {align1};
717
718 y_bottom_end:
719 mul     (2)     TEMP_VAR1.0<1>:w        INPUT_ARG0.8<2,2,1>:w   -1:w    {align1};
720 add     (2)     RET_ARG<1>:w            TEMP_VAR0.0<2,2,1>:w    TEMP_VAR1.0<2,2,1>:w    {align1};       
721         RETURN  {align1};
722 nop;
723 nop;
724