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