Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5361 serge 1
/*
2
 * Copyright © <2010>, Intel Corporation.
3
 *
4
 * This program is licensed under the terms and conditions of the
5
 * Eclipse Public License (EPL), version 1.0.  The full text of the EPL is at
6
 * http://www.opensource.org/licenses/eclipse-1.0.php.
7
 * Authors: Zhao Yakui 
8
 *
9
 */
10
// Modual name: InterFrame_ivy.asm
11
//
12
// Make intra predition estimation for Inter-B frame
13
//
14
 
15
//
16
//  Now, begin source code....
17
//
18
 
19
#define SAVE_RET	add (1) RETURN_REG<1>:ud   ip:ud	32:ud
20
#define	RETURN		mov (1)	ip:ud	RETURN_REG<0,1,0>:ud
21
 
22
/*
23
 * __START
24
 */
25
__INTER_START:
26
mov  (16) tmp_reg0.0<1>:UD      0x0:UD {align1};
27
mov  (16) tmp_reg2.0<1>:UD      0x0:UD {align1};
28
mov  (16) tmp_reg4.0<1>:UD      0x0:UD {align1} ;
29
mov  (16) tmp_reg6.0<1>:UD      0x0:UD {align1} ;
30
 
31
shl  (2) read0_header.0<1>:D    orig_xy_ub<2,2,1>:UB 4:UW {align1};    /* (x, y) * 16 */
32
add  (1) read0_header.0<1>:D    read0_header.0<0,1,0>:D -8:W {align1};     /* X offset */
33
add  (1) read0_header.4<1>:D    read0_header.4<0,1,0>:D -1:W {align1};     /* Y offset */
34
mov  (1) read0_header.8<1>:UD   BLOCK_32X1 {align1};
35
mov  (1) read0_header.20<1>:UB  thread_id_ub {align1};                  /* dispatch id */
36
 
37
shl  (2) read1_header.0<1>:D    orig_xy_ub<2,2,1>:UB 4:UW {align1};    /* (x, y) * 16 */
38
add  (1) read1_header.0<1>:D    read1_header.0<0,1,0>:D -4:W {align1};     /* X offset */
39
mov  (1) read1_header.8<1>:UD   BLOCK_4X16 {align1};
40
mov  (1) read1_header.20<1>:UB  thread_id_ub {align1};                  /* dispatch id */
41
 
42
shl  (2) vme_m0.8<1>:UW         orig_xy_ub<2,2,1>:UB 4:UW {align1};    /* (x, y) * 16 */
43
mov  (1) vme_m0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
44
 
45
mul  (1) obw_m0.8<1>:UD         w_in_mb_uw<0,1,0>:UW orig_y_ub<0,1,0>:UB {align1};
46
add  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD orig_x_ub<0,1,0>:UB {align1};
47
mul  (1) obw_m0.8<1>:UD         obw_m0.8<0,1,0>:UD INTER_VME_OUTPUT_IN_OWS:UD {align1};
48
mov  (1) obw_m0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
49
 
50
/*
51
 * Media Read Message -- fetch Luma neighbor edge pixels
52
 */
53
/* ROW */
54
mov  (8) msg_reg0.0<1>:UD       read0_header.0<8,8,1>:UD {align1};
55
send (8) msg_ind INEP_ROW<1>:UB null read(BIND_IDX_INEP, 0, 0, 4) mlen 1 rlen 1 {align1};
56
 
57
/* COL */
58
mov  (8) msg_reg0.0<1>:UD       read1_header.0<8,8,1>:UD {align1};
59
send (8) msg_ind INEP_COL0<1>:UB null read(BIND_IDX_INEP, 0, 0, 4) mlen 1 rlen 2 {align1};
60
 
61
mov  (8) mb_mvp_ref.0<1>:ud	0:ud		{align1};
62
mov  (8) mb_ref_win.0<1>:ud	0:ud		{align1};
63
and.z.f0.0 (1)		null:uw	mb_hwdep<0,1,0>:uw		0x04:uw   {align1};
64
(f0.0) jmpi (1) __mb_hwdep_end;
65
/* read back the data for MB A */
66
/* the layout of MB result is: rx.0(Available). rx.4(MVa), rX.8(MVb), rX.16(Pred_L0 flag),
67
*  rX.18 (Pred_L1 flag), rX.20(Forward reference ID), rX.22(Backwared reference ID)
68
*/
69
mov  (8) mba_result.0<1>:ud	0x0:ud		{align1};
70
mov  (8) mbb_result.0<1>:ud	0x0:ud		{align1};
71
mov  (8) mbc_result.0<1>:ud	0x0:ud		{align1};
72
mba_start:
73
mov  (8) mb_msg0.0<1>:ud	0:ud		{align1};
74
and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_AE:uw   {align1};
75
/* MB A doesn't exist. Zero MV. mba_flag is zero and ref ID = -1 */
76
(f0.0)  mov  (2)    	mba_result.20<1>:w	-1:w	{align1};
77
(f0.0)  jmpi (1)	mbb_start;
78
mov  (1) mba_result.0<1>:d	MB_AVAIL		{align1};
79
mov  (2) tmp_reg0.0<1>:UW	orig_xy_ub<2,2,1>:UB	{align1};
80
add  (1) tmp_reg0.0<1>:w	tmp_reg0.0<0,1,0>:w	-1:w	{align1};
81
mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
82
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
83
mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD INTER_VME_OUTPUT_IN_OWS:UD {align1};
84
mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
85
mov  (1) mb_msg_tmp.8<1>:ud	mb_msg0.8<0,1,0>:ud	{align1};
86
 
87
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD      INTER_VME_OUTPUT_MV_IN_OWS:UD {align1};
88
/* bind index 3, read 1 oword (16bytes), msg type: 0(OWord Block Read) */
89
send (16)
90
        mb_ind
91
        mb_wb.0<1>:ud
92
	NULL
93
        data_port(
94
                OBR_CACHE_TYPE,
95
                OBR_MESSAGE_TYPE,
96
                OBR_CONTROL_0,
97
                OBR_BIND_IDX,
98
                OBR_WRITE_COMMIT_CATEGORY,
99
                OBR_HEADER_PRESENT
100
        )
