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