Home | History | Annotate | Download | only in src
      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