2 * Copyright © <2010>, Intel Corporation.
\r
4 * This program is licensed under the terms and conditions of the
\r
5 * Eclipse Public License (EPL), version 1.0. The full text of the EPL is at
\r
6 * http://www.opensource.org/licenses/eclipse-1.0.php.
\r
9 // Module name: save_Left_UV_8x2T.asm
\r
11 // Transpose 8x2 to 2x8 UV data and write to memory
\r
13 //----------------------------------------------------------------
\r
14 // Symbols need to be defined before including this module
\r
17 // PREV_MB_UW: Base=ryy ElementSize=2 SrcRegion=REGION(8,1) Type=uw
\r
19 // Binding table index:
\r
20 // BI_SRC_UV: Binding table index of UV surface (NV12)
\r
23 // BUF_W: BUF_W Base=rxx ElementSize=1 SrcRegion=REGION(8,1) Type=uw
\r
26 #if defined(_DEBUG)
\r
27 mov (1) EntrySignatureC:w 0xDDD6:w
\r
30 and.z.f0.0 (1) null:w r[ECM_AddrReg, BitFlags]:ub FieldModeCurrentMbFlag:w
\r
32 and.nz.f0.1 (1) NULLREGW BitFields:w BotFieldFlag:w
\r
34 // Transpose U/V, save them to MRFs in NV12 format
\r
35 mov (1) MSGSRC.0:ud ORIX_LEFT:w { NoDDClr } // Block origin
\r
36 asr (1) MSGSRC.1:ud ORIY_LEFT:w 1:w { NoDDClr, NoDDChk } // NV12 U+V block origin y = half of Y comp
\r
37 mov (1) MSGSRC.2:ud 0x00070003:ud { NoDDChk } // NV12 U+V block width and height (4x8)
\r
40 // 16x2 UV src in GRF (each pix is specified as yx)
\r
41 // +-----------------------+-----------------------+-----------------------+-----------------------+
\r
42 // |71 71 61 61 51 51 41 41 31 31 21 21 11 11 01 01 70 70 60 60 50 50 40 40 30 30 20 20 10 10 00 00|
\r
43 // +-----------------------+-----------------------+-----------------------+-----------------------+
\r
45 // First step (8) <1> <=== <8;4,1>:w
\r
46 // +-----------------------+-----------------------+-----------------------+-----------------------+
\r
47 // |71 71 61 61 51 51 41 41 70 70 60 60 50 50 40 40 31 31 21 21 11 11 01 01 30 30 20 20 10 10 00 00|
\r
48 // +-----------------------+-----------------------+-----------------------+-----------------------+
\r
49 mov (8) BUF_W(0,0)<1> PREV_MB_UW(0,0)<8;4,1> { NoDDClr }
\r
50 mov (8) BUF_W(0,8)<1> PREV_MB_UW(0,4)<8;4,1> { NoDDChk }
\r
52 // Second step (8) <1> <=== <1;2,4>
\r
53 // +-----------------------+-----------------------+-----------------------+-----------------------+
\r
54 // |71 71 70 70 61 61 60 60 51 51 50 50 41 41 40 40 31 31 30 30 21 21 20 20 11 11 10 10 01 01 00 00|
\r
55 // +-----------------------+-----------------------+-----------------------+-----------------------+
\r
56 mov (8) MSGPAYLOADW(0,0)<1> BUF_W(0,0)<1;2,4>
\r
57 mov (8) MSGPAYLOADW(0,8)<1> BUF_W(0,8)<1;2,4>
\r
59 // Transposed U+V in NV12 in 4x8 is ready for writting to dataport.
\r
61 // Set message descriptor
\r
63 (f0.0) if (1) ELSE_UV_8X2T
\r
66 mov (1) MSGDSC MSG_LEN(1)+DWBWMSGDSC+BI_DEST_UV:ud // Write 1 GRF to DEST_UV
\r
68 (f0.1) add (1) MSGSRC.1:d MSGSRC.1:d 8:w // Add vertical offset 8 for bot MB in MBAFF mode
\r
71 else (1) ENDIF_UV_8X2T
\r
74 (f0.1) mov (1) MSGDSC MSG_LEN(1)+DWBWMSGDSC+ENMSGDSCBF+BI_DEST_UV:ud // Write 1 GRF to DEST_UV bottom field
\r
75 (-f0.1) mov (1) MSGDSC MSG_LEN(1)+DWBWMSGDSC+ENMSGDSCTF+BI_DEST_UV:ud // Write 1 GRF to DEST_UV top field
\r
77 asr (1) MSGSRC.1:d MSGSRC.1:d 1:w // Reduce y by half in field access mode
\r
82 send (8) null:ud MSGHDR MSGSRC<8;8,1>:ud DAPWRITE MSGDSC
\r