;-----------------------------------------------------------------------------
;       JView
;       Frank Lyonnet 1992
;       Transforme Cosinus Discret Inverse
;       Author : Frank Lyonnet
;------------------------------------------------------------------------------

                GET     h.ASMRegs
                GET     h.SWInames

;------------------------------------------------------------------------------
;       my_rev_dct
;------------------------------------------------------------------------------
;       parametre no 1 : DCTELEM * input
;       parametre no 2 : JSAMPARRAY outarray
;       parametre no 3 : int offset
;       parametre no 4 : char * range_limit
;------------------------------------------------------------------------------

ESIZE           EQU     2               ;Un element = un short
DCTSIZE         EQU     8
DCTSIZE2        EQU     64

CONST_BITS      EQU     13
PASS1_BITS      EQU     2

FIX_0_298631336 EQU     2446            ;FIX_1
FIX_0_390180644 EQU     3196            ;FIX_2
FIX_0_541196100 EQU     4433            ;FIX_3
FIX_0_765366865 EQU     6270            ;FIX_4
FIX_0_899976223 EQU     7373            ;FIX_5
FIX_1_175875602 EQU     9633            ;FIX_6
FIX_1_501321110 EQU     12299           ;FIX_7
FIX_1_847759065 EQU     15137           ;FIX_8
FIX_1_961570560 EQU     16069           ;FIX_9
FIX_2_053119869 EQU     16819           ;FIX_10
FIX_2_562915447 EQU     20995           ;FIX_11
FIX_3_072711026 EQU     25172           ;FIX_12

FIX_1_h         EQU     9:SHL:8
FIX_1_l         EQU     142

FIX_2_h         EQU     12:SHL:8
FIX_2_l         EQU     124

FIX_3_h         EQU     17:SHL:8
FIX_3_l         EQU     81

FIX_4_h         EQU     24:SHL:8
FIX_4_l         EQU     126

FIX_5_h         EQU     28:SHL:8
FIX_5_l         EQU     205

FIX_6_h         EQU     37:SHL:8
FIX_6_l         EQU     161

FIX_7_h         EQU     48:SHL:8
FIX_7_l         EQU     11

FIX_8_h         EQU     59:SHL:8
FIX_8_l         EQU     33

FIX_9_h         EQU     62:SHL:8
FIX_9_l         EQU     197

FIX_10_h        EQU     65:SHL:8
FIX_10_l        EQU     179

FIX_11_h        EQU     82:SHL:8
FIX_11_l        EQU     3

FIX_12_h        EQU     98:SHL:8
FIX_12_l        EQU     84

                ;------------------------
                ; MUL054
                ;------------------------
                MACRO
$Label          MUL054  $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          ADD     $tempo, $x, $x, ASL #3
                RSB     $y, $x, tempo, ASL #4
                RSB     $y, $y, $y, ASL #5
                MEND

                ;------------------------
                ; MULM184
                ;------------------------
                MACRO
$Label          MULM184 $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          SUB     $tempo, $x, $x, ASL #4
                ADD     $tempo, $x, $tempo, ASL #2
                RSB     $tempo, $x, $tempo, ASL #3
                RSB     $y, $x, $tempo, ASL #5
                MEND

                ;------------------------
                ; MUL076
                ;------------------------
                MACRO
$Label          MUL076  $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          ADD     $tempo, $x, $x, ASL #1
                RSB     $y, $x, $tempo, ASL #5
                ADD     $y, $y, $y, ASL #5
                MOV     $y, $y, ASL #1

                MEND

                ;------------------------
                ; MUL117
                ;------------------------
                MACRO
$Label          MUL117  $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          ADD     $tempo, $x, $x, ASL #1
                RSB     $tempo, $x, $tempo, ASL #2
                RSB     $tempo, $x, $tempo, ASL #2
                RSB     $tempo, $tempo, $tempo, ASL #3
                ADD     $y, $x, $tempo, ASL #5
                MEND

                ;------------------------
                ; MUL029
                ;------------------------
                MACRO
$Label          MUL029  $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          ADD     $tempo, $x, $x, ASL #3
                ADD     $tempo, $tempo, $tempo, ASL #4
                RSB     $y, $x, $tempo, ASL #3
                MOV     $y, $y, ASL #1
                MEND

                ;------------------------
                ; MUL205
                ;------------------------
                MACRO
