1 ;// 2 ;// 3 ;// File Name: armVCM4P10_InterpolateLuma_DiagCopy_unsafe_s.s 4 ;// OpenMAX DL: v1.0.2 5 ;// Revision: 12290 6 ;// Date: Wednesday, April 9, 2008 7 ;// 8 ;// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. 9 ;// 10 ;// 11 ;// 12 13 INCLUDE omxtypes_s.h 14 INCLUDE armCOMM_s.h 15 16 M_VARIANTS ARM1136JS 17 18 EXPORT armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe 19 EXPORT armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe 20 21 ;// Functions: 22 ;// armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe and 23 ;// armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe 24 ;// 25 ;// Implements re-arrangement of data from temporary buffer to a buffer pointed by pBuf. 26 ;// This will do the convertion of data from 16 bit to 8 bit and it also 27 ;// remove offset and check for saturation. 28 ;// 29 ;// Registers used as input for this function 30 ;// r0,r1,r7 where r0 is input pointer and r2 its step size, r7 is output pointer 31 ;// 32 ;// Registers preserved for top level function 33 ;// r4,r5,r6,r8,r9,r14 34 ;// 35 ;// Registers modified by the function 36 ;// r7,r10,r11,r12 37 ;// 38 ;// Output registers 39 ;// r0 - pointer to the destination location 40 ;// r1 - step size to this destination location 41 42 43 DEBUG_ON SETL {FALSE} 44 45 MASK EQU 0x80808080 ;// Mask is used to implement (a+b+1)/2 46 47 ;// Declare input registers 48 49 pSrc0 RN 0 50 srcStep0 RN 1 51 52 ;// Declare other intermediate registers 53 Temp1 RN 4 54 Temp2 RN 5 55 Temp3 RN 10 56 Temp4 RN 11 57 pBuf RN 7 58 r0x0fe00fe0 RN 6 59 r0x00ff00ff RN 12 60 Count RN 14 61 ValueA0 RN 10 62 ValueA1 RN 11 63 64 IF ARM1136JS 65 66 67 ;// Function header 68 M_START armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe, r6 69 70 ;// Code start 71 MOV Count, #4 72 LDR r0x0fe00fe0, =0x0fe00fe0 73 LDR r0x00ff00ff, =0x00ff00ff 74 LoopStart1 75 LDR Temp4, [pSrc0, #12] 76 LDR Temp3, [pSrc0, #8] 77 LDR Temp2, [pSrc0, #4] 78 M_LDR Temp1, [pSrc0], srcStep0 79 UQSUB16 Temp4, Temp4, r0x0fe00fe0 80 UQSUB16 Temp3, Temp3, r0x0fe00fe0 81 UQSUB16 Temp2, Temp2, r0x0fe00fe0 82 UQSUB16 Temp1, Temp1, r0x0fe00fe0 83 USAT16 Temp4, #13, Temp4 84 USAT16 Temp3, #13, Temp3 85 USAT16 Temp2, #13, Temp2 86 USAT16 Temp1, #13, Temp1 87 AND Temp4, r0x00ff00ff, Temp4, LSR #5 88 AND Temp3, r0x00ff00ff, Temp3, LSR #5 89 AND Temp2, r0x00ff00ff, Temp2, LSR #5 90 AND Temp1, r0x00ff00ff, Temp1, LSR #5 91 ORR ValueA1, Temp3, Temp4, LSL #8 92 ORR ValueA0, Temp1, Temp2, LSL #8 93 SUBS Count, Count, #1 94 STRD ValueA0, [pBuf], #8 95 BGT LoopStart1 96 End1 97 SUB pSrc0, pBuf, #32 98 MOV srcStep0, #8 99 100 M_END 101 102 103 ;// Function header 104 M_START armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe, r6 105 106 ;// Code start 107 LDR r0x0fe00fe0, =0x0fe00fe0 108 LDR r0x00ff00ff, =0x00ff00ff 109 MOV Count, #2 110 111 LoopStart 112 LDR Temp4, [pSrc0, #12] 113 LDR Temp3, [pSrc0, #8] 114 LDR Temp2, [pSrc0, #4] 115 M_LDR Temp1, [pSrc0], srcStep0 116 117 UQSUB16 Temp4, Temp4, r0x0fe00fe0 118 UQSUB16 Temp3, Temp3, r0x0fe00fe0 119 UQSUB16 Temp2, Temp2, r0x0fe00fe0 120 UQSUB16 Temp1, Temp1, r0x0fe00fe0 121 122 USAT16 Temp4, #13, Temp4 123 USAT16 Temp3, #13, Temp3 124 USAT16 Temp2, #13, Temp2 125 USAT16 Temp1, #13, Temp1 126 127 AND Temp4, r0x00ff00ff, Temp4, LSR #5 128 AND Temp3, r0x00ff00ff, Temp3, LSR #5 129 AND Temp2, r0x00ff00ff, Temp2, LSR #5 130 AND Temp1, r0x00ff00ff, Temp1, LSR #5 131 ORR ValueA1, Temp3, Temp4, LSL #8 ;// [d2 c2 d0 c0] 132 ORR ValueA0, Temp1, Temp2, LSL #8 ;// [b2 a2 b0 a0] 133 134 PKHBT Temp1, ValueA0, ValueA1, LSL #16 ;// [d0 c0 b0 a0] 135 136 STR Temp1, [pBuf], #8 137 PKHTB Temp2, ValueA1, ValueA0, ASR #16 ;// [d2 c2 b2 a2] 138 STR Temp2, [pBuf], #-4 139 140 LDR Temp4, [pSrc0, #12] 141 LDR Temp3, [pSrc0, #8] 142 LDR Temp2, [pSrc0, #4] 143 M_LDR Temp1, [pSrc0], srcStep0 144 145 UQSUB16 Temp4, Temp4, r0x0fe00fe0 146 UQSUB16 Temp3, Temp3, r0x0fe00fe0 147 UQSUB16 Temp2, Temp2, r0x0fe00fe0 148 UQSUB16 Temp1, Temp1, r0x0fe00fe0 149 150 USAT16 Temp4, #13, Temp4 151 USAT16 Temp3, #13, Temp3 152 USAT16 Temp2, #13, Temp2 153 USAT16 Temp1, #13, Temp1 154 155 AND Temp4, r0x00ff00ff, Temp4, LSR #5 156 AND Temp3, r0x00ff00ff, Temp3, LSR #5 157 AND Temp2, r0x00ff00ff, Temp2, LSR #5 158 AND Temp1, r0x00ff00ff, Temp1, LSR #5 159 ORR ValueA1, Temp3, Temp4, LSL #8 ;// [d2 c2 d0 c0] 160 ORR ValueA0, Temp1, Temp2, LSL #8 ;// [b2 a2 b0 a0] 161 162 PKHBT Temp1, ValueA0, ValueA1, LSL #16 ;// [d0 c0 b0 a0] 163 SUBS Count, Count, #1 164 STR Temp1, [pBuf], #8 165 PKHTB Temp2, ValueA1, ValueA0, ASR #16 ;// [d2 c2 b2 a2] 166 STR Temp2, [pBuf], #4 167 168 BGT LoopStart 169 End2 170 SUB pSrc0, pBuf, #32-8 171 MOV srcStep0, #4 172 173 M_END 174 175 ENDIF 176 177 END 178