1@/* 2@ ** Copyright 2003-2010, VisualOn, Inc. 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@void Syn_filt_32( 18@ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */ 19@ Word16 m, /* (i) : order of LP filter */ 20@ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */ 21@ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */ 22@ Word16 sig_hi[], /* (o) /16 : synthesis high */ 23@ Word16 sig_lo[], /* (o) /16 : synthesis low */ 24@ Word16 lg /* (i) : size of filtering */ 25@) 26@*************************************************************** 27@ 28@ a[] --- r0 29@ m --- r1 30@ exc[] --- r2 31@ Qnew --- r3 32@ sig_hi[] --- r4 33@ sig_lo[] --- r5 34@ lg --- r6 35 36 .section .text 37 .global Syn_filt_32_asm 38 39Syn_filt_32_asm: 40 41 STMFD r13!, {r4 - r12, r14} 42 LDR r4, [r13, #40] @ get sig_hi[] address 43 LDR r5, [r13, #44] @ get sig_lo[] address 44 45 LDRSH r6, [r0] @ load Aq[0] 46 ADD r7, r3, #4 @ 4 + Q_new 47 MOV r3, r6, ASR r7 @ a0 = Aq[0] >> (4 + Q_new) 48 49 LDR r14, =0xffff 50 LDRSH r6, [r0, #2] @ load Aq[1] 51 LDRSH r7, [r0, #4] @ load Aq[2] 52 LDRSH r8, [r0, #6] @ load Aq[3] 53 LDRSH r9, [r0, #8] @ load Aq[4] 54 AND r6, r6, r14 55 AND r8, r8, r14 56 ORR r10, r6, r7, LSL #16 @ Aq[2] -- Aq[1] 57 ORR r11, r8, r9, LSL #16 @ Aq[4] -- Aq[3] 58 STR r10, [r13, #-4] 59 STR r11, [r13, #-8] 60 61 LDRSH r6, [r0, #10] @ load Aq[5] 62 LDRSH r7, [r0, #12] @ load Aq[6] 63 LDRSH r8, [r0, #14] @ load Aq[7] 64 LDRSH r9, [r0, #16] @ load Aq[8] 65 AND r6, r6, r14 66 AND r8, r8, r14 67 ORR r10, r6, r7, LSL #16 @ Aq[6] -- Aq[5] 68 ORR r11, r8, r9, LSL #16 @ Aq[8] -- Aq[7] 69 STR r10, [r13, #-12] 70 STR r11, [r13, #-16] 71 72 LDRSH r6, [r0, #18] @ load Aq[9] 73 LDRSH r7, [r0, #20] @ load Aq[10] 74 LDRSH r8, [r0, #22] @ load Aq[11] 75 LDRSH r9, [r0, #24] @ load Aq[12] 76 AND r6, r6, r14 77 AND r8, r8, r14 78 ORR r10, r6, r7, LSL #16 @ Aq[10] -- Aq[9] 79 ORR r11, r8, r9, LSL #16 @ Aq[12] -- Aq[11] 80 STR r10, [r13, #-20] 81 STR r11, [r13, #-24] 82 83 LDRSH r6, [r0, #26] @ load Aq[13] 84 LDRSH r7, [r0, #28] @ load Aq[14] 85 LDRSH r8, [r0, #30] @ load Aq[15] 86 LDRSH r9, [r0, #32] @ load Aq[16] 87 AND r6, r6, r14 88 AND r8, r8, r14 89 ORR r10, r6, r7, LSL #16 @ Aq[14] -- Aq[13] 90 ORR r11, r8, r9, LSL #16 @ Aq[16] -- Aq[15] 91 STR r10, [r13, #-28] 92 STR r11, [r13, #-32] 93 94 MOV r8, #0 @ i = 0 95 96LOOP: 97 LDRSH r6, [r5, #-2] @ load sig_lo[i-1] 98 LDRSH r7, [r5, #-4] @ load sig_lo[i-2] 99 100 LDR r11, [r13, #-4] @ Aq[2] -- Aq[1] 101 LDRSH r9, [r5, #-6] @ load sig_lo[i-3] 102 LDRSH r10, [r5, #-8] @ load sig_lo[i-4] 103 104 SMULBB r12, r6, r11 @ sig_lo[i-1] * Aq[1] 105 106 LDRSH r6, [r5, #-10] @ load sig_lo[i-5] 107 SMLABT r12, r7, r11, r12 @ sig_lo[i-2] * Aq[2] 108 LDR r11, [r13, #-8] @ Aq[4] -- Aq[3] 109 LDRSH r7, [r5, #-12] @ load sig_lo[i-6] 110 SMLABB r12, r9, r11, r12 @ sig_lo[i-3] * Aq[3] 111 LDRSH r9, [r5, #-14] @ load sig_lo[i-7] 112 SMLABT r12, r10, r11, r12 @ sig_lo[i-4] * Aq[4] 113 LDR r11, [r13, #-12] @ Aq[6] -- Aq[5] 114 LDRSH r10, [r5, #-16] @ load sig_lo[i-8] 115 SMLABB r12, r6, r11, r12 @ sig_lo[i-5] * Aq[5] 116 LDRSH r6, [r5, #-18] @ load sig_lo[i-9] 117 SMLABT r12, r7, r11, r12 @ sig_lo[i-6] * Aq[6] 118 LDR r11, [r13, #-16] @ Aq[8] -- Aq[7] 119 LDRSH r7, [r5, #-20] @ load sig_lo[i-10] 120 SMLABB r12, r9, r11, r12 @ sig_lo[i-7] * Aq[7] 121 LDRSH r9, [r5, #-22] @ load sig_lo[i-11] 122 SMLABT r12, r10, r11, r12 @ sig_lo[i-8] * Aq[8] 123 LDR r11, [r13, #-20] @ Aq[10] -- Aq[9] 124 LDRSH r10,[r5, #-24] @ load sig_lo[i-12] 125 SMLABB r12, r6, r11, r12 @ sig_lo[i-9] * Aq[9] 126 LDRSH r6, [r5, #-26] @ load sig_lo[i-13] 127 SMLABT r12, r7, r11, r12 @ sig_lo[i-10] * Aq[10] 128 LDR r11, [r13, #-24] @ Aq[12] -- Aq[11] 129 LDRSH r7, [r5, #-28] @ load sig_lo[i-14] 130 SMLABB r12, r9, r11, r12 @ sig_lo[i-11] * Aq[11] 131 LDRSH r9, [r5, #-30] @ load sig_lo[i-15] 132 SMLABT r12, r10, r11, r12 @ sig_lo[i-12] * Aq[12] 133 134 LDR r11, [r13, #-28] @ Aq[14] -- Aq[13] 135 LDRSH r10, [r5, #-32] @ load sig_lo[i-16] 136 SMLABB r12, r6, r11, r12 @ sig_lo[i-13] * Aq[13] 137 SMLABT r12, r7, r11, r12 @ sig_lo[i-14] * Aq[14] 138 139 LDR r11, [r13, #-32] @ Aq[16] -- Aq[15] 140 LDRSH r6, [r2],#2 @ load exc[i] 141 SMLABB r12, r9, r11, r12 @ sig_lo[i-15] * Aq[15] 142 SMLABT r12, r10, r11, r12 @ sig_lo[i-16] * Aq[16] 143 MUL r7, r6, r3 @ exc[i] * a0 144 RSB r14, r12, #0 @ L_tmp 145 MOV r14, r14, ASR #11 @ L_tmp >>= 11 146 ADD r14, r14, r7, LSL #1 @ L_tmp += (exc[i] * a0) << 1 147 148 149 LDRSH r6, [r4, #-2] @ load sig_hi[i-1] 150 LDRSH r7, [r4, #-4] @ load sig_hi[i-2] 151 152 LDR r11, [r13, #-4] @ Aq[2] -- Aq[1] 153 LDRSH r9, [r4, #-6] @ load sig_hi[i-3] 154 LDRSH r10, [r4, #-8] @ load sig_hi[i-4] 155 SMULBB r12, r6, r11 @ sig_hi[i-1] * Aq[1] 156 LDRSH r6, [r4, #-10] @ load sig_hi[i-5] 157 SMLABT r12, r7, r11, r12 @ sig_hi[i-2] * Aq[2] 158 159 LDR r11, [r13, #-8] @ Aq[4] -- Aq[3] 160 LDRSH r7, [r4, #-12] @ load sig_hi[i-6] 161 162 SMLABB r12, r9, r11, r12 @ sig_hi[i-3] * Aq[3] 163 LDRSH r9, [r4, #-14] @ load sig_hi[i-7] 164 165 SMLABT r12, r10, r11, r12 @ sig_hi[i-4] * Aq[4] 166 167 LDR r11, [r13, #-12] @ Aq[6] -- Aq[5] 168 LDRSH r10, [r4, #-16] @ load sig_hi[i-8] 169 170 SMLABB r12, r6, r11, r12 @ sig_hi[i-5] * Aq[5] 171 172 LDRSH r6, [r4, #-18] @ load sig_hi[i-9] 173 SMLABT r12, r7, r11, r12 @ sig_hi[i-6] * Aq[6] 174 175 LDR r11, [r13, #-16] @ Aq[8] -- Aq[7] 176 LDRSH r7, [r4, #-20] @ load sig_hi[i-10] 177 178 SMLABB r12, r9, r11, r12 @ sig_hi[i-7] * Aq[7] 179 180 LDRSH r9, [r4, #-22] @ load sig_hi[i-11] 181 182 SMLABT r12, r10, r11, r12 @ sig_hi[i-8] * Aq[8] 183 184 LDR r11, [r13, #-20] @ Aq[10] -- Aq[9] 185 LDRSH r10,[r4, #-24] @ load sig_hi[i-12] 186 187 SMLABB r12, r6, r11, r12 @ sig_hi[i-9] * Aq[9] 188 LDRSH r6, [r4, #-26] @ load sig_hi[i-13] 189 SMLABT r12, r7, r11, r12 @ sig_hi[i-10] * Aq[10] 190 191 LDR r11, [r13, #-24] @ Aq[12] -- Aq[11] 192 LDRSH r7, [r4, #-28] @ load sig_hi[i-14] 193 SMLABB r12, r9, r11, r12 @ sig_hi[i-11] * Aq[11] 194 LDRSH r9, [r4, #-30] @ load sig_hi[i-15] 195 SMLABT r12, r10, r11, r12 @ sig_hi[i-12] * Aq[12] 196 197 LDR r11, [r13, #-28] @ Aq[14] -- Aq[13] 198 LDRSH r10, [r4, #-32] @ load sig_hi[i-16] 199 SMLABB r12, r6, r11, r12 @ sig_hi[i-13] * Aq[13] 200 SMLABT r12, r7, r11, r12 @ sig_hi[i-14] * Aq[14] 201 202 LDR r11, [r13, #-32] @ Aq[16] -- Aq[15] 203 SMLABB r12, r9, r11, r12 @ sig_hi[i-15] * Aq[15] 204 SMLABT r12, r10, r11, r12 @ sig_hi[i-16] * Aq[16] 205 ADD r6, r12, r12 @ r12 << 1 206 SUB r14, r14, r6 207 MOV r14, r14, LSL #3 @ L_tmp <<=3 208 209 MOV r7, r14, ASR #16 @ L_tmp >> 16 210 211 MOV r14, r14, ASR #4 @ L_tmp >>=4 212 STRH r7, [r4], #2 @ sig_hi[i] = L_tmp >> 16 213 SUB r9, r14, r7, LSL #12 @ sig_lo[i] = L_tmp - (sig_hi[i] << 12) 214 215 ADD r8, r8, #1 216 STRH r9, [r5], #2 217 CMP r8, #64 218 BLT LOOP 219 220Syn_filt_32_end: 221 222 LDMFD r13!, {r4 - r12, r15} 223 @ENDFUNC 224 .end 225 226 227