$Label          MUL205  $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          ADD     $tempo, $x, $x, ASL #5
                RSB     $tempo, $x, $tempo, ASL #3
                RSB     $tempo, $x, $tempo, ASL #2
                ADD     $tempo, $x, $tempo, ASL #2
                RSB     $y, $x, $tempo, ASL #2
                MEND

                ;------------------------
                ; MUL307
                ;------------------------
                MACRO
$Label          MUL307  $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          RSB     $tempo, $x, $x, ASL #3
                ADD     $y, $x, $tempo, ASL #2
                RSB     $y, $y, $y, ASL #3
                RSB     $y, $y, $y, ASL #5
                MOV     $y, $y, ASL #2
                MEND

                ;------------------------
                ; MUL150
                ;------------------------
                MACRO
$Label          MUL150  $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          RSB     $tempo, $x, $x, ASL #6
                RSB     $y, $y, $tempo, ASL #2
                RSB     $y, $y, $y, ASL #3
                RSB     $y, $y, $y, ASL #3
                MEND

                ;------------------------
                ; MULM089
                ;------------------------
                MACRO
$Label          MULM089 $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          SUB     $tempo, $x, $x, ASL #3
                RSB     $tempo, $x, $tempo, ASL #2
                ADD     $tempo, $x, $tempo, ASL #2
                RSB     $tempo, $x, $tempo, ASL #2
                ADD     $tempo, $x, $tempo, ASL #2
                RSB     $y, $x, $tempo, ASL #2
                MEND

                ;------------------------
                ; MULM256
                ;------------------------
                MACRO
$Label          MULM256 $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          RSB     $tempo, $x, #0
                RSB     $tempo, $x, $tempo, ASL #2
                ADD     $y, $x, $tempo, ASL #2
                ADD     $y, $y, $y, ASL #4
                ADD     $y, $y, $y, ASL #6
                MEND

                ;------------------------
                ; MULM196
                ;------------------------
                MACRO
$Label          MULM196 $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          SUB     $tempo, $x, $x, ASL #6
                ADD     $tempo, $x, $tempo, ASL #2
                RSB     $tempo, $x, $tempo, ASL #4
                RSB     $y, $x, $tempo, ASL #2
                MEND

                ;------------------------
                ; MULM039
                ;------------------------
                MACRO
$Label          MULM039 $y,$x,$tempo
                ASSERT  $y<>$tempo
                ASSERT  $x<>$tempo
$Label          SUB     $tempo, $x, $x, ASL #2
                ADD     $y, $x, $tempo, ASL #4
                ADD     $y, $y, $y, ASL #4
                MOV     $y, $y, ASL #2
                MEND

                ;------------------------
                ; LOADSP
                ;------------------------
                MACRO
