1@/****************************************************************************** 2@ * 3@ * Copyright (C) 2018 The Android Open Source Project 4@ * 5@ * Licensed under the Apache License, Version 2.0 (the "License"); 6@ * you may not use this file except in compliance with the License. 7@ * You may obtain a copy of the License at: 8@ * 9@ * http://www.apache.org/licenses/LICENSE-2.0 10@ * 11@ * Unless required by applicable law or agreed to in writing, software 12@ * distributed under the License is distributed on an "AS IS" BASIS, 13@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14@ * See the License for the specific language governing permissions and 15@ * limitations under the License. 16@ * 17@ ***************************************************************************** 18@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19@*/ 20 21 22.text 23.p2align 2 24.global ixheaacd_mps_mulshift_acc 25 26ixheaacd_mps_mulshift_acc: 27 28 STMFD sp!, {R4-R12, R14} 29 VPUSH {d8 - d15} 30 LDR R4, [SP, #104] @Argument V_fix 31 LDR R5, [SP, #108] @Argument 2*resolution 32 ASR R6, R5, #1 33 34 MOV R7, R4 35 MOV R11, #40 36 MUL R11, R11, R5 37 ADD R7, R7, R11 38 LSL R8, R5, #2 39 SUB R8, R7, R8 40 MOV R10, #9 41 MUL R9, R5, R10 42 43COPYLOOP: 44 SUB R8, R8, #32 45 VLD1.32 {Q0, Q1}, [R8] 46 SUB R7, R7, #32 47 VST1.32 {Q0, Q1}, [R7] 48 SUBS R9, R9, #8 49 BGT COPYLOOP 50 51LOOP: 52 VMOV.I64 Q14, #0 53 VMOV.I64 Q15, #0 54 MOV R7, R6 55 MOV R8, R0 56 MOV R9, R1 57 58LOOP1: 59 VLD1.32 {Q0, Q1}, [R8]! @LOADING values from R0 Sr_fix 60 VLD1.32 {Q2, Q3}, [R9]! @LOADING values from R1 Si_fix 61 VLD1.32 {Q4, Q5}, [R2]! @LOADING values from R2 N.real_fix 62 VLD1.32 {Q6, Q7}, [R3]! @LOADING values from R3 N.imag_fix 63 64 VMULL.S32 Q12, D0, D8 65 VMULL.S32 Q10, D1, D9 66 VMULL.S32 Q11, D3, D11 67 VMULL.S32 Q13, D2, D10 68 69 VMULL.S32 Q0, D4, D12 70 VMULL.S32 Q4, D5, D13 71 VMULL.S32 Q5, D7, D15 72 VMULL.S32 Q1, D6, D14 73 74 VSHR.S64 Q0, Q0, #31 75 VSHR.S64 Q1, Q1, #31 76 VSHR.S64 Q4, Q4, #31 77 VSHR.S64 Q5, Q5, #31 78 79 VSHR.S64 Q12, Q12, #31 80 VSHR.S64 Q13, Q13, #31 81 VSHR.S64 Q10, Q10, #31 82 VSHR.S64 Q11, Q11, #31 83 84 VSUB.I64 Q12, Q12, Q0 85 VSUB.I64 Q13, Q13, Q1 86 VSUB.I64 Q10, Q10, Q4 87 VSUB.I64 Q11, Q11, Q5 88 89 VADD.I64 Q12, Q12, Q13 90 VADD.I64 Q10, Q10, Q11 91 VADD.I64 Q12, Q12, Q10 92 VADD.I64 D24, D24, D25 93 VADD.I64 D28, D28, D24 94 SUBS R7, R7, #8 95 BGT LOOP1 96 97 98 MOV R7, R6 99 MOV R8, R0 100 MOV R9, R1 101 102LOOP2: 103 VLD1.32 {Q0, Q1}, [R8]! @LOADING values from R0 Sr_fix 104 VLD1.32 {Q2, Q3}, [R9]! @LOADING values from R1 Si_fix 105 VLD1.32 {Q4, Q5}, [R2]! @LOADING values from R2 N.real_fix 106 VLD1.32 {Q6, Q7}, [R3]! @LOADING values from R3 N.imag_fix 107 108 VMULL.S32 Q12, D0, D8 109 VMULL.S32 Q10, D1, D9 110 VMULL.S32 Q11, D3, D11 111 VMULL.S32 Q13, D2, D10 112 113 VMULL.S32 Q0, D4, D12 114 VMULL.S32 Q4, D5, D13 115 VMULL.S32 Q5, D7, D15 116 VMULL.S32 Q1, D6, D14 117 118 VSHR.S64 Q12, Q12, #31 119 VSHR.S64 Q13, Q13, #31 120 VSHR.S64 Q10, Q10, #31 121 VSHR.S64 Q11, Q11, #31 122 123 VSHR.S64 Q0, Q0, #31 124 VSHR.S64 Q1, Q1, #31 125 VSHR.S64 Q4, Q4, #31 126 VSHR.S64 Q5, Q5, #31 127 128 VSUB.I64 Q12, Q12, Q0 129 VSUB.I64 Q13, Q13, Q1 130 VSUB.I64 Q10, Q10, Q4 131 VSUB.I64 Q11, Q11, Q5 132 133 VADD.I64 Q12, Q12, Q13 134 VADD.I64 Q10, Q10, Q11 135 VADD.I64 Q12, Q12, Q10 136 VADD.I64 D24, D24, D25 137 VADD.I64 D29, D29, D24 138 SUBS R7, R7, #8 139 BGT LOOP2 140 141 MOV R7, R6 142 MOV R8, R0 143 MOV R9, R1 144 145 146LOOP3: 147 VLD1.32 {Q0, Q1}, [R8]! @LOADING values from R0 Sr_fix 148 VLD1.32 {Q2, Q3}, [R9]! @LOADING values from R1 Si_fix 149 VLD1.32 {Q4, Q5}, [R2]! @LOADING values from R2 N.real_fix 150 VLD1.32 {Q6, Q7}, [R3]! @LOADING values from R3 N.imag_fix 151 152 VMULL.S32 Q12, D0, D8 153 VMULL.S32 Q10, D1, D9 154 VMULL.S32 Q11, D3, D11 155 VMULL.S32 Q13, D2, D10 156 157 VMULL.S32 Q0, D4, D12 158 VMULL.S32 Q4, D5, D13 159 VMULL.S32 Q5, D7, D15 160 VMULL.S32 Q1, D6, D14 161 162 VSHR.S64 Q12, Q12, #31 163 VSHR.S64 Q13, Q13, #31 164 VSHR.S64 Q10, Q10, #31 165 VSHR.S64 Q11, Q11, #31 166 167 VSHR.S64 Q0, Q0, #31 168 VSHR.S64 Q1, Q1, #31 169 VSHR.S64 Q4, Q4, #31 170 VSHR.S64 Q5, Q5, #31 171 172 VSUB.I64 Q12, Q12, Q0 173 VSUB.I64 Q13, Q13, Q1 174 VSUB.I64 Q10, Q10, Q4 175 VSUB.I64 Q11, Q11, Q5 176 177 VADD.I64 Q12, Q12, Q13 178 VADD.I64 Q10, Q10, Q11 179 VADD.I64 Q12, Q12, Q10 180 VADD.I64 D24, D24, D25 181 VADD.I64 D30, D30, D24 182 SUBS R7, R7, #8 183 BGT LOOP3 184 185 MOV R7, R6 186 MOV R8, R0 187 MOV R9, R1 188 189 190LOOP4: 191 VLD1.32 {Q0, Q1}, [R8]! @LOADING values from R0 Sr_fix 192 VLD1.32 {Q2, Q3}, [R9]! @LOADING values from R1 Si_fix 193 VLD1.32 {Q4, Q5}, [R2]! @LOADING values from R2 N.real_fix 194 VLD1.32 {Q6, Q7}, [R3]! @LOADING values from R3 N.imag_fix 195 196 VMULL.S32 Q12, D0, D8 197 VMULL.S32 Q10, D1, D9 198 VMULL.S32 Q11, D3, D11 199 VMULL.S32 Q13, D2, D10 200 201 VMULL.S32 Q0, D4, D12 202 VMULL.S32 Q4, D5, D13 203 VMULL.S32 Q5, D7, D15 204 VMULL.S32 Q1, D6, D14 205 206 VSHR.S64 Q12, Q12, #31 207 VSHR.S64 Q13, Q13, #31 208 VSHR.S64 Q10, Q10, #31 209 VSHR.S64 Q11, Q11, #31 210 211 VSHR.S64 Q0, Q0, #31 212 VSHR.S64 Q1, Q1, #31 213 VSHR.S64 Q4, Q4, #31 214 VSHR.S64 Q5, Q5, #31 215 216 VSUB.I64 Q12, Q12, Q0 217 VSUB.I64 Q13, Q13, Q1 218 VSUB.I64 Q10, Q10, Q4 219 VSUB.I64 Q11, Q11, Q5 220 221 VADD.I64 Q12, Q12, Q13 222 VADD.I64 Q10, Q10, Q11 223 VADD.I64 Q12, Q12, Q10 224 VADD.I64 D24, D24, D25 225 VADD.I64 D31, D31, D24 226 SUBS R7, R7, #8 227 BGT LOOP4 228 229 VQMOVN.S64 D0, Q14 230 VQMOVN.S64 D1, Q15 231 232 VST1.32 {Q0}, [R4]! @Storing values to R4 233 234 SUBS R5, R5, #4 235 BGT LOOP 236 237 VPOP {d8 - d15} 238 LDMFD sp!, {R4-R12, R14} 239 BX LR 240 241