101
        mlen 1
102
        rlen 1
103
        {align1};
104
 
105
/* TODO: RefID is required after multi-references are added */
106
and.z.f0.0      (1)     null<1>:ud        mb_mode_wb.0 <0,1,0>:ud     INTRAMBFLAG_MASK:ud {align1} ;
107
(-f0.0)   mov (2)	mba_result.20<1>:w			-1:w	{align1};
108
(-f0.0)   jmpi	(1)	mbb_start;
109
 
110
mov   (1) mb_msg0.8<1>:UD	mb_msg_tmp.8<0,1,0>:ud	{align1};
111
/* Read MV for MB A */
112
/* bind index 3, read 8 oword (128bytes), msg type: 0(OWord Block Read) */
113
send (16)
114
        mb_ind
115
        mb_mv0.0<1>:ud
116
	NULL
117
        data_port(
118
                OBR_CACHE_TYPE,
119
                OBR_MESSAGE_TYPE,
120
                OBR_CONTROL_8,
121
                OBR_BIND_IDX,
122
                OBR_WRITE_COMMIT_CATEGORY,
123
                OBR_HEADER_PRESENT
124
        )
125
        mlen 1
126
        rlen 4
127
        {align1};
128
/* TODO: RefID is required after multi-references are added */
129
/* MV */
130
mov	(2)	mba_result.4<1>:ud		mb_mv1.8<2,2,1>:ud	{align1};
131
mov  	(2)	mba_result.20<1>:w		-1:w		{align1};
132
mov	(1)	INPUT_ARG0.0<1>:ud	mb_mode_wb.4<0,1,0>:ud	{align1};
133
mov	(1)	INPUT_ARG0.4<1>:ud	mb_mode_wb.0<0,1,0>:ud	{align1};
134
mov	(1)	INPUT_ARG0.8<1>:ud	INTER_BLOCK1:ud	{align1};
135
SAVE_RET	{align1};
136
jmpi	(1)	mb_pred_func;
137
mov 	(1)	mb_pred_mode.0<1>:uw	RET_ARG<0,1,0>:uw	{align1};
138
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L0 {align1};
139
(f0.0)	mov   (1)	mba_result.16<1>:uw		MB_PRED_FLAG		{align1};
140
(f0.0)	mov   (1)	mba_result.20<1>:w		0:w		{align1};
141
(f0.0)  jmpi	(1) mbb_start;
142
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L1 {align1};
143
(f0.0)	mov   (1)	mba_result.18<1>:uw		MB_PRED_FLAG		{align1};
144
(f0.0)	mov   (1)	mba_result.22<1>:w		0:w		{align1};
145
(f0.0)  jmpi	(1) mbb_start;
146
mov   (2)	mba_result.16<1>:uw		MB_PRED_FLAG		{align1};
147
mov   (2)	mba_result.20<1>:w		0:w		{align1};
148
 
149
mbb_start:
150
mov  (8) mb_msg0.0<1>:ud	0:ud		{align1};
151
and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_B:uw   {align1};
152
/* MB B doesn't exist. Zero MV. mba_flag is zero */
153
/* If MB B doesn't exist, neither MB C nor D exists */
154
(f0.0)  mov  (2)    	mbb_result.20<1>:w	-1:w		{align1};
155
(f0.0)  mov  (2)    	mbc_result.20<1>:w	-1:w		{align1};
156
(f0.0)  jmpi (1)	mb_mvp_start;
157
mov  (1) mbb_result.0<1>:d	MB_AVAIL		{align1};
158
mov  (2) tmp_reg0.0<1>:UW	orig_xy_ub<2,2,1>:UB	{align1};
159
add  (1) tmp_reg0.2<1>:w	tmp_reg0.2<0,1,0>:w	-1:w	{align1};
160
mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
161
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
162
mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD INTER_VME_OUTPUT_IN_OWS:UD {align1};
163
mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
164
mov  (1) mb_msg_tmp.8<1>:ud	mb_msg0.8<0,1,0>:ud	{align1};
165
 
166
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD      INTER_VME_OUTPUT_MV_IN_OWS:UD {align1};
167
 
168
/* bind index 3, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
169
send (16)
170
        mb_ind
171
        mb_wb.0<1>:ud
172
	NULL
173
        data_port(
174
                OBR_CACHE_TYPE,
175
                OBR_MESSAGE_TYPE,
176
                OBR_CONTROL_0,
177
                OBR_BIND_IDX,
178
                OBR_WRITE_COMMIT_CATEGORY,
179
                OBR_HEADER_PRESENT
180
        )
181
        mlen 1
182
        rlen 1
183
        {align1};
184
 
185
/* TODO: RefID is required after multi-references are added */
186
and.z.f0.0      (1)     null<1>:ud        mb_mode_wb.0 <0,1,0>:ud     INTRAMBFLAG_MASK:ud {align1} ;
187
(-f0.0)   mov (2)	mbb_result.20<1>:w			-1:w	{align1};
188
(-f0.0)   jmpi	(1)	mbc_start;
189
 
190
mov   (1) mb_msg0.8<1>:UD	mb_msg_tmp.8<0,1,0>:ud	{align1};
191
/* Read MV for MB B */
192
/* bind index 3, read 8 oword (128bytes), msg type: 0(OWord Block Read) */
193
send (16)
194
        mb_ind
195
        mb_mv0.0<1>:ud
196
	NULL
197
        data_port(
198
                OBR_CACHE_TYPE,
199
                OBR_MESSAGE_TYPE,
200
                OBR_CONTROL_8,
201
                OBR_BIND_IDX,
202
                OBR_WRITE_COMMIT_CATEGORY,
203
                OBR_HEADER_PRESENT
204
        )
205
        mlen 1
206
        rlen 4
207
        {align1};
208
/* TODO: RefID is required after multi-references are added */
209
 