$Label          LOADSP  $x,$adr,$offset
$Label          LDR     $x,[$adr,#($offset+2)]
                MOV     $x,$x,ASR#16
                MEND

                ;------------------------
                ; LOADSI
                ;------------------------
                MACRO
$Label          LOADSI  $x,$adr,$offset
$Label          LDR     $x,[$adr,#($offset-2)]
                MOV     $x,$x,ASR#16
                MEND

                ;------------------------
                ; STORESA
                ;------------------------
                MACRO
$Label          STORESA $x,$outarray,$row,$col,$offset,$rangelimit
$Label          LDRB    $x,[$rangelimit,$x]
                LDR     $row,[$outarray,$row,ASL#2]              ;row = swrowptr[row]
                ADD     $row,$row,$col                           ;row = swrowptr[row][col]
                STRB    $x,[$row,$offset]                        ;store a row + offset
                MEND

                ;------------------------
                ; DESCALL
                ;------------------------
                MACRO
$Label          DESCALL $x,$offset
$Label          ADD     $x,$x,#(1:SHL:($offset-1))
                MOV     $x,$x,ASR#$offset
                MOV     $x,$x,ASL#16
                MOV     $x,$x,LSR#16
                MEND

                ;------------------------
                ; DESCALH
                ;------------------------
                MACRO
$Label          DESCALH $x,$offset
$Label          ADD     $x,$x,#(1:SHL:($offset-1))
                MOV     $x,$x,ASR#$offset
                MEND

                ;------------------------
                ; DESCAL
                ;------------------------
                MACRO
$Label          DESCAL  $x,$offset
$Label          ADD     $x,$x,#(1:SHL:($offset-1))
                MOV     $x,$x,ASR#$offset
                MEND




dataptr         RN      0                       ;Pointeur vers un tableau de DCTSIZE2 fois ESIZE
z1              RN      1
outarray        RN      1
z2              RN      2
offset          RN      2
z3              RN      3
rangelimit      RN      3
z4              RN      4
cpt             RN      4
z5              RN      5
row             RN      5
tmp0            RN      6
tmp1            RN      7
tmp2            RN      8
tmp3            RN      9
tmp10           RN      10
tmp11           RN      11
tmp12           RN      12
tmp13           RN      13
tempo           RN      14

                AREA |C$$code|, CODE, READONLY

                EXPORT  |my_rev_dct|

|my_rev_dct|
                STMFD   sp!,{r4-r12,r14}

                LDR     tempo,=outarrayptr
                STR     r1,[tempo]

                LDR     tempo,=offsetptr
                STR     r2,[tempo]

                LDR     tempo,=rangelimitptr
                STR     r3,[tempo]

                LDR     tempo,=stackptr
                STR     r13,[tempo]

                MOV     cpt,#0
                LDR     tempo,=cptptr
                STR     cpt,[tempo]                     ;cpt = 0

pass1
                LDMIA   dataptr,{tmp0,tmp1,tmp2,tmp3}
                ;tmp0=dataptr[0,1] tmp1=dataptr[2,3] tmp2=dataptr[4,5] tmp3=dataptr[6,7]

                MOV     tmp10,tmp0,ASR#16               ;tmp10 = dataptr[1]

                ; Comment added by Rick, 2004/01/29
                ; IF YOU COME HERE TO CHECK THE ORRS R14... ISN'T NON-32BIT, THEN DO NOT
                ; WORRY. In the code below, "tempo" is R14, and the ORR is doing stuff with
                ; a data pointer. This isn't a weird way to set specific PSR bits. :-)

                ORRS    tempo,tmp10,tmp1                ;dataptr[1] | dataptr[2,3] = 0 ?
                BNE     no_zero
                ORRS    tempo,tmp2,tmp3                 ;dataptr[4,5] | dataptr[6,7] = 0 ?
                BNE     no_zero
                                                        ;dataptr[1,2,3,4,5,6,7]=0
                MOV     tmp0,tmp0,ASL#16
                MOV     tmp0,tmp0,ASR#16                ;tmp0 = dataptr[0]
                MOV     tmp0,tmp0,ASL#PASS1_BITS        ;tmp0 = dcval = dataptr[0]<<PASS_1_BITS

                MOV     tmp0,tmp0,ASL#16
                MOV     tmp0,tmp0,LSR#16                ;tmp0 low = dataptr[0]
                ORR     tmp0,tmp0,tmp0,LSL#16           ;tmp0 high = dataptr[0]
                MOV     tmp1,tmp0                       ;tmp1 = tmp0
                MOV     tmp2,tmp0                       ;tmp2 = tmp0
                MOV     tmp3,tmp0

                STMIA   dataptr!,{tmp0,tmp1,tmp2,tmp3}
                ;dataptr += DCTSISE*ESIZE

                B       continue_pass1                  ;continue
no_zero
                ;dataptr[1,2,3,4,5,6,7] <> 0
                LOADSP  z2,dataptr,2*ESIZE              ;z2 = dataptr[2]
                LOADSP  z3,dataptr,6*ESIZE              ;z3 = dataptr[6]

                ADD     z1,z2,z3
                MUL054  z1,z1,tempo
                ;z1 = (z2+z3)*FIX_0_541196100

                MULM184 tmp10,z3,tempo
                ADD     tmp2,z1,tmp10
                ;tmp2 = z1+(z3*(-FIX_1_847759065))

                MUL076  tmp10,z2,tempo
                ADD     tmp3,z1,tmp10
                ;tmp3 = z1+(z2*FIX_0_765366865)

                LOADSP  tmp11,dataptr,0*ESIZE           ;tmp11 = dataptr[0]
                LOADSP  tmp10,dataptr,4*ESIZE           ;tmp10 = dataptr[4]

                ADD     tmp0,tmp11,tmp10
                MOV     tmp0,tmp0,ASL#CONST_BITS        ;tmp0 = (dataptr[0]+dataptr[4])<<CONST_BIT

                SUB     tmp1,tmp11,tmp10
                MOV     tmp1,tmp1,ASL#CONST_BITS        ;tmp1 = (dataptr[0]-dataptr[4])<<CONST_BIT

                ADD     tmp10,tmp0,tmp3                 ;tmp10 = tmp0 + tmp3
                SUB     tmp13,tmp0,tmp3                 ;tmp13 = tmp0 - tmp3
                ADD     tmp11,tmp1,tmp2                 ;tmp11 = tmp1 + tmp2
                SUB     tmp12,tmp1,tmp2                 ;tmp12 = tmp1 - tmp2

                LOADSI  tmp0,dataptr,7*ESIZE            ;tmp0 = dataptr[7]
                LOADSI  tmp1,dataptr,5*ESIZE            ;tmp1 = dataptr[5]
                LOADSI  tmp2,dataptr,3*ESIZE            ;tmp2 = dataptr[3]
                LOADSI  tmp3,dataptr,1*ESIZE            ;tmp3 = dataptr[1]

                ADD     z1,tmp0,tmp3                    ;z1 = tmp0 + tmp3
                ADD     z2,tmp1,tmp2                    ;z2 = tmp1 + tmp2
                ADD     z3,tmp0,tmp2                    ;z3 = tmp0 + tmp2
                ADD     z4,tmp1,tmp3                    ;z4 = tmp1 + tmp3

                ADD     z5,z3,z4
                MUL117  z5,z5,tempo
                ;z5 = (z3+z4)*FIX_1_175875602

                MUL029  tmp0,tmp0,tempo
                ;tmp0 = tmp0*FIX_0_298631336

                MUL205  tmp1,tmp1,tempo
                ;tmp1 = tmp1*FIX_2_053119869

                MUL307  tmp2,tmp2,tempo
                ;tmp2 = tmp2*FIX_3_072711026

                MUL150  tmp3,tmp3,tempo
                ;tmp3 = tmp3*FIX_1_501321110

                MULM089 z1,z1,tempo
                ;z1 = z1*(-FIX_0_899976223)

                MULM256 z2,z2,tempo
                ;z2 = z2*(-FIX_2_562915447)

                MULM196 z3,z3,tempo
                ;z3 = z3*(-FIX_1_961570560)

                MULM039 z4,z4,tempo
                ;z4 = z4*(-FIX_0_390180644)

                ADD     z3,z3,z5                        ;z3 += z5
                ADD     z4,z4,z5                        ;z4 += z5

                ADD     tmp0,tmp0,z1
                ADD     tmp0,tmp0,z3                    ;tmp0 += z1 + z3

                ADD     tmp1,tmp1,z2
                ADD     tmp1,tmp1,z4                    ;tmp1 += z2 + z4

                ADD     tmp2,tmp2,z2
                ADD     tmp2,tmp2,z3                    ;tmp2 += z2 + z3

                ADD     tmp3,tmp3,z1
                ADD     tmp3,tmp3,z4                    ;tmp3 += z1 + z4

                ADD     z1,tmp10,tmp3
                DESCALL z1,CONST_BITS-PASS1_BITS
                ;dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS)

                ADD     tempo,tmp11,tmp2
                DESCALH tempo,CONST_BITS-PASS1_BITS
                ORR     z1,z1,tempo,ASL#16
                ;dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS)

                ADD     z2,tmp12,tmp1
                DESCALL z2,CONST_BITS-PASS1_BITS
                ;dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS)

                ADD     tempo,tmp13,tmp0
                DESCALH tempo,CONST_BITS-PASS1_BITS
                ORR     z2,z2,tempo,ASL#16
                ;dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS)

                SUB     z3,tmp13,tmp0
                DESCALL z3,CONST_BITS-PASS1_BITS
                ;dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS)

                SUB     tempo,tmp12,tmp1
                DESCALH tempo,CONST_BITS-PASS1_BITS
                ORR     z3,z3,tempo,ASL#16
                ;dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS)

                SUB     z4,tmp11,tmp2
                DESCALL z4,CONST_BITS-PASS1_BITS
                ;dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS)


                SUB     tempo,tmp10,tmp3
                DESCALH tempo,CONST_BITS-PASS1_BITS
                ORR     z4,z4,tempo,ASL#16
                ;dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS)


                STMIA   dataptr!,{z1,z2,z3,z4}
