1;//
2;// Copyright (C) 2007-2008 ARM Limited
3;//
4;// Licensed under the Apache License, Version 2.0 (the "License");
5;// you may not use this file except in compliance with the License.
6;// You may obtain a copy of the License at
7;//
8;//      http://www.apache.org/licenses/LICENSE-2.0
9;//
10;// Unless required by applicable law or agreed to in writing, software
11;// distributed under the License is distributed on an "AS IS" BASIS,
12;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13;// See the License for the specific language governing permissions and
14;// limitations under the License.
15;//
16;//
17;//
18;// File Name:  omxVCM4P10_TransformDequantChromaDCFromPair_s.s
19;// OpenMAX DL: v1.0.2
20;// Revision:   9641
21;// Date:       Thursday, February 7, 2008
22;//
23;//
24;//
25;//
26
27
28        INCLUDE omxtypes_s.h
29        INCLUDE armCOMM_s.h
30
31        IMPORT armVCM4P10_QPDivTable
32        IMPORT armVCM4P10_VMatrixQPModTable
33
34        M_VARIANTS ARM1136JS
35
36
37    IF ARM1136JS
38
39;//--------------------------------------
40;// Declare input registers
41;//--------------------------------------
42ppSrc       RN 0
43pDst        RN 1
44QP          RN 2
45
46;//--------------------------------
47;// Scratch variable for Unpack2x2
48;//--------------------------------
49pSrc        RN 9
50Value       RN 4
51Value2      RN 5
52Flag        RN 6
53strOffset   RN 7
54cstOffset   RN 8
55
56;//--------------------------------
57;// Scratch variable
58;//--------------------------------
59r0w0        RN  3
60r0w1        RN  4
61
62c0w0        RN  5
63c1w0        RN  6
64
65return      RN  0
66pQPDivTable RN  5
67pQPModTable    RN  6
68Shift        RN  9
69Scale        RN  2
70
71Temp1       RN  3
72Temp2       RN  4
73Temp3       RN  7
74Temp4       RN  8
75
76        ;// Write function header
77        M_START omxVCM4P10_TransformDequantChromaDCFromPair, r9
78
79
80        LDR     pSrc, [ppSrc]                        ;// Load pSrc
81        MOV     cstOffset, #31                       ;// To be used in the loop, to compute offset
82
83        ;//-----------------------------------------------------------------------
84        ;// Firstly, fill all the coefficient values on the <pDst> buffer by zero
85        ;//-----------------------------------------------------------------------
86
87        MOV      Value,  #0                          ;// Initialize the zero value
88        MOV      Value2,  #0                         ;// Initialize the zero value
89        LDRB     Flag,  [pSrc], #1                   ;// Preload <Flag> before <unpackLoop>
90        STRD     Value, [pDst, #0]                   ;// pDst[0]  = pDst[1]  = pDst[2]  = pDst[3]  = 0
91
92
93unpackLoop
94        TST      Flag,  #0x10                        ;// Computing (Flag & 0x10)
95        LDRSBNE  Value2,[pSrc,#1]
96        LDRBNE   Value, [pSrc], #2                   ;// Load byte wise to avoid unaligned access
97        AND      strOffset, cstOffset, Flag, LSL #1  ;// strOffset = (Flag & 15) < 1;
98        LDRSBEQ  Value, [pSrc], #1                   ;// Value = (OMX_U8)  *pSrc++
99        ORRNE    Value,Value,Value2, LSL #8          ;// Value = (OMX_U16) *pSrc++
100
101        TST      Flag,  #0x20                        ;// Computing (Flag & 0x20) to check, if we're done
102        LDRBEQ   Flag,  [pSrc], #1                   ;// Flag  = (OMX_U8) *pSrc++, for next iteration
103        STRH     Value, [pDst, strOffset]            ;// Store <Value> at offset <strOffset>
104        BEQ      unpackLoop                          ;// Branch to the loop beginning
105
106        LDMIA    pDst, {r0w0, r0w1}                  ;// r0w0 = |c1|c0| & r0w1 = |c3|c2|
107
108
109        STR      pSrc, [ppSrc]                       ;// Update the bitstream pointer
110
111        LDR      pQPDivTable, =armVCM4P10_QPDivTable ;// QP Division look-up-table base pointer
112        LDR      pQPModTable, =armVCM4P10_VMatrixQPModTable ;// QP Modulo look-up-table base pointer
113
114        SADDSUBX r0w0, r0w0,  r0w0                   ;// [ c00+c01, c00-c01 ]
115        SADDSUBX r0w1, r0w1,  r0w1                   ;// [ c10+c11, c10-c11 ]
116
117        LDRSB    Shift, [pQPDivTable, QP]            ;// Shift = pQPDivTable[QP]
118        LDRSB    Scale, [pQPModTable, QP]            ;// Scale = pQPModTable[QP]
119
120        SADD16   c0w0, r0w0, r0w1                    ;// [ d00+d10, d01+d11 ]
121        SSUB16   c1w0, r0w0, r0w1                    ;// [ d00-d10, d01-d11 ]
122
123        LSL      Scale, Scale, Shift                 ;// Scale = Scale << Shift
124
125        SMULTB   Temp2, c0w0,  Scale                 ;// Temp2 = T(c0w0) * Scale
126        SMULTB   Temp4, c1w0,  Scale                 ;// Temp4 = T(c1w0) * Scale
127        SMULBB   Temp1, c0w0,  Scale                 ;// Temp1 = B(c0w0) * Scale
128        SMULBB   Temp3, c1w0,  Scale                 ;// Temp3 = B(c1w0) * Scale
129        MOV      Temp2, Temp2, ASR #1                ;// Temp2 = Temp2 >> 1 & Temp1 = (Temp1 >> 1) << 16
130        MOV      Temp4, Temp4, ASR #1                ;// Temp4 = Temp4 >> 1 & Temp3 = (Temp3 >> 1) << 16
131        PKHBT    c0w0,  Temp2, Temp1, LSL #15        ;// c0w0  = | Temp1 | Temp2 |
132        PKHBT    c1w0,  Temp4, Temp3, LSL #15        ;// c1w0  = | Temp3 | Temp4 |
133        STMIA    pDst, {c0w0, c1w0}                  ;// Storing all the coefficients at once
134        MOV      return, #OMX_Sts_NoErr
135        M_END
136
137    ENDIF ;// ARM1136JS
138
139
140
141
142    END
143