210
mov	(2)	mbb_result.4<1>:ud		mb_mv2.16<2,2,1>:ud	{align1};
211
mov  	(2)	mbb_result.20<1>:w		-1:w		{align1};
212
mov	(1)	INPUT_ARG0.0<1>:ud	mb_mode_wb.4<0,1,0>:ud	{align1};
213
mov	(1)	INPUT_ARG0.4<1>:ud	mb_mode_wb.0<0,1,0>:ud	{align1};
214
mov	(1)	INPUT_ARG0.8<1>:ud	INTER_BLOCK2:ud	{align1};
215
SAVE_RET	{align1};
216
jmpi	(1)	mb_pred_func;
217
mov 	(1)	mb_pred_mode.0<1>:uw	RET_ARG<0,1,0>:uw	{align1};
218
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L0 {align1};
219
(f0.0)	mov   (1)	mbb_result.16<1>:uw		MB_PRED_FLAG		{align1};
220
(f0.0)	mov   (1)	mbb_result.20<1>:w		0:w		{align1};
221
(f0.0)  jmpi	(1) mbc_start;
222
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L1 {align1};
223
(f0.0)	mov   (1)	mbb_result.18<1>:uw		MB_PRED_FLAG		{align1};
224
(f0.0)	mov   (1)	mbb_result.22<1>:w		0:w		{align1};
225
(f0.0)  jmpi	(1) mbc_start;
226
mov   (2)	mbb_result.16<1>:uw		MB_PRED_FLAG		{align1};
227
 
228
mbc_start:
229
mov  (8) mb_msg0.0<1>:ud	0:ud		{align1};
230
and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_C:uw   {align1};
231
/* MB C doesn't exist. Zero MV. mba_flag is zero */
232
/* Based on h264 spec the MB D will be replaced if MB C doesn't exist */
233
(f0.0)  jmpi (1)	mbd_start;
234
mov  (1) mbc_result.0<1>:d	MB_AVAIL		{align1};
235
mov  (2) tmp_reg0.0<1>:UW	orig_xy_ub<2,2,1>:UB	{align1};
236
add  (1) tmp_reg0.2<1>:w	tmp_reg0.2<0,1,0>:w	-1:w	{align1};
237
add  (1) tmp_reg0.0<1>:w	tmp_reg0.0<0,1,0>:w	1:w	{align1};
238
mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
239
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
240
mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD INTER_VME_OUTPUT_IN_OWS:UD {align1};
241
mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
242
 
243
mov  (1) mb_msg_tmp.8<1>:ud	mb_msg0.8<0,1,0>:ud	{align1};
244
 
245
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD      INTER_VME_OUTPUT_MV_IN_OWS:UD {align1};
246
/* bind index 3, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
247
send (16)
248
        mb_ind
249
        mb_wb.0<1>:ud
250
	NULL
251
        data_port(
252
                OBR_CACHE_TYPE,
253
                OBR_MESSAGE_TYPE,
254
                OBR_CONTROL_0,
255
                OBR_BIND_IDX,
256
                OBR_WRITE_COMMIT_CATEGORY,
257
                OBR_HEADER_PRESENT
258
        )
259
        mlen 1
260
        rlen 1
261
        {align1};
262
 
263
/* TODO: RefID is required after multi-references are added */
264
and.z.f0.0      (1)     null<1>:ud        mb_mode_wb.0 <0,1,0>:ud     INTRAMBFLAG_MASK:ud {align1} ;
265
(-f0.0)   mov (2)	mbc_result.20<1>:w			-1:w	{align1};
266
(-f0.0)   jmpi	(1)	mb_mvp_start;
267
mov   (1) mb_msg0.8<1>:UD	mb_msg_tmp.8<0,1,0>:ud {align1};
268
/* Read MV for MB C */
269
/* bind index 3, read 8 oword (128bytes), msg type: 0(OWord Block Read) */
270
send (16)
271
        mb_ind
272
        mb_mv0.0<1>:ud
273
	NULL
274
        data_port(
275
                OBR_CACHE_TYPE,
276
                OBR_MESSAGE_TYPE,
277
                OBR_CONTROL_8,
278
                OBR_BIND_IDX,
279
                OBR_WRITE_COMMIT_CATEGORY,
280
                OBR_HEADER_PRESENT
281
        )
282
        mlen 1
283
        rlen 4
284
        {align1};
285
/* TODO: RefID is required after multi-references are added */
286
/* Forward MV */
287
mov	   (2)		mbc_result.4<1>:ud		mb_mv2.16<2,2,1>:ud	{align1};
288
mov	   (2)		mbc_result.20<1>:w		-1:w	{align1};
289
mov	(1)	INPUT_ARG0.0<1>:ud	mb_mode_wb.4<0,1,0>:ud	{align1};
290
mov	(1)	INPUT_ARG0.4<1>:ud	mb_mode_wb.0<0,1,0>:ud	{align1};
291
mov	(1)	INPUT_ARG0.8<1>:ud	INTER_BLOCK2:ud	{align1};
292
SAVE_RET	{align1};
293
jmpi	(1)	mb_pred_func;
294
mov 	(1)	mb_pred_mode.0<1>:uw	RET_ARG<0,1,0>:uw	{align1};
295
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L0 {align1};
296
(f0.0)	mov    (1) mbc_result.16<1>:uw		MB_PRED_FLAG		{align1};
297
(f0.0)	mov    (1) mbc_result.20<1>:w		0:w		{align1};
298
(f0.0)  jmpi   (1) mb_mvp_start;
299
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L1 {align1};
300
(f0.0)	mov   (1)	mbc_result.18<1>:uw		MB_PRED_FLAG		{align1};
301
(f0.0)	mov    (1) mbc_result.22<1>:w		0:w		{align1};
302
(f0.0)  jmpi  (1) mb_mvp_start;
303
mov  (2)  mbc_result.16<1>:uw		MB_PRED_FLAG		{align1};
304
mov  (2)  mbc_result.20<1>:w		0:w	{align1};
305
 
