10c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
20c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
30c1bc742181ded4930842b46e9507372f0b1b963James Dong;// File Name:  armVCM4P10_InterpolateLuma_DiagCopy_unsafe_s.s
40c1bc742181ded4930842b46e9507372f0b1b963James Dong;// OpenMAX DL: v1.0.2
50c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Revision:   12290
60c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Date:       Wednesday, April 9, 2008
70c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
80c1bc742181ded4930842b46e9507372f0b1b963James Dong;// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
90c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
100c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
110c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
120c1bc742181ded4930842b46e9507372f0b1b963James Dong
130c1bc742181ded4930842b46e9507372f0b1b963James Dong        INCLUDE omxtypes_s.h
140c1bc742181ded4930842b46e9507372f0b1b963James Dong        INCLUDE armCOMM_s.h
150c1bc742181ded4930842b46e9507372f0b1b963James Dong
160c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_VARIANTS ARM1136JS
170c1bc742181ded4930842b46e9507372f0b1b963James Dong
180c1bc742181ded4930842b46e9507372f0b1b963James Dong        EXPORT armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe
190c1bc742181ded4930842b46e9507372f0b1b963James Dong        EXPORT armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe
200c1bc742181ded4930842b46e9507372f0b1b963James Dong
210c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Functions:
220c1bc742181ded4930842b46e9507372f0b1b963James Dong;//     armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe and
230c1bc742181ded4930842b46e9507372f0b1b963James Dong;//     armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe
240c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
250c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Implements re-arrangement of data from temporary buffer to a buffer pointed by pBuf.
260c1bc742181ded4930842b46e9507372f0b1b963James Dong;// This will do the convertion of data from 16 bit to 8 bit and it also
270c1bc742181ded4930842b46e9507372f0b1b963James Dong;// remove offset and check for saturation.
280c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
290c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Registers used as input for this function
300c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r0,r1,r7 where r0 is input pointer and r2 its step size, r7 is output pointer
310c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
320c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Registers preserved for top level function
330c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r4,r5,r6,r8,r9,r14
340c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
350c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Registers modified by the function
360c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r7,r10,r11,r12
370c1bc742181ded4930842b46e9507372f0b1b963James Dong;//
380c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Output registers
390c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r0 - pointer to the destination location
400c1bc742181ded4930842b46e9507372f0b1b963James Dong;// r1 - step size to this destination location
410c1bc742181ded4930842b46e9507372f0b1b963James Dong
420c1bc742181ded4930842b46e9507372f0b1b963James Dong
430c1bc742181ded4930842b46e9507372f0b1b963James DongDEBUG_ON    SETL {FALSE}
440c1bc742181ded4930842b46e9507372f0b1b963James Dong
450c1bc742181ded4930842b46e9507372f0b1b963James DongMASK            EQU 0x80808080  ;// Mask is used to implement (a+b+1)/2
460c1bc742181ded4930842b46e9507372f0b1b963James Dong
470c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Declare input registers
480c1bc742181ded4930842b46e9507372f0b1b963James Dong
490c1bc742181ded4930842b46e9507372f0b1b963James DongpSrc0           RN 0
500c1bc742181ded4930842b46e9507372f0b1b963James DongsrcStep0        RN 1
510c1bc742181ded4930842b46e9507372f0b1b963James Dong
520c1bc742181ded4930842b46e9507372f0b1b963James Dong;// Declare other intermediate registers
530c1bc742181ded4930842b46e9507372f0b1b963James DongTemp1           RN 4
540c1bc742181ded4930842b46e9507372f0b1b963James DongTemp2           RN 5
550c1bc742181ded4930842b46e9507372f0b1b963James DongTemp3           RN 10
560c1bc742181ded4930842b46e9507372f0b1b963James DongTemp4           RN 11
570c1bc742181ded4930842b46e9507372f0b1b963James DongpBuf            RN 7
580c1bc742181ded4930842b46e9507372f0b1b963James Dongr0x0fe00fe0     RN 6
590c1bc742181ded4930842b46e9507372f0b1b963James Dongr0x00ff00ff     RN 12
600c1bc742181ded4930842b46e9507372f0b1b963James DongCount           RN 14
610c1bc742181ded4930842b46e9507372f0b1b963James DongValueA0         RN 10
620c1bc742181ded4930842b46e9507372f0b1b963James DongValueA1         RN 11
630c1bc742181ded4930842b46e9507372f0b1b963James Dong
640c1bc742181ded4930842b46e9507372f0b1b963James Dong    IF ARM1136JS
650c1bc742181ded4930842b46e9507372f0b1b963James Dong
660c1bc742181ded4930842b46e9507372f0b1b963James Dong
670c1bc742181ded4930842b46e9507372f0b1b963James Dong        ;// Function header
680c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_START armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe, r6
690c1bc742181ded4930842b46e9507372f0b1b963James Dong
700c1bc742181ded4930842b46e9507372f0b1b963James Dong        ;// Code start
710c1bc742181ded4930842b46e9507372f0b1b963James Dong        MOV         Count, #4
720c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         r0x0fe00fe0, =0x0fe00fe0
730c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         r0x00ff00ff, =0x00ff00ff
740c1bc742181ded4930842b46e9507372f0b1b963James DongLoopStart1
750c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp4, [pSrc0, #12]
760c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp3, [pSrc0, #8]
770c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp2, [pSrc0, #4]
780c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_LDR       Temp1, [pSrc0], srcStep0
790c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp4, Temp4, r0x0fe00fe0
800c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp3, Temp3, r0x0fe00fe0
810c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp2, Temp2, r0x0fe00fe0
820c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp1, Temp1, r0x0fe00fe0
830c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp4, #13, Temp4
840c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp3, #13, Temp3
850c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp2, #13, Temp2
860c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp1, #13, Temp1
870c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp4, r0x00ff00ff, Temp4, LSR #5
880c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp3, r0x00ff00ff, Temp3, LSR #5
890c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp2, r0x00ff00ff, Temp2, LSR #5
900c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp1, r0x00ff00ff, Temp1, LSR #5
910c1bc742181ded4930842b46e9507372f0b1b963James Dong        ORR         ValueA1, Temp3, Temp4, LSL #8
920c1bc742181ded4930842b46e9507372f0b1b963James Dong        ORR         ValueA0, Temp1, Temp2, LSL #8
930c1bc742181ded4930842b46e9507372f0b1b963James Dong        SUBS        Count, Count, #1
940c1bc742181ded4930842b46e9507372f0b1b963James Dong        STRD        ValueA0, [pBuf], #8
950c1bc742181ded4930842b46e9507372f0b1b963James Dong        BGT         LoopStart1
960c1bc742181ded4930842b46e9507372f0b1b963James DongEnd1
970c1bc742181ded4930842b46e9507372f0b1b963James Dong        SUB        pSrc0, pBuf, #32
980c1bc742181ded4930842b46e9507372f0b1b963James Dong        MOV        srcStep0, #8
990c1bc742181ded4930842b46e9507372f0b1b963James Dong
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_END
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong        ;// Function header
1040c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_START armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe, r6
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong
1060c1bc742181ded4930842b46e9507372f0b1b963James Dong        ;// Code start
1070c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         r0x0fe00fe0, =0x0fe00fe0
1080c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         r0x00ff00ff, =0x00ff00ff
1090c1bc742181ded4930842b46e9507372f0b1b963James Dong        MOV         Count, #2
1100c1bc742181ded4930842b46e9507372f0b1b963James Dong
1110c1bc742181ded4930842b46e9507372f0b1b963James DongLoopStart
1120c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp4, [pSrc0, #12]
1130c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp3, [pSrc0, #8]
1140c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp2, [pSrc0, #4]
1150c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_LDR       Temp1, [pSrc0], srcStep0
1160c1bc742181ded4930842b46e9507372f0b1b963James Dong
1170c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp4, Temp4, r0x0fe00fe0
1180c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp3, Temp3, r0x0fe00fe0
1190c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp2, Temp2, r0x0fe00fe0
1200c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp1, Temp1, r0x0fe00fe0
1210c1bc742181ded4930842b46e9507372f0b1b963James Dong
1220c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp4, #13, Temp4
1230c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp3, #13, Temp3
1240c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp2, #13, Temp2
1250c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp1, #13, Temp1
1260c1bc742181ded4930842b46e9507372f0b1b963James Dong
1270c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp4, r0x00ff00ff, Temp4, LSR #5
1280c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp3, r0x00ff00ff, Temp3, LSR #5
1290c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp2, r0x00ff00ff, Temp2, LSR #5
1300c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp1, r0x00ff00ff, Temp1, LSR #5
1310c1bc742181ded4930842b46e9507372f0b1b963James Dong        ORR         ValueA1, Temp3, Temp4, LSL #8        ;// [d2 c2 d0 c0]
1320c1bc742181ded4930842b46e9507372f0b1b963James Dong        ORR         ValueA0, Temp1, Temp2, LSL #8        ;// [b2 a2 b0 a0]
1330c1bc742181ded4930842b46e9507372f0b1b963James Dong
1340c1bc742181ded4930842b46e9507372f0b1b963James Dong        PKHBT       Temp1, ValueA0, ValueA1, LSL #16     ;// [d0 c0 b0 a0]
1350c1bc742181ded4930842b46e9507372f0b1b963James Dong
1360c1bc742181ded4930842b46e9507372f0b1b963James Dong        STR         Temp1, [pBuf], #8
1370c1bc742181ded4930842b46e9507372f0b1b963James Dong        PKHTB       Temp2, ValueA1, ValueA0, ASR #16     ;// [d2 c2 b2 a2]
1380c1bc742181ded4930842b46e9507372f0b1b963James Dong        STR         Temp2, [pBuf], #-4
1390c1bc742181ded4930842b46e9507372f0b1b963James Dong
1400c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp4, [pSrc0, #12]
1410c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp3, [pSrc0, #8]
1420c1bc742181ded4930842b46e9507372f0b1b963James Dong        LDR         Temp2, [pSrc0, #4]
1430c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_LDR       Temp1, [pSrc0], srcStep0
1440c1bc742181ded4930842b46e9507372f0b1b963James Dong
1450c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp4, Temp4, r0x0fe00fe0
1460c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp3, Temp3, r0x0fe00fe0
1470c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp2, Temp2, r0x0fe00fe0
1480c1bc742181ded4930842b46e9507372f0b1b963James Dong        UQSUB16     Temp1, Temp1, r0x0fe00fe0
1490c1bc742181ded4930842b46e9507372f0b1b963James Dong
1500c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp4, #13, Temp4
1510c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp3, #13, Temp3
1520c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp2, #13, Temp2
1530c1bc742181ded4930842b46e9507372f0b1b963James Dong        USAT16      Temp1, #13, Temp1
1540c1bc742181ded4930842b46e9507372f0b1b963James Dong
1550c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp4, r0x00ff00ff, Temp4, LSR #5
1560c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp3, r0x00ff00ff, Temp3, LSR #5
1570c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp2, r0x00ff00ff, Temp2, LSR #5
1580c1bc742181ded4930842b46e9507372f0b1b963James Dong        AND         Temp1, r0x00ff00ff, Temp1, LSR #5
1590c1bc742181ded4930842b46e9507372f0b1b963James Dong        ORR         ValueA1, Temp3, Temp4, LSL #8        ;// [d2 c2 d0 c0]
1600c1bc742181ded4930842b46e9507372f0b1b963James Dong        ORR         ValueA0, Temp1, Temp2, LSL #8        ;// [b2 a2 b0 a0]
1610c1bc742181ded4930842b46e9507372f0b1b963James Dong
1620c1bc742181ded4930842b46e9507372f0b1b963James Dong        PKHBT       Temp1, ValueA0, ValueA1, LSL #16     ;// [d0 c0 b0 a0]
1630c1bc742181ded4930842b46e9507372f0b1b963James Dong        SUBS        Count, Count, #1
1640c1bc742181ded4930842b46e9507372f0b1b963James Dong        STR         Temp1, [pBuf], #8
1650c1bc742181ded4930842b46e9507372f0b1b963James Dong        PKHTB       Temp2, ValueA1, ValueA0, ASR #16     ;// [d2 c2 b2 a2]
1660c1bc742181ded4930842b46e9507372f0b1b963James Dong        STR         Temp2, [pBuf], #4
1670c1bc742181ded4930842b46e9507372f0b1b963James Dong
1680c1bc742181ded4930842b46e9507372f0b1b963James Dong        BGT         LoopStart
1690c1bc742181ded4930842b46e9507372f0b1b963James DongEnd2
1700c1bc742181ded4930842b46e9507372f0b1b963James Dong        SUB         pSrc0, pBuf, #32-8
1710c1bc742181ded4930842b46e9507372f0b1b963James Dong        MOV         srcStep0, #4
1720c1bc742181ded4930842b46e9507372f0b1b963James Dong
1730c1bc742181ded4930842b46e9507372f0b1b963James Dong        M_END
1740c1bc742181ded4930842b46e9507372f0b1b963James Dong
1750c1bc742181ded4930842b46e9507372f0b1b963James Dong    ENDIF
1760c1bc742181ded4930842b46e9507372f0b1b963James Dong
1770c1bc742181ded4930842b46e9507372f0b1b963James Dong    END
1780c1bc742181ded4930842b46e9507372f0b1b963James Dong