continue_pass1

                LDR     tempo,=cptptr
                LDR     cpt,[tempo]
                ADD     cpt,cpt,#1
                CMP     cpt,#DCTSIZE
                STRLO   cpt,[tempo]
                BLO     pass1
fin_pass1
                ;Pass 2
                SUB     dataptr,dataptr,#(DCTSIZE2*ESIZE)       ;dataptr = data

                MOV     cpt,#0
                LDR     tempo,=cptptr
                STR     cpt,[tempo]                             ;cpt = 0
pass2
                ;Pass2 : Frontiere de mot

                LOADSP  z2,dataptr,2*ESIZE*DCTSIZE        ;z2 = dataptr[2]
                LOADSP  z3,dataptr,6*ESIZE*DCTSIZE        ;z3 = dataptr[6]

                ADD     z1,z2,z3
                MUL054  z1,z1,tempo
                ;z1 = (z2+z3)*FIX_0_541196100

                MULM184 tmp10,z3,tempo
                ADD     tmp2,z1,tmp10
                ;tmp2 = z1+(z3*(-FIX_1_847759065))

                MUL076  tmp10,z2,tempo
                ADD     tmp3,z1,tmp10
                ;tmp3 = z1+(z2*FIX_0_765366865)

                LOADSP  tmp10,dataptr,0*ESIZE*DCTSIZE     ;tmp11 = dataptr[0]
                LOADSP  tmp11,dataptr,4*ESIZE*DCTSIZE     ;tmp10 = dataptr[4]

                ADD     tmp0,tmp10,tmp11
                MOV     tmp0,tmp0,ASL#CONST_BITS        ;tmp0 = (dataptr[0]+dataptr[4])<<CONST_BIT

                SUB     tmp1,tmp10,tmp11
                MOV     tmp1,tmp1,ASL#CONST_BITS        ;tmp1 = (dataptr[0]-dataptr[4])<<CONST_BIT

                ADD     tmp10,tmp0,tmp3                 ;tmp10 = tmp0 + tmp3
                SUB     tmp13,tmp0,tmp3                 ;tmp13 = tmp0 - tmp3
                ADD     tmp11,tmp1,tmp2                 ;tmp11 = tmp1 + tmp2
                SUB     tmp12,tmp1,tmp2                 ;tmp12 = tmp1 - tmp2

                LOADSP  tmp0,dataptr,7*ESIZE*DCTSIZE      ;tmp0 = dataptr[7]
                LOADSP  tmp1,dataptr,5*ESIZE*DCTSIZE      ;tmp1 = dataptr[5]
                LOADSP  tmp2,dataptr,3*ESIZE*DCTSIZE      ;tmp2 = dataptr[3]
                LOADSP  tmp3,dataptr,1*ESIZE*DCTSIZE      ;tmp3 = dataptr[1]

                ADD     z1,tmp0,tmp3                    ;z1 = tmp0 + tmp3
                ADD     z2,tmp1,tmp2                    ;z2 = tmp1 + tmp2
                ADD     z3,tmp0,tmp2                    ;z3 = tmp0 + tmp2
                ADD     z4,tmp1,tmp3                    ;z4 = tmp1 + tmp3

                ADD     z5,z3,z4
                MUL117  z5,z5,tempo
                ;z5 = (z3+z4)*FIX_1_175875602

                MUL029  tmp0,tmp0,tempo
                ;tmp0 = tmp0*FIX_0_298631336

                MUL205  tmp1,tmp1,tempo
                ;tmp1 = tmp1*FIX_2_053119869

                MUL307  tmp2,tmp2,tempo
                ;tmp2 = tmp2*FIX_3_072711026

                MUL150  tmp3,tmp3,tempo
                ;tmp3 = tmp3*FIX_1_501321110

                MULM089 z1,z1,tempo
                ;z1 = z1*(-FIX_0_899976223)

                MULM256 z2,z2,tempo
                ;z2 = z2*(-FIX_2_562915447)

                MULM196 z3,z3,tempo
                ;z3 = z3*(-FIX_1_961570560)

                MULM039 z4,z4,tempo
                ;z4 = z4*(-FIX_0_390180644)

                ADD     z3,z3,z5                        ;z3 += z5

                ADD     z4,z4,z5                        ;z4 += z5

                ADD     tmp0,tmp0,z1
                ADD     tmp0,tmp0,z3                    ;tmp0 += z1 + z3

                ADD     tmp1,tmp1,z2
                ADD     tmp1,tmp1,z4                    ;tmp1 += z2 + z4

                ADD     tmp2,tmp2,z2
                ADD     tmp2,tmp2,z3                    ;tmp2 += z2 + z3

                ADD     tmp3,tmp3,z1
                ADD     tmp3,tmp3,z4                    ;tmp3 += z1 + z4

                LDR     tempo,=outarrayptr              ;Recup des variables ( z1,z2,z3,z4 scratched )
                LDMIA   tempo,{outarray,offset,rangelimit,cpt}

                ADD     tempo,tmp10,tmp3
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#0
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS+PASS1_BITS+3)

                SUB     tempo,tmp10,tmp3
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#7
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS+PASS1_BITS+3)

                ADD     tempo,tmp11,tmp2
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#1
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS+PASS1_BITS+3)


                SUB     tempo,tmp11,tmp2
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#6
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS+PASS1_BITS+3)

                ADD     tempo,tmp12,tmp1
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#2
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS+PASS1_BITS+3)

                SUB     tempo,tmp12,tmp1
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#5
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS+PASS1_BITS+3)

                ADD     tempo,tmp13,tmp0
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#3
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS+PASS1_BITS+3)

                SUB     tempo,tmp13,tmp0
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#4
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS+PASS1_BITS+3)


                ADD     cpt,cpt,#1                              ;Incremente cpt
                LDR     tempo,=cptptr
                STR     cpt,[tempo]

                ;Pass 2 : Frontiere de demi-mot

                LOADSI  z2,dataptr,2*ESIZE*DCTSIZE+ESIZE        ;z2 = dataptr[2]
                LOADSI  z3,dataptr,6*ESIZE*DCTSIZE+ESIZE        ;z3 = dataptr[6]

                ADD     z1,z2,z3
                MUL054  z1,z1,tempo
                ;z1 = (z2+z3)*FIX_0_541196100

                MULM184 tmp10,z3,tempo
                ADD     tmp2,z1,tmp10
                ;tmp2 = z1+(z3*(-FIX_1_847759065))

                MUL076  tmp10,z2,tempo
                ADD     tmp3,z1,tmp10
                ;tmp3 = z1+(z2*FIX_0_765366865)

                LOADSI  tmp10,dataptr,0*ESIZE*DCTSIZE+ESIZE     ;tmp11 = dataptr[0]
                LOADSI  tmp11,dataptr,4*ESIZE*DCTSIZE+ESIZE     ;tmp10 = dataptr[4]

                ADD     tmp0,tmp10,tmp11
                MOV     tmp0,tmp0,ASL#CONST_BITS        ;tmp0 = (dataptr[0]+dataptr[4])<<CONST_BIT

                SUB     tmp1,tmp10,tmp11
                MOV     tmp1,tmp1,ASL#CONST_BITS        ;tmp1 = (dataptr[0]-dataptr[4])<<CONST_BIT

                ADD     tmp10,tmp0,tmp3                 ;tmp10 = tmp0 + tmp3
                SUB     tmp13,tmp0,tmp3                 ;tmp13 = tmp0 - tmp3
                ADD     tmp11,tmp1,tmp2                 ;tmp11 = tmp1 + tmp2
                SUB     tmp12,tmp1,tmp2                 ;tmp12 = tmp1 - tmp2

                LOADSI  tmp0,dataptr,7*ESIZE*DCTSIZE+ESIZE      ;tmp0 = dataptr[7]
                LOADSI  tmp1,dataptr,5*ESIZE*DCTSIZE+ESIZE      ;tmp1 = dataptr[5]
                LOADSI  tmp2,dataptr,3*ESIZE*DCTSIZE+ESIZE      ;tmp2 = dataptr[3]
                LOADSI  tmp3,dataptr,1*ESIZE*DCTSIZE+ESIZE      ;tmp3 = dataptr[1]

                ADD     z1,tmp0,tmp3                    ;z1 = tmp0 + tmp3
                ADD     z2,tmp1,tmp2                    ;z2 = tmp1 + tmp2
                ADD     z3,tmp0,tmp2                    ;z3 = tmp0 + tmp2
                ADD     z4,tmp1,tmp3                    ;z4 = tmp1 + tmp3

                ADD     z5,z3,z4
                MUL117  z5,z5,tempo
                ;z5 = (z3+z4)*FIX_1_175875602

                MUL029  tmp0,tmp0,tempo
                ;tmp0 = tmp0*FIX_0_298631336

                MUL205  tmp1,tmp1,tempo
                ;tmp1 = tmp1*FIX_2_053119869

                MUL307  tmp2,tmp2,tempo
                ;tmp2 = tmp2*FIX_3_072711026

                MUL150  tmp3,tmp3,tempo
                ;tmp3 = tmp3*FIX_1_501321110

                MULM089 z1,z1,tempo
                ;z1 = z1*(-FIX_0_899976223)

                MULM256 z2,z2,tempo
                ;z2 = z2*(-FIX_2_562915447)

                MULM196 z3,z3,tempo
                ;z3 = z3*(-FIX_1_961570560)

                MULM039 z4,z4,tempo
                ;z4 = z4*(-FIX_0_390180644)

                ADD     z3,z3,z5                        ;z3 += z5

                ADD     z4,z4,z5                        ;z4 += z5

                ADD     tmp0,tmp0,z1
                ADD     tmp0,tmp0,z3                    ;tmp0 += z1 + z3

                ADD     tmp1,tmp1,z2
                ADD     tmp1,tmp1,z4                    ;tmp1 += z2 + z4

                ADD     tmp2,tmp2,z2
                ADD     tmp2,tmp2,z3                    ;tmp2 += z2 + z3

                ADD     tmp3,tmp3,z1
                ADD     tmp3,tmp3,z4                    ;tmp3 += z1 + z4

                LDR     tempo,=outarrayptr              ;Recup des variables ( z1,z2,z3,z4 scratched )
                LDMIA   tempo,{outarray,offset,rangelimit,cpt}

                ADD     tempo,tmp10,tmp3
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#0
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS+PASS1_BITS+3)

                SUB     tempo,tmp10,tmp3
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#7
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS+PASS1_BITS+3)

                ADD     tempo,tmp11,tmp2
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#1
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS+PASS1_BITS+3)


                SUB     tempo,tmp11,tmp2
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#6
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS+PASS1_BITS+3)

                ADD     tempo,tmp12,tmp1
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#2
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS+PASS1_BITS+3)

                SUB     tempo,tmp12,tmp1
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#5
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS+PASS1_BITS+3)

                ADD     tempo,tmp13,tmp0
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#3
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS+PASS1_BITS+3)

                SUB     tempo,tmp13,tmp0
                DESCAL  tempo,CONST_BITS+PASS1_BITS+3
                MOV     row,#4
                STORESA tempo,outarray,row,cpt,offset,rangelimit
                ;dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS+PASS1_BITS+3)

                ADD     dataptr,dataptr,#(ESIZE*2)        ;dataptr++
continue_pass2
                LDR     tempo,=cptptr
                LDR     cpt,[tempo]
                ADD     cpt,cpt,#1
                CMP     cpt,#DCTSIZE
                STRLO   cpt,[tempo]
                BLO     pass2
fin_pass2
                LDR     tempo,=stackptr
                LDR     r13,[tempo]

                LDMFD   sp!,{r4-r12,r15} ; RICK 2004/01/29 removed '^'

stackptr
                DCD     0
outarrayptr
                DCD     0
offsetptr
                DCD     0
rangelimitptr
                DCD     0
cptptr
                DCD     0

                END
