1 ;// 2 ;// 3 ;// File Name: omxVCCOMM_ExpandFrame_I_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 ;// Description: 13 ;// This function will Expand Frame boundary pixels into Plane 14 ;// 15 ;// 16 17 ;// Include standard headers 18 19 INCLUDE omxtypes_s.h 20 INCLUDE armCOMM_s.h 21 22 M_VARIANTS CortexA8 23 24 ;// Import symbols required from other files 25 ;// (For example tables) 26 27 28 ;// Set debugging level 29 DEBUG_ON SETL {FALSE} 30 31 32 33 IF CortexA8 34 35 M_START omxVCCOMM_ExpandFrame_I,r11 36 37 ;//Input registers 38 39 pSrcDstPlane RN 0 40 iFrameWidth RN 1 41 iFrameHeight RN 2 42 iExpandPels RN 3 43 iPlaneStep RN 4 44 pTop RN 5 45 pBot RN 6 46 pDstTop RN 7 47 pDstBot RN 8 48 pLeft RN 5 49 pRight RN 6 50 pDstLeft RN 9 51 pDstRight RN 10 52 Offset RN 11 53 Temp RN 14 54 Counter RN 12 55 Tmp RN 7 56 ;//Output registers 57 58 result RN 0 59 ;// Neon registers 60 qData0 QN 0.U8 61 qData1 QN 1.U8 62 dData0 DN 0.U8 63 dData1 DN 1.U8 64 dData2 DN 2.U8 65 dData3 DN 3.U8 66 67 ;// Define stack arguments 68 M_ARG pPlaneStep, 4 69 70 ;// Load argument from the stack 71 M_LDR iPlaneStep, pPlaneStep 72 73 SUB pTop, pSrcDstPlane, #0 ;// Top row pointer of the frame 74 MUL Offset, iExpandPels, iPlaneStep ;// E*Step 75 SUB Temp, iFrameHeight, #1 ;// H-1 76 MUL Temp, iPlaneStep, Temp ;// (H-1)*Step 77 ADD pBot, Temp, pSrcDstPlane ;// BPtr = TPtr + (H-1)*Step 78 MOV Temp, iFrameWidth ;// Outer loop counter 79 80 ;// Check if pSrcDstPlane and iPlaneStep are 16 byte aligned 81 TST pSrcDstPlane, #0xf 82 TSTEQ iPlaneStep, #0xf 83 BNE Hor8Loop00 84 85 ;// 86 ;// Copy top and bottom region of the plane as follows 87 ;// top region = top row elements from the frame 88 ;// bottom region = last row elements from the frame 89 ;// 90 91 ;// Case for 16 byte alignment 92 Hor16Loop00 93 SUB pDstTop, pTop, Offset 94 VLD1 qData0, [pTop @128]! 95 MOV Counter, iExpandPels ;// Inner loop counter 96 ADD pDstBot, pBot, iPlaneStep 97 VLD1 qData1, [pBot @128]! 98 Ver16Loop0 99 VST1 qData0, [pDstTop @128], iPlaneStep 100 VST1 qData0, [pDstTop @128], iPlaneStep 101 VST1 qData0, [pDstTop @128], iPlaneStep 102 VST1 qData0, [pDstTop @128], iPlaneStep 103 VST1 qData0, [pDstTop @128], iPlaneStep 104 VST1 qData0, [pDstTop @128], iPlaneStep 105 VST1 qData0, [pDstTop @128], iPlaneStep 106 VST1 qData0, [pDstTop @128], iPlaneStep 107 SUBS Counter, Counter, #8 108 VST1 qData1, [pDstBot @128], iPlaneStep 109 VST1 qData1, [pDstBot @128], iPlaneStep 110 VST1 qData1, [pDstBot @128], iPlaneStep 111 VST1 qData1, [pDstBot @128], iPlaneStep 112 VST1 qData1, [pDstBot @128], iPlaneStep 113 VST1 qData1, [pDstBot @128], iPlaneStep 114 VST1 qData1, [pDstBot @128], iPlaneStep 115 VST1 qData1, [pDstBot @128], iPlaneStep 116 BGT Ver16Loop0 117 118 SUBS Temp, Temp, #16 119 BGT Hor16Loop00 120 B EndAlignedLoop 121 122 ;// Case for 8 byte alignment 123 Hor8Loop00 124 SUB pDstTop, pTop, Offset 125 VLD1 qData0, [pTop @64]! 126 MOV Counter, iExpandPels ;// Inner loop counter 127 ADD pDstBot, pBot, iPlaneStep 128 VLD1 qData1, [pBot @64]! 129 Ver8Loop0 130 VST1 qData0, [pDstTop @64], iPlaneStep 131 VST1 qData0, [pDstTop @64], iPlaneStep 132 VST1 qData0, [pDstTop @64], iPlaneStep 133 VST1 qData0, [pDstTop @64], iPlaneStep 134 VST1 qData0, [pDstTop @64], iPlaneStep 135 VST1 qData0, [pDstTop @64], iPlaneStep 136 VST1 qData0, [pDstTop @64], iPlaneStep 137 VST1 qData0, [pDstTop @64], iPlaneStep 138 SUBS Counter, Counter, #8 139 VST1 qData1, [pDstBot @64], iPlaneStep 140 VST1 qData1, [pDstBot @64], iPlaneStep 141 VST1 qData1, [pDstBot @64], iPlaneStep 142 VST1 qData1, [pDstBot @64], iPlaneStep 143 VST1 qData1, [pDstBot @64], iPlaneStep 144 VST1 qData1, [pDstBot @64], iPlaneStep 145 VST1 qData1, [pDstBot @64], iPlaneStep 146 VST1 qData1, [pDstBot @64], iPlaneStep 147 BGT Ver8Loop0 148 149 SUBS Temp, Temp, #16 150 BGT Hor8Loop00 151 152 EndAlignedLoop 153 ADD Temp, pSrcDstPlane, iFrameWidth 154 SUB pDstRight, Temp, Offset 155 SUB pRight, Temp, #1 156 SUB pDstLeft, pSrcDstPlane, Offset 157 SUB pDstLeft, pDstLeft, iExpandPels 158 ADD pLeft, pSrcDstPlane, #0 159 160 VLD1 {dData0 []}, [pLeft], iPlaneStep ;// Top-Left corner pixel from frame duplicated in dData0 161 SUB Offset, iPlaneStep, iExpandPels 162 VLD1 {dData1 []}, [pRight], iPlaneStep ;// Top-Right corner pixel from frame duplicated in dData1 163 MOV Temp, iExpandPels 164 165 ;// 166 ;// Copy top-left and top-right region of the plane as follows 167 ;// top-left region = top-left corner pixel from the frame 168 ;// top-right region = top-right corner pixel from the frame 169 ;// 170 HorLoop11 171 MOV Counter, iExpandPels 172 VerLoop1 173 VST1 dData0, [pDstLeft], #8 174 SUBS Counter, Counter, #8 175 VST1 dData1, [pDstRight], #8 176 BGT VerLoop1 177 178 SUBS Temp, Temp, #1 179 ADD pDstLeft, pDstLeft, Offset 180 ADD pDstRight, pDstRight, Offset 181 BPL HorLoop11 182 183 SUB iFrameHeight, iFrameHeight, #1 184 ;// 185 ;// Copy left and right region of the plane as follows 186 ;// Left region = copy the row with left start pixel from the frame 187 ;// Right region = copy the row with right end pixel from the frame 188 ;// 189 HorLoop22 190 VLD1 {dData0 []}, [pLeft], iPlaneStep 191 MOV Counter, iExpandPels 192 VLD1 {dData1 []}, [pRight], iPlaneStep 193 VerLoop2 194 VST1 dData0, [pDstLeft], #8 195 SUBS Counter, Counter, #8 196 VST1 dData1, [pDstRight], #8 197 BGT VerLoop2 198 199 SUBS iFrameHeight, iFrameHeight, #1 200 ADD pDstLeft, pDstLeft, Offset 201 ADD pDstRight, pDstRight, Offset 202 BGT HorLoop22 203 204 MOV Temp, iExpandPels 205 ;// 206 ;// Copy bottom-left and bottom-right region of the plane as follows 207 ;// bottom-left region = bottom-left corner pixel from the frame 208 ;// bottom-right region = bottom-right corner pixel from the frame 209 ;// 210 HorLoop33 211 MOV Counter, iExpandPels 212 VerLoop3 213 VST1 dData0, [pDstLeft], #8 214 SUBS Counter, Counter, #8 215 VST1 dData1, [pDstRight], #8 216 BGT VerLoop3 217 218 SUBS Temp, Temp, #1 219 ADD pDstLeft, pDstLeft, Offset 220 ADD pDstRight, pDstRight, Offset 221 BGT HorLoop33 222 End 223 MOV r0, #OMX_Sts_NoErr 224 225 M_END 226 227 ENDIF 228 229 230 231 232 ;// Guarding implementation by the processor name 233 234 235 236 END