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 ;//-------------------------------------- 28 ppSrc RN 0 29 pDst RN 1 30 QP RN 2 31 32 ;//-------------------------------- 33 ;// Scratch variable for Unpack2x2 34 ;//-------------------------------- 35 pSrc RN 9 36 Value RN 4 37 Value2 RN 5 38 Flag RN 6 39 strOffset RN 7 40 cstOffset RN 8 41 42 ;//-------------------------------- 43 ;// Scratch variable 44 ;//-------------------------------- 45 r0w0 RN 3 46 r0w1 RN 4 47 48 c0w0 RN 5 49 c1w0 RN 6 50 51 return RN 0 52 pQPDivTable RN 5 53 pQPModTable RN 6 54 Shift RN 9 55 Scale RN 2 56 57 Temp1 RN 3 58 Temp2 RN 4 59 Temp3 RN 7 60 Temp4 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 79 unpackLoop 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