306
jmpi   (1)    mb_mvp_start;
307
mbd_start:
308
mov  (8) mb_msg0.0<1>:ud	0:ud		{align1};
309
and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_D:uw   {align1};
310
(f0.0)  jmpi (1)	mb_mvp_start;
311
mov  (1) mbc_result.0<1>:d	MB_AVAIL		{align1};
312
mov  (2) tmp_reg0.0<1>:UW	orig_xy_ub<2,2,1>:UB	{align1};
313
add  (2) tmp_reg0.0<1>:w	tmp_reg0.0<2,2,1>:w	-1:w	{align1};
314
mul  (1) mb_msg0.8<1>:UD       w_in_mb_uw<0,1,0>:UW tmp_reg0.2<0,1,0>:UW {align1};
315
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD   tmp_reg0.0<0,1,0>:uw {align1};
316
 
317
mul  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD INTER_VME_OUTPUT_IN_OWS:UD {align1};
318
mov  (1) mb_msg0.20<1>:UB        thread_id_ub {align1};                  /* dispatch id */
319
mov  (1) mb_msg_tmp.8<1>:ud	mb_msg0.8<0,1,0>:ud	{align1};
320
 
321
add  (1) mb_msg0.8<1>:UD       mb_msg0.8<0,1,0>:UD      INTER_VME_OUTPUT_MV_IN_OWS:UD {align1};
322
/* bind index 3, read 4 oword (64bytes), msg type: 0(OWord Block Read) */
323
send (16)
324
        mb_ind
325
        mb_wb.0<1>:ud
326
	NULL
327
        data_port(
328
                OBR_CACHE_TYPE,
329
                OBR_MESSAGE_TYPE,
330
                OBR_CONTROL_0,
331
                OBR_BIND_IDX,
332
                OBR_WRITE_COMMIT_CATEGORY,
333
                OBR_HEADER_PRESENT
334
        )
335
        mlen 1
336
        rlen 1
337
        {align1};
338
 
339
and.z.f0.0      (1)     null<1>:ud        mb_mode_wb.0 <0,1,0>:ud     INTRAMBFLAG_MASK:ud {align1} ;
340
(-f0.0)   mov (2)	mbc_result.20<1>:w			-1:w	{align1};
341
(-f0.0)   jmpi	(1)	mb_mvp_start;
342
 
343
mov   (1) mb_msg0.8<1>:UD	mb_msg_tmp.8<0,1,0>:ud	{align1};
344
/* Read MV for MB D */
345
/* bind index 3, read 8 oword (128bytes), msg type: 0(OWord Block Read) */
346
send (16)
347
        mb_ind
348
        mb_mv0.0<1>:ub
349
	NULL
350
        data_port(
351
                OBR_CACHE_TYPE,
352
                OBR_MESSAGE_TYPE,
353
                OBR_CONTROL_8,
354
                OBR_BIND_IDX,
355
                OBR_WRITE_COMMIT_CATEGORY,
356
                OBR_HEADER_PRESENT
357
        )
358
        mlen 1
359
        rlen 4
360
        {align1};
361
 
362
/* TODO: RefID is required after multi-references are added */
363
 
364
/* Forward MV */
365
mov	   (2)		mbc_result.4<1>:ud		mb_mv3.24<2,2,1>:ud	{align1};
366
mov	   (2)		mbc_result.20<1>:w		-1:w	{align1};
367
mov	(1)	INPUT_ARG0.0<1>:ud	mb_mode_wb.4<0,1,0>:ud	{align1};
368
mov	(1)	INPUT_ARG0.4<1>:ud	mb_mode_wb.0<0,1,0>:ud	{align1};
369
mov	(1)	INPUT_ARG0.8<1>:ud	INTER_BLOCK3:ud	{align1};
370
SAVE_RET	{align1};
371
jmpi	(1)	mb_pred_func;
372
mov 	(1)	mb_pred_mode.0<1>:uw	RET_ARG<0,1,0>:uw	{align1};
373
mov	   (1)	mbc_result.18<1>:w		MB_PRED_FLAG		{align1};
374
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L0 {align1};
375
(f0.0)	mov    (1) mbc_result.16<1>:uw		MB_PRED_FLAG		{align1};
376
(f0.0)	mov    (1) mbc_result.20<1>:w		0:w		{align1};
377
(f0.0)  jmpi	(1) mb_mvp_start;
378
cmp.e.f0.0 (1)	null:uw		mb_pred_mode.0<0,1,0>:uw	PRED_L1 {align1};
379
(f0.0)	mov   (1)	mbc_result.18<1>:uw		MB_PRED_FLAG		{align1};
380
(f0.0)	mov    (1) mbc_result.22<1>:w		0:w		{align1};
381
(f0.0)  jmpi  (1) mb_mvp_start;
382
mov  (2)  mbc_result.16<1>:uw		MB_PRED_FLAG		{align1};
383
mov  (2)  mbc_result.20<1>:w		0:w	{align1};
384
 
385
mb_mvp_start:
386
/*TODO: Add the skip prediction */
387
/* Check whether both MB B and C are invailable */
388
add	(1)	tmp_reg0.0<1>:d		mbb_result.0<0,1,0>:d	mbc_result.0<0,1,0>:d	{align1};
389
cmp.z.f0.0 (1)	null:d			tmp_reg0.0<0,1,0>:d	0:d	{align1};
390
(-f0.0)	jmpi (1)	mb_median_start;
391
cmp.nz.f0.0 (1)	null:d	mba_result.0<0,1,0>:d		0:d		{align1};
392
(f0.0)	mov	(2)	mbb_result.4<1>:ud		mba_result.4<2,2,1>:ud	{align1};
393
(f0.0)	mov	(2)	mbc_result.4<1>:ud		mba_result.4<2,2,1>:ud	{align1};
394
(f0.0)	mov	(2)	mbb_result.20<1>:uw		mba_result.20<2,2,1>:uw	{align1};
395
(f0.0)	mov	(2)	mbc_result.20<1>:uw		mba_result.20<2,2,1>:uw	{align1};
396
(f0.0)  mov     (2)	mb_mvp_ref.0<1>:ud		mba_result.4<2,2,1>:ud	{align1};
397
(-f0.0) mov	(2)	mb_mvp_ref.0<1>:ud		0:ud			{align1};
398
jmpi	(1)	__mb_hwdep_end;
399
 
