omxVCM4P10_TransformDequantChromaDCFromPair_s.s revision 78e52bfac041d71ce53b5b13c2abf78af742b09d
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Copyright (C) 2007-2008 ARM Limited 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// File Name: omxVCM4P10_TransformDequantChromaDCFromPair_s.s 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// OpenMAX DL: v1.0.2 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Revision: 9641 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Date: Thursday, February 7, 2008 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INCLUDE omxtypes_s.h 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project INCLUDE armCOMM_s.h 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IMPORT armVCM4P10_QPDivTable 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IMPORT armVCM4P10_VMatrixQPModTable 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project M_VARIANTS ARM1136JS 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IF ARM1136JS 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;//-------------------------------------- 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Declare input registers 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;//-------------------------------------- 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectppSrc RN 0 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectpDst RN 1 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectQP RN 2 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;//-------------------------------- 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Scratch variable for Unpack2x2 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;//-------------------------------- 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectpSrc RN 9 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValue RN 4 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectValue2 RN 5 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectFlag RN 6 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectstrOffset RN 7 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectcstOffset RN 8 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;//-------------------------------- 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;// Scratch variable 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project;//-------------------------------- 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectr0w0 RN 3 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectr0w1 RN 4 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectc0w0 RN 5 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectc1w0 RN 6 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectreturn RN 0 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectpQPDivTable RN 5 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectpQPModTable RN 6 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectShift RN 9 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectScale RN 2 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectTemp1 RN 3 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectTemp2 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