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