400
mb_median_start:
401
/* forward_MVP */
402
/* check whether only one neighbour MB has the same ref ID with the current MB */
403
mov (8)	tmp_reg0.0<1>:ud		0:ud		{align1};
404
cmp.z.f0.0	(1)	null:d	mba_result.20<1>:w	0:w	{align1};
405
(f0.0)	add	(1)	tmp_reg0.0<1>:w		tmp_reg0.0<1>:w	1:w	{align1};
406
(f0.0)	mov	(1)	tmp_reg0.4<1>:ud	mba_result.4<0,1,0>:ud	{align1};
407
cmp.z.f0.0	(1)	null:d	mbb_result.20<1>:w	0:w	{align1};
408
(f0.0)	add	(1)	tmp_reg0.0<1>:w		tmp_reg0.0<1>:w	1:w	{align1};
409
(f0.0)	mov	(1)	tmp_reg0.4<1>:ud	mbb_result.4<0,1,0>:ud	{align1};
410
cmp.z.f0.0	(1)	null:d	mbc_result.20<1>:w	0:w	{align1};
411
(f0.0)	add	(1)	tmp_reg0.0<1>:w		tmp_reg0.0<1>:w	1:w	{align1};
412
(f0.0)	mov	(1)	tmp_reg0.4<1>:ud	mbc_result.4<0,1,0>:ud	{align1};
413
cmp.e.f0.0	(1)	null:d	tmp_reg0.0<1>:w	 1:w	{align1};
414
(f0.0)	mov	(1)     mb_mvp_ref.0<1>:ud	tmp_reg0.4<0,1,0>:ud	{align1};
415
(f0.0)	jmpi (1)  mvp_backward;
416
 
417
mov	(1)	INPUT_ARG0.0<1>:w	mba_result.4<0,1,0>:w	{align1};
418
mov	(1)	INPUT_ARG0.4<1>:w	mbb_result.4<0,1,0>:w	{align1};
419
mov	(1)	INPUT_ARG0.8<1>:w	mbc_result.4<0,1,0>:w	{align1};
420
SAVE_RET	{align1};
421
 jmpi	(1)	word_imedian;
422
mov	(1)	mb_mvp_ref.0<1>:w		RET_ARG<0,1,0>:w	{align1};
423
mov	(1)	INPUT_ARG0.0<1>:w	mba_result.6<0,1,0>:w	{align1};
424
mov	(1)	INPUT_ARG0.4<1>:w	mbb_result.6<0,1,0>:w	{align1};
425
mov	(1)	INPUT_ARG0.8<1>:w	mbc_result.6<0,1,0>:w	{align1};
426
SAVE_RET	{align1};
427
jmpi	(1)	word_imedian;
428
mov	(1)	mb_mvp_ref.2<1>:w		RET_ARG<0,1,0>:w	{align1};
429
 
430
 
431
mvp_backward:
432
/* check whether only one neighbour MB has the same ref ID with the current MB */
433
mov (8)	tmp_reg0.0<1>:ud		0:ud		{align1};
434
cmp.z.f0.0	(1)	null:d	mba_result.22<1>:w	0:w	{align1};
435
(f0.0)	add	(1)	tmp_reg0.0<1>:w		tmp_reg0.0<1>:w	1:w	{align1};
436
(f0.0)	mov	(1)	tmp_reg0.4<1>:ud	mba_result.8<0,1,0>:ud	{align1};
437
cmp.z.f0.0	(1)	null:d	mbb_result.22<1>:w	0:w	{align1};
438
(f0.0)	add	(1)	tmp_reg0.0<1>:w		tmp_reg0.0<1>:w	1:w	{align1};
439
(f0.0)	mov	(1)	tmp_reg0.4<1>:ud	mbb_result.8<0,1,0>:ud	{align1};
440
cmp.z.f0.0	(1)	null:d	mbc_result.22<1>:w	0:w	{align1};
441
(f0.0)	add	(1)	tmp_reg0.0<1>:w		tmp_reg0.0<1>:w	1:w	{align1};
442
(f0.0)	mov	(1)	tmp_reg0.4<1>:ud	mbc_result.8<0,1,0>:ud	{align1};
443
cmp.e.f0.0	(1)	null:d	tmp_reg0.0<1>:w	 1:w	{align1};
444
(f0.0)	mov	(1)     mb_mvp_ref.4<1>:ud	tmp_reg0.4<0,1,0>:ud	{align1};
445
(f0.0)	jmpi (1) __mb_hwdep_end;
446
 
447
mov	(1)	INPUT_ARG0.0<1>:w	mba_result.8<0,1,0>:w	{align1};
448
mov	(1)	INPUT_ARG0.4<1>:w	mbb_result.8<0,1,0>:w	{align1};
449
mov	(1)	INPUT_ARG0.8<1>:w	mbc_result.8<0,1,0>:w	{align1};
450
SAVE_RET	{align1};
451
 jmpi	(1)	word_imedian;
452
mov	(1)	mb_mvp_ref.4<1>:w		RET_ARG<0,1,0>:w	{align1};
453
mov	(1)	INPUT_ARG0.0<1>:w	mba_result.10<0,1,0>:w	{align1};
454
mov	(1)	INPUT_ARG0.4<1>:w	mbb_result.10<0,1,0>:w	{align1};
455
mov	(1)	INPUT_ARG0.8<1>:w	mbc_result.10<0,1,0>:w	{align1};
456
SAVE_RET	{align1};
457
jmpi	(1)	word_imedian;
458
mov	(1)	mb_mvp_ref.6<1>:w		RET_ARG<0,1,0>:w	{align1};
459
 
460
__mb_hwdep_end:
461
asr	(4)	mb_ref_win.0<1>:w	mb_mvp_ref.0<4,4,1>:w	2:w	{align1};
462
add	(4)	mb_ref_win.8<1>:w	mb_ref_win.0<4,4,1>:w	3:w	{align1};
463
and	(4)	mb_ref_win.16<1>:uw	mb_ref_win.8<4,4,1>:uw	0xFFFC:uw {align1};
464
 
465
/* m2 */
466
mov  (8) vme_msg_2<1>:UD        0x0:UD {align1};
467
 
