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: 9641 21 ;// Date: Thursday, February 7, 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 ARM1136JS 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 48 49 50 51 ;// Guarding implementation by the processor name 52 53 IF ARM1136JS 54 55 ;//Input Registers 56 57 pSrcDstPlane RN 0 58 iFrameWidth RN 1 59 iFrameHeight RN 2 60 iExpandPels RN 3 61 62 63 ;//Output Registers 64 65 result RN 0 66 67 ;//Local Scratch Registers 68 69 iPlaneStep RN 4 70 pTop RN 5 71 pBottom RN 6 72 pBottomIndex RN 7 73 x RN 8 74 y RN 9 75 tempTop RN 10 76 tempBot RN 11 77 ColStep RN 12 78 pLeft RN 5 79 pRight RN 6 80 pRightIndex RN 7 81 tempLeft1 RN 10 82 tempRight1 RN 11 83 tempLeft2 RN 14 84 tempRight2 RN 2 85 indexY RN 14 86 RowStep RN 12 87 expandTo4bytes RN 1 ;// copy a byte to 4 bytes of a word 88 89 ;// Allocate stack memory required by the function 90 91 92 ;// Write function header 93 M_START omxVCCOMM_ExpandFrame_I,r11 94 95 ;// Define stack arguments 96 M_ARG iPlaneStepOnStack, 4 97 98 ;// Load argument from the stack 99 M_LDR iPlaneStep, iPlaneStepOnStack 100 101 MUL pTop,iExpandPels,iPlaneStep 102 MLA pBottom,iFrameHeight,iPlaneStep,pSrcDstPlane 103 SUB x,iFrameWidth,#4 104 MOV indexY,pTop 105 ADD ColStep,indexY,#4 106 SUB pBottomIndex,pBottom,iPlaneStep 107 SUB pTop,pSrcDstPlane,pTop 108 109 110 ADD pTop,pTop,x 111 ADD pBottom,pBottom,x 112 113 ;//------------------------------------------------------------------------ 114 ;// The following improves upon the C implmentation 115 ;// The x and y loops are interchanged: This ensures that the values of 116 ;// pSrcDstPlane [x] and pSrcDstPlane [(iFrameHeight - 1) * iPlaneStep + x] 117 ;// which depend only on loop variable 'x' are loaded once and used in 118 ;// multiple stores in the 'Y' loop 119 ;//------------------------------------------------------------------------ 120 121 ;// xloop 122 ExpandFrameTopBotXloop 123 124 LDR tempTop,[pSrcDstPlane,x] 125 ;//------------------------------------------------------------------------ 126 ;// pSrcDstPlane [(iFrameHeight - 1) * iPlaneStep + x] is simplified as: 127 ;// pSrcDstPlane + (iFrameHeight * iPlaneStep) - iPlaneStep + x == 128 ;// pBottom - iPlaneStep + x == pBottomIndex [x] 129 ;// The value of pBottomIndex is calculated above this 'x' loop 130 ;//------------------------------------------------------------------------ 131 LDR tempBot,[pBottomIndex,x] 132 133 ;// yloop 134 MOV y,iExpandPels 135 136 ExpandFrameTopBotYloop 137 SUBS y,y,#1 138 M_STR tempTop,[pTop],iPlaneStep 139 M_STR tempBot,[pBottom],iPlaneStep 140 BGT ExpandFrameTopBotYloop 141 142 SUBS x,x,#4 143 SUB pTop,pTop,ColStep 144 SUB pBottom,pBottom,ColStep 145 BGE ExpandFrameTopBotXloop 146 147 148 ;// y loop 149 ;// The product is already calculated above : Reuse 150 ;//MUL indexY,iExpandPels,iPlaneStep 151 152 SUB pSrcDstPlane,pSrcDstPlane,indexY 153 SUB pLeft,pSrcDstPlane,iExpandPels ;// pLeft->points to the top left of the expanded block 154 ADD pRight,pSrcDstPlane,iFrameWidth 155 SUB pRightIndex,pRight,#1 156 157 ADD y,iFrameHeight,iExpandPels,LSL #1 158 LDR expandTo4bytes,=0x01010101 159 160 RSB RowStep,iExpandPels,iPlaneStep,LSL #1 161 162 ;// The Y Loop is unrolled twice 163 ExpandFrameLeftRightYloop 164 LDRB tempLeft2,[pSrcDstPlane,iPlaneStep] ;// PreLoad the values 165 LDRB tempRight2,[pRightIndex,iPlaneStep] 166 M_LDRB tempLeft1,[pSrcDstPlane],iPlaneStep,LSL #1 ;// PreLoad the values 167 M_LDRB tempRight1,[pRightIndex],iPlaneStep,LSL #1 168 169 SUB x,iExpandPels,#4 170 MUL tempLeft2,tempLeft2,expandTo4bytes ;// Copy the single byte to 4 bytes 171 MUL tempRight2,tempRight2,expandTo4bytes 172 MUL tempLeft1,tempLeft1,expandTo4bytes ;// Copy the single byte to 4 bytes 173 MUL tempRight1,tempRight1,expandTo4bytes 174 175 176 ;// x loop 177 ExpandFrameLeftRightXloop 178 SUBS x,x,#4 179 STR tempLeft2,[pLeft,iPlaneStep] ;// Store the 4 bytes at one go 180 STR tempRight2,[pRight,iPlaneStep] 181 STR tempLeft1,[pLeft],#4 ;// Store the 4 bytes at one go 182 STR tempRight1,[pRight],#4 183 BGE ExpandFrameLeftRightXloop 184 185 SUBS y,y,#2 186 ADD pLeft,pLeft,RowStep 187 ADD pRight,pRight,RowStep 188 BGT ExpandFrameLeftRightYloop 189 190 191 ;// Set return value 192 193 MOV result,#OMX_Sts_NoErr 194 End 195 196 ;// Write function tail 197 198 M_END 199 200 ENDIF ;//ARM1136JS 201 202 203 END 204