omxVCM4P10_TransformDequantChromaDCFromPair_s.s revision 0c1bc742181ded4930842b46e9507372f0b1b963
1;//
2;//
3;// File Name:  omxVCM4P10_TransformDequantChromaDCFromPair_s.s
4;// OpenMAX DL: v1.0.2
5;// Revision:   9641
6;// Date:       Thursday, February 7, 2008
7;//
8;// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
9;//
10;//
11;//
12
13
14        INCLUDE omxtypes_s.h
15        INCLUDE armCOMM_s.h
16
17        IMPORT armVCM4P10_QPDivTable
18        IMPORT armVCM4P10_VMatrixQPModTable
19
20        M_VARIANTS ARM1136JS
21
22
23    IF ARM1136JS
24
25;//--------------------------------------
26;// Declare input registers
27;//--------------------------------------
28ppSrc       RN 0
29pDst        RN 1
30QP          RN 2
31
32;//--------------------------------
33;// Scratch variable for Unpack2x2
34;//--------------------------------
35pSrc        RN 9
36Value       RN 4
37Value2      RN 5
38Flag        RN 6
39strOffset   RN 7
40cstOffset   RN 8
41
42;//--------------------------------
43;// Scratch variable
44;//--------------------------------
45r0w0        RN  3
46r0w1        RN  4
47
48c0w0        RN  5
49c1w0        RN  6
50
51return      RN  0
52pQPDivTable RN  5
53pQPModTable    RN  6
54Shift        RN  9
55Scale        RN  2
56
57Temp1       RN  3
58Temp2       RN  4
59Temp3       RN  7
60Temp4       RN  8
61
62        ;// Write function header
63        M_START omxVCM4P10_TransformDequantChromaDCFromPair, r9
64
65
66        LDR     pSrc, [ppSrc]                        ;// Load pSrc
67        MOV     cstOffset, #31                       ;// To be used in the loop, to compute offset
68
69        ;//-----------------------------------------------------------------------
70        ;// Firstly, fill all the coefficient values on the <pDst> buffer by zero
71        ;//-----------------------------------------------------------------------
72
73        MOV      Value,  #0                          ;// Initialize the zero value
74        MOV      Value2,  #0                         ;// Initialize the zero value
75        LDRB     Flag,  [pSrc], #1                   ;// Preload <Flag> before <unpackLoop>
76        STRD     Value, [pDst, #0]                   ;// pDst[0]  = pDst[1]  = pDst[2]  = pDst[3]  = 0
77
78
79unpackLoop
80        TST      Flag,  #0x10                        ;// Computing (Flag & 0x10)
81        LDRSBNE  Value2,[pSrc,#1]
82        LDRBNE   Value, [pSrc], #2                   ;// Load byte wise to avoid unaligned access
83        AND      strOffset, cstOffset, Flag, LSL #1  ;// strOffset = (Flag & 15) < 1;
84        LDRSBEQ  Value, [pSrc], #1                   ;// Value = (OMX_U8)  *pSrc++
85        ORRNE    Value,Value,Value2, LSL #8          ;// Value = (OMX_U16) *pSrc++
86
87        TST      Flag,  #0x20                        ;// Computing (Flag & 0x20) to check, if we're done
88        LDRBEQ   Flag,  [pSrc], #1                   ;// Flag  = (OMX_U8) *pSrc++, for next iteration
89        STRH     Value, [pDst, strOffset]            ;// Store <Value> at offset <strOffset>
90        BEQ      unpackLoop                          ;// Branch to the loop beginning
91
92        LDMIA    pDst, {r0w0, r0w1}                  ;// r0w0 = |c1|c0| & r0w1 = |c3|c2|
93
94
95        STR      pSrc, [ppSrc]                       ;// Update the bitstream pointer
96
97        LDR      pQPDivTable, =armVCM4P10_QPDivTable ;// QP Division look-up-table base pointer
98        LDR      pQPModTable, =armVCM4P10_VMatrixQPModTable ;// QP Modulo look-up-table base pointer
99
100        SADDSUBX r0w0, r0w0,  r0w0                   ;// [ c00+c01, c00-c01 ]
101        SADDSUBX r0w1, r0w1,  r0w1                   ;// [ c10+c11, c10-c11 ]
102
103        LDRSB    Shift, [pQPDivTable, QP]            ;// Shift = pQPDivTable[QP]
104        LDRSB    Scale, [pQPModTable, QP]            ;// Scale = pQPModTable[QP]
105
106        SADD16   c0w0, r0w0, r0w1                    ;// [ d00+d10, d01+d11 ]
107        SSUB16   c1w0, r0w0, r0w1                    ;// [ d00-d10, d01-d11 ]
108
109        LSL      Scale, Scale, Shift                 ;// Scale = Scale << Shift
110
111        SMULTB   Temp2, c0w0,  Scale                 ;// Temp2 = T(c0w0) * Scale
112        SMULTB   Temp4, c1w0,  Scale                 ;// Temp4 = T(c1w0) * Scale
113        SMULBB   Temp1, c0w0,  Scale                 ;// Temp1 = B(c0w0) * Scale
114        SMULBB   Temp3, c1w0,  Scale                 ;// Temp3 = B(c1w0) * Scale
115        MOV      Temp2, Temp2, ASR #1                ;// Temp2 = Temp2 >> 1 & Temp1 = (Temp1 >> 1) << 16
116        MOV      Temp4, Temp4, ASR #1                ;// Temp4 = Temp4 >> 1 & Temp3 = (Temp3 >> 1) << 16
117        PKHBT    c0w0,  Temp2, Temp1, LSL #15        ;// c0w0  = | Temp1 | Temp2 |
118        PKHBT    c1w0,  Temp4, Temp3, LSL #15        ;// c1w0  = | Temp3 | Temp4 |
119        STMIA    pDst, {c0w0, c1w0}                  ;// Storing all the coefficients at once
120        MOV      return, #OMX_Sts_NoErr
121        M_END
122
123    ENDIF ;// ARM1136JS
124
125
126
127
128    END
129