468
/* m3 */
469
mov  (1) INEP_ROW.0<1>:UD       0x0:UD {align1};
470
and  (1) INEP_ROW.4<1>:UD       INEP_ROW.4<0,1,0>:UD            0xFF000000:UD {align1};
471
mov  (8) vme_msg_3<1>:UD        INEP_ROW.0<8,8,1>:UD {align1};
472
 
473
/* m4 */
474
mov  (8) vme_msg_4<1>:UD        0x0 {align1};
475
mov (16) vme_msg_4.0<1>:UB      INEP_COL0.3<32,8,4>:UB {align1};
476
mov  (1) vme_msg_4.16<1>:UD     INTRA_PREDICTORE_MODE {align1};
477
 
478
 
479
/* m1 */
480
mov  (8) vme_m1.0<1>:ud		0x0:ud	{align1};
481
and.z.f0.0 (1) null<1>:UW transform_8x8_ub<0,1,0>:UB 1:UW {align1};
482
(f0.0) mov  (1) intra_part_mask_ub<1>:UB  LUMA_INTRA_8x8_DISABLE:uw {align1};
483
 
484
/* assign MB intra struct from the thread payload*/
485
mov (1) mb_intra_struct_ub<1>:UB input_mb_intra_ub<0,1,0>:UB {align1};
486
 
487
 
488
/* M0 */
489
/* IME search */
490
mov  (1) vme_m0.12<1>:UD   SEARCH_CTRL_DUAL_REFERENCE + INTER_PART_MASK + INTER_SAD_HAAR + SUB_PEL_MODE_QUARTER:UD {align1};
491
/* 16x16 Source, 1/4 pixel, harr */
492
mov  (1) vme_m0.22<1>:UW        DREF_REGION_SIZE {align1};         /* Reference Width&Height, 48x40 */
493
 
494
mov  (1) vme_m0.0<1>:UD		vme_m0.8<0,1,0>:UD      {align1};
495
 
496
mov  (1) vme_m0.0<1>:W		-8:W			{align1};
497
mov  (1) vme_m0.2<1>:W		-8:W			{align1};
498
 
499
mov  (1) vme_m0.4<1>:UD		vme_m0.0<0,1,0>:UD	{align1};
500
and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_AE:uw   {align1};
501
(f0.0)	add 	(1)	vme_m0.0<1>:w	vme_m0.0<0,1,0>:w	4:w	{align1};
502
(f0.0)	add 	(1)	vme_m0.4<1>:w	vme_m0.4<0,1,0>:w	4:w	{align1};
503
and.z.f0.0 (1)		null:uw	input_mb_intra_ub<0,1,0>:ub	INTRA_PRED_AVAIL_FLAG_B:uw   {align1};
504
(f0.0)	add 	(1)	vme_m0.2<1>:w	vme_m0.2<0,1,0>:w	4:w	{align1};
505
(f0.0)	add 	(1)	vme_m0.6<1>:w	vme_m0.6<0,1,0>:w	4:w	{align1};
506
 
507
mov  (1) vme_m0.4<1>:UD		vme_m0.0<0,1,0>:UD	{align1};
508
 
509
add  (2) vme_m0.0<1>:w		vme_m0.0<2,2,1>:w	mb_ref_win.16<2,2,1>:w	{align1};
510
add  (2) vme_m0.4<1>:w		vme_m0.4<2,2,1>:w	mb_ref_win.20<2,2,1>:w	{align1};
511
mov  (8) vme_msg_0.0<1>:UD      vme_m0.0<8,8,1>:UD {align1};
512
 
513
/* m1 */
514
 
515
mov  (1) vme_m1.0<1>:UD         ADAPTIVE_SEARCH_ENABLE:ud {align1} ;
516
/* MV num is passed by constant buffer. R4.28 */
517
mov  (1) vme_m1.4<1>:UB		r4.28<0,1,0>:UB {align1};
518
add  (1) vme_m1.4<1>:UD         vme_m1.4<0,1,0>:UD	FB_PRUNING_ENABLE:UD {align1};
519
add  (1) vme_m1.6<1>:uw		vme_m1.6<0,1,0>:uw	BI_WEIGHT	{align1};
520
 
521
 
522
mov  (1) vme_m1.8<1>:UD         DSTART_CENTER + DSEARCH_PATH_LEN:UD {align1};
523
 
524
/* Set the MV cost center */
525
mov  (1) vme_m1.16<1>:ud	mb_mvp_ref.0<0,1,0>:ud	{align1};
526
mov  (1) vme_m1.20<1>:ud	mb_mvp_ref.4<0,1,0>:ud	{align1};
527
mov  (8) vme_msg_1.0<1>:UD      vme_m1.0<8,8,1>:UD {align1};
528
 
529
 
530
send (8)
531
        vme_msg_ind
532
        vme_wb
533
        null
534
        vme(
535
                BIND_IDX_VME,
536
                0,
537
                0,
538
                VME_MESSAGE_TYPE_MIXED
539
        )
540
        mlen vme_msg_length
541
        rlen vme_inter_wb_length
542
        {align1};
543
 
544
and.z.f0.0      (1)     null<1>:ud              vme_wb0.0<0,1,0>:ud     INTRAMBFLAG_MASK:ud {align1} ;
545
 
546
(-f0.0)jmpi     (1)     __INTRA_INFO ;
547
 
548
__INTER_INFO:
549
/* Write MV pairs */
550
mov  (8) msg_reg0.0<1>:UD       obw_m0.0<8,8,1>:UD {align1};
551
 
552
mov  (8) msg_reg1.0<1>:UD       vme_wb1.0<8,8,1>:UD   {align1};
553
 
554
mov  (8) msg_reg2.0<1>:UD       vme_wb2.0<8,8,1>:UD   {align1};
555
 
556
mov  (8) msg_reg3.0<1>:UD       vme_wb3.0<8,8,1>:UD   {align1};
557
 
558
mov  (8) msg_reg4.0<1>:UD       vme_wb4.0<8,8,1>:UD   {align1};
559
/* bind index 3, write  8 oword (128 bytes), msg type: 8(OWord Block Write) */
560
send (16)
561
        msg_ind
562
        obw_wb
563
        null
