blob: 59817952e015e0e7a2239bbf4533ac44b2a71873 [file] [log] [blame]
;//
;// Copyright (C) 2007-2008 ARM Limited
;//
;// Licensed under the Apache License, Version 2.0 (the "License");
;// you may not use this file except in compliance with the License.
;// You may obtain a copy of the License at
;//
;// http://www.apache.org/licenses/LICENSE-2.0
;//
;// Unless required by applicable law or agreed to in writing, software
;// distributed under the License is distributed on an "AS IS" BASIS,
;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;// See the License for the specific language governing permissions and
;// limitations under the License.
;//
;//
;//
;// File Name: omxVCM4P10_TransformDequantChromaDCFromPair_s.s
;// OpenMAX DL: v1.0.2
;// Revision: 12290
;// Date: Wednesday, April 9, 2008
;//
;//
;//
;//
INCLUDE omxtypes_s.h
INCLUDE armCOMM_s.h
IMPORT armVCM4P10_QPDivTable
IMPORT armVCM4P10_VMatrixQPModTable
M_VARIANTS CortexA8
IF CortexA8
;// ARM Registers
;//--------------------------------------
;// Declare input registers
;//--------------------------------------
ppSrc RN 0
pDst RN 1
QP RN 2
;//--------------------------------
;// Scratch variable for Unpack2x2
;//--------------------------------
pSrc RN 9
Value RN 4
Value2 RN 5
Flag RN 6
strOffset RN 7
cstOffset RN 8
;//--------------------------------
;// Scratch variable
;//--------------------------------
r0w0 RN 3
r0w1 RN 4
c0w0 RN 5
c1w0 RN 6
return RN 0
pQPDivTable RN 5
pQPModTable RN 6
Shift RN 9
Scale RN 2
;// Neon Registers
dZero DN D0.U16
dInvTrCoeff DN D0.S16
dScale DN D1.S16
qDqntCoeff QN Q1.S32
dDqntCoeff DN D2.S16
;// Write function header
M_START omxVCM4P10_TransformDequantChromaDCFromPair, r9
LDR pSrc, [ppSrc] ;// Load pSrc
VMOV dZero, #0
MOV cstOffset, #31 ;// To be used in the loop, to compute offset
;//-----------------------------------------------------------------------
;// Firstly, fill all the coefficient values on the <pDst> buffer by zero
;//-----------------------------------------------------------------------
VST1 dZero,[pDst] ;// pDst[0] = pDst[1] = pDst[2] = pDst[3] = 0
LDRB Flag, [pSrc], #1 ;// Preload <Flag> before <unpackLoop>
unpackLoop
TST Flag, #0x10 ;// Computing (Flag & 0x10)
LDRSBNE Value2,[pSrc,#1]
LDRBNE Value, [pSrc], #2 ;// Load byte wise to avoid unaligned access
AND strOffset, cstOffset, Flag, LSL #1 ;// strOffset = (Flag & 15) < 1;
LDRSBEQ Value, [pSrc], #1 ;// Value = (OMX_U8) *pSrc++
ORRNE Value,Value,Value2, LSL #8 ;// Value = (OMX_U16) *pSrc++
TST Flag, #0x20 ;// Computing (Flag & 0x20) to check, if we're done
LDRBEQ Flag, [pSrc], #1 ;// Flag = (OMX_U8) *pSrc++, for next iteration
STRH Value, [pDst, strOffset] ;// Store <Value> at offset <strOffset>
BEQ unpackLoop ;// Branch to the loop beginning
;//--------------------------------------------------
;//InvTransformDC2x2: Inlined (Implemented in ARM V6)
;//--------------------------------------------------
LDMIA pDst, {r0w0, r0w1} ;// r0w0 = |c1|c0| & r0w1 = |c3|c2|
STR pSrc, [ppSrc] ;// Update the bitstream pointer
LDR pQPDivTable, =armVCM4P10_QPDivTable ;// QP Division look-up-table base pointer
LDR pQPModTable, =armVCM4P10_VMatrixQPModTable ;// QP Modulo look-up-table base pointer
SADDSUBX r0w0, r0w0, r0w0 ;// [ c00+c01, c00-c01 ]
SADDSUBX r0w1, r0w1, r0w1 ;// [ c10+c11, c10-c11 ]
LDRSB Shift, [pQPDivTable, QP] ;// Shift = pQPDivTable[QP]
LDRSB Scale, [pQPModTable, QP] ;// Scale = pQPModTable[QP]
SADD16 c0w0, r0w0, r0w1 ;// [ d00+d10, d01+d11 ]
SSUB16 c1w0, r0w0, r0w1 ;// [ d00-d10, d01-d11 ]
;//-------------------------------------------------
;//DequantChromaDC2x2: Inlined (Neon Implementation)
;//-------------------------------------------------
LSL Scale, Scale, Shift ;// Scale = Scale << Shift
VMOV dInvTrCoeff, c0w0, c1w0
VREV32 dInvTrCoeff,dInvTrCoeff
VDUP dScale,Scale
VMULL qDqntCoeff,dInvTrCoeff,dScale
VSHRN dDqntCoeff,qDqntCoeff,#1
VST1 dDqntCoeff,[pDst] ;// Storing all the coefficients at once
MOV return, #OMX_Sts_NoErr
M_END
ENDIF ;// CortexA8
END