564
        data_port(
565
                OBW_CACHE_TYPE,
566
                OBW_MESSAGE_TYPE,
567
                OBW_CONTROL_8,
568
                OBW_BIND_IDX,
569
                OBW_WRITE_COMMIT_CATEGORY,
570
                OBW_HEADER_PRESENT
571
        )
572
        mlen 5
573
        rlen obw_wb_length
574
        {align1};
575
 
576
mov             (1)     tmp_uw1<1>:uw           0:uw {align1} ;
577
mov             (1)     tmp_ud1<1>:ud           0:ud {align1} ;
578
and     	(1)     tmp_uw1<1>:uw           vme_wb0.2<0,1,0>:uw     MV32_BIT_MASK:uw {align1} ;
579
shr      	(1)     tmp_uw1<1>:uw           tmp_uw1<1>:uw           MV32_BIT_SHIFT:uw {align1} ;
580
mul       (1)     tmp_ud1<1>:ud           tmp_uw1<0,1,0>:uw       96:uw {align1} ;
581
add       (1)     tmp_ud1<1>:ud           tmp_ud1<0,1,0>:ud       32:uw {align1} ;
582
shl       (1)     tmp_uw1<1>:uw           tmp_uw1<0,1,0>:uw       MFC_MV32_BIT_SHIFT:uw {align1} ;
583
add       (1)     tmp_uw1<1>:uw           tmp_uw1<0,1,0>:uw       MVSIZE_UW_BASE:uw {align1} ;
584
add             (1)     tmp_uw1<1>:uw           tmp_uw1<0,1,0>:uw       CBP_DC_YUV_UW:uw {align1} ;
585
 
586
mov             (1)     msg_reg1.0<1>:uw        vme_wb0.0<0,1,0>:uw     {align1} ;
587
mov             (1)     msg_reg1.2<1>:uw        tmp_uw1<0,1,0>:uw       {align1} ;
588
mov             (1)     msg_reg1.4<1>:UD        vme_wb0.28<0,1,0>:UD    {align1};
589
mov             (1)     msg_reg1.8<1>:ud        tmp_ud1<0,1,0>:ud       {align1} ;
590
mov             (1)     msg_reg1.12<1>:ud        vme_wb0.0<0,1,0>:ud     {align1} ;
591
mov             (1)     msg_reg1.16<1>:ud        0x25:ud     {align1} ;
592
jmpi		(1) 	__OUTPUT_INFO;
593
 
594
__INTRA_INFO:
595
mov             (1)     msg_reg1.0<1>:UD        vme_wb.0<0,1,0>:UD      {align1};
596
mov             (1)     msg_reg1.4<1>:UD        vme_wb.16<0,1,0>:UD     {align1};
597
mov             (1)     msg_reg1.8<1>:UD        vme_wb.20<0,1,0>:UD     {align1};
598
mov             (1)     msg_reg1.12<1>:UD       vme_wb.24<0,1,0>:UD     {align1};
599
mov             (1)     msg_reg1.16<1>:ud        0x35:ud     {align1} ;
600
 
601
__OUTPUT_INFO:
602
 
603
mov	(1)	msg_reg1.20<1>:ud	obw_m0.8<0,1,0>:ud	{align1};
604
add     (1)     obw_m0.8<1>:UD       obw_m0.8<0,1,0>:UD      INTER_VME_OUTPUT_MV_IN_OWS:UD {align1};
605
mov	(8)	msg_reg0.0<1>:ud	obw_m0.0<8,8,1>:ud	{align1};
606
 
607
 
608
/* bind index 3, write 1 oword, msg type: 8(OWord Block Write) */
609
send (16)
610
        msg_ind
611
        obw_wb
612
        null
613
        data_port(
614
                OBW_CACHE_TYPE,
615
                OBW_MESSAGE_TYPE,
616
                OBW_CONTROL_2,
617
                OBW_BIND_IDX,
618
                OBW_WRITE_COMMIT_CATEGORY,
619
                OBW_HEADER_PRESENT
620
        )
621
        mlen 2
622
        rlen obw_wb_length
623
        {align1};
624
 
625
NOP;
626
 
627
/* Issue message fence so that the previous write message is committed */
628
send (16)
629
        mb_ind
630
        mb_wb.0<1>:ud
631
	NULL
632
        data_port(
633
                OBR_CACHE_TYPE,
634
                OBR_MESSAGE_FENCE,
635
                OBR_MF_COMMIT,
636
                OBR_BIND_IDX,
637
                OBR_WRITE_COMMIT_CATEGORY,
638
                OBR_HEADER_PRESENT
639
        )
640
        mlen 1
641
        rlen 1
642
        {align1};
643
 
644
__EXIT:
645
/*
646
 * kill thread
647
 */
648
mov  (8) ts_msg_reg0<1>:UD         r0<8,8,1>:UD {align1};
649
send (16) ts_msg_ind acc0<1>UW null thread_spawner(0, 0, 1) mlen 1 rlen 0 {align1 EOT};
650
 
651
 
652
	nop		;
653
	nop		;
654
/* Compare three word data to get the min value */
655
word_imin:
656
	cmp.le.f0.0 (1)		null:w		INPUT_ARG0.0<0,1,0>:w	INPUT_ARG0.4<0,1,0>:w {align1};
657
	(f0.0) mov  (1)		TEMP_VAR0.0<1>:w INPUT_ARG0.0<0,1,0>:w			  {align1};
658
	(-f0.0) mov (1)		TEMP_VAR0.0<1>:w INPUT_ARG0.4<0,1,0>:w			  {align1};
659
	cmp.le.f0.0 (1)		null:w		TEMP_VAR0.0<0,1,0>:w	INPUT_ARG0.8<0,1,0>:w {align1};
660
	(f0.0) mov  (1)		RET_ARG<1>:w TEMP_VAR0.0<0,1,0>:w			  {align1};
661
	(-f0.0) mov (1)		RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w			  {align1};
662
	RETURN		{align1};
663
 
664
/* Compare three word data to get the max value */
665
word_imax:
666
	cmp.ge.f0.0 (1)		null:w		INPUT_ARG0.0<0,1,0>:w	INPUT_ARG0.4<0,1,0>:w {align1};
667
	(f0.0) mov  (1)		TEMP_VAR0.0<1>:w INPUT_ARG0.0<0,1,0>:w			  {align1};
668
	(-f0.0) mov (1)		TEMP_VAR0.0<1>:w INPUT_ARG0.4<0,1,0>:w			  {align1};
669
	cmp.ge.f0.0 (1)		null:w		TEMP_VAR0.0<0,1,0>:w	INPUT_ARG0.8<0,1,0>:w {align1};
670
	(f0.0) mov  (1)		RET_ARG<1>:w TEMP_VAR0.0<0,1,0>:w			  {align1};
671
	(-f0.0) mov (1)		RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w			  {align1};
672
	RETURN		{align1};
673
 
674
word_imedian:
675
	cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.4<0,1,0>:w {align1};
676
	(f0.0)	jmpi (1) cmp_a_ge_b;
677
	cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
678
	(f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
679
	(f0.0) jmpi (1) cmp_end;
680
	cmp.ge.f0.0 (1) null:w INPUT_ARG0.4<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
681
	(f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
682
	(-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.4<0,1,0>:w {align1};
683
	jmpi (1) cmp_end;
684
cmp_a_ge_b:
685
	cmp.ge.f0.0 (1) null:w INPUT_ARG0.4<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
686
	(f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.4<0,1,0>:w {align1};
687
	(f0.0) jmpi (1) cmp_end;
688
	cmp.ge.f0.0 (1) null:w INPUT_ARG0.0<0,1,0>:w INPUT_ARG0.8<0,1,0>:w {align1};
689
	(f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.8<0,1,0>:w {align1};
690
	(-f0.0) mov (1) RET_ARG<1>:w INPUT_ARG0.0<0,1,0>:w {align1};
691
cmp_end:
692
 	RETURN	{align1};
693
 
694
/* This is to get the prediction mode for the correspongding partions/sub-mb
695
 * Parameter description:
696
	ARG0.0: INTER_SHAPE/PRED_MODE
697
	ARG0.4: INTER_MODE(16x16, 16x8, 8x16 or 8X8)
698
	ARG0.8: sub-mb block number(block 0/1/2/3)
699
*/
700
 
701
mb_pred_func:
702
        mov	(8)	TEMP_VAR0.0<1>:ud	0:ud	{align1};
703
	mov     (1)	TEMP_VAR0.0<1>:ub	INPUT_ARG0.1<0,1,0>:ub	{align1};
704
	and	(1)   TEMP_VAR0.4<1>:uw   INPUT_ARG0.4<0,1,0>:uw	INTER_MASK:uw	{align1};
705
	/* INTER16x16 mode. The bit1-0 is the prediction mode */
706
	cmp.e.f0.0 (1) null:uw	TEMP_VAR0.4<1>:uw	INTER_16X16MODE:uw	{align1};
707
	(f0.0)	and (1) RET_ARG<1>:uw	TEMP_VAR0.0<0,1,0>:uw	PRED_MASK {align1};
708
	(f0.0)  jmpi (1) end_mb_pred;
709
	/* Check whether it is INTER8x8 mode. */
710
	cmp.e.f0.0 (1) null:uw	TEMP_VAR0.4<1>:uw	INTER_8X8MODE:uw	{align1};
711
	(f0.0)	jmpi (1) mb_pred_func_8;
712
 
713
	/* Check whether it is INTER16x8 mode. */
714
	cmp.e.f0.0 (1) null:uw	TEMP_VAR0.4<1>:uw	INTER_16X8MODE:uw	{align1};
715
	(f0.0)	jmpi (1) mb_pred_func_168;
716
mb_pred_func_816:
717
	/* Block 0/2 uses the bit1-0. Block 1/3 uses the bit3-2 */
718
	mov	(1) TEMP_VAR0.8<1>:uw INPUT_ARG0.8<0,1,0>:uw	{align1};
719
	and.z.f0.0 (1)	null:uw	TEMP_VAR0.8<1>:uw	INTER_BLOCK1:uw	{align1};
720
	(f0.0)	and	(1) RET_ARG<1>:uw	TEMP_VAR0.0<0,1,0>:uw	PRED_MASK {align1};
721
	(f0.0)  jmpi (1) end_mb_pred;
722
	shr	(1)  TEMP_VAR0.16<1>:uw TEMP_VAR0.0<0,1,0>:uw	2:uw {align1};
723
	and	(1)  RET_ARG<1>:uw	TEMP_VAR0.16<1>:uw	PRED_MASK  {align1};
724
	jmpi	(1) end_mb_pred;
725
 
726
mb_pred_func_168:
727
	/* Block 0/1 uses the bit1-0. Block 2/3 uses the bit3-2 */
728
	mov	(1) TEMP_VAR0.8<1>:uw INPUT_ARG0.8<0,1,0>:uw	{align1};
729
	cmp.l.f0.0 (1)	null:uw	TEMP_VAR0.8<1>:uw	INTER_BLOCK2:uw	{align1};
730
	(f0.0)	and  (1) RET_ARG<1>:uw	TEMP_VAR0.0<0,1,0>:uw	PRED_MASK {align1};
731
	(f0.0)  jmpi (1) end_mb_pred;
732
	shr	(1)  TEMP_VAR0.16<1>:uw TEMP_VAR0.0<0,1,0>:uw	2:uw {align1};
733
	and	(1)  RET_ARG<1>:uw	TEMP_VAR0.16<1>:uw	PRED_MASK  {align1};
734
	jmpi	(1) end_mb_pred;
735
 
736
mb_pred_func_8:
737
	/* 8X8 mode. Every block uses two bits as the prediction mode. */
738
	mul     (1)  TEMP_VAR0.8<1>:uw  INPUT_ARG0.8<0,1,0>:uw	2:uw {align1};
739
	shr	(1)  TEMP_VAR0.16<1>:uw TEMP_VAR0.0<0,1,0>:uw	TEMP_VAR0.8<0,1,0>:uw {align1};
740
	and	(1)  RET_ARG<1>:uw	TEMP_VAR0.16<1>:uw	PRED_MASK  {align1};
741
end_mb_pred:
742
 	RETURN	{align1};
743