1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Bluetooth low-complexity, subband codec (SBC) 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (C) 2017 Aurelien Jacobs <aurel@gnuage.org> 5cabdff1aSopenharmony_ci * Copyright (C) 2008-2010 Nokia Corporation 6cabdff1aSopenharmony_ci * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org> 7cabdff1aSopenharmony_ci * Copyright (C) 2004-2005 Henryk Ploetz <henryk@ploetzli.ch> 8cabdff1aSopenharmony_ci * Copyright (C) 2005-2006 Brad Midgley <bmidgley@xmission.com> 9cabdff1aSopenharmony_ci * 10cabdff1aSopenharmony_ci * This file is part of FFmpeg. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 13cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 14cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 15cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 18cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 19cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 20cabdff1aSopenharmony_ci * Lesser General Public License for more details. 21cabdff1aSopenharmony_ci * 22cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 23cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 24cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci/** 28cabdff1aSopenharmony_ci * @file 29cabdff1aSopenharmony_ci * SBC ARMv6 optimizations. The instructions are scheduled for ARM11 pipeline. 30cabdff1aSopenharmony_ci */ 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#include "libavutil/arm/asm.S" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_cifunction ff_sbc_analyze_4_armv6, export=1 35cabdff1aSopenharmony_ci @ r0 = in, r1 = out, r2 = consts 36cabdff1aSopenharmony_ci push {r1, r3-r7, lr} 37cabdff1aSopenharmony_ci push {r8-r12, r14} 38cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #0] 39cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #0] 40cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #16] 41cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #16] 42cabdff1aSopenharmony_ci mov r14, #0x8000 43cabdff1aSopenharmony_ci smlad r3, r4, r6, r14 44cabdff1aSopenharmony_ci smlad r12, r5, r7, r14 45cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #32] 46cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #32] 47cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 48cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 49cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #48] 50cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #48] 51cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 52cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 53cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #64] 54cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #64] 55cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 56cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 57cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #8] 58cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #8] 59cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 @ t1[0] is done 60cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 @ t1[1] is done 61cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #24] 62cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #24] 63cabdff1aSopenharmony_ci pkhtb r3, r12, r3, asr #16 @ combine t1[0] and t1[1] 64cabdff1aSopenharmony_ci smlad r12, r8, r10, r14 65cabdff1aSopenharmony_ci smlad r14, r9, r11, r14 66cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #40] 67cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #40] 68cabdff1aSopenharmony_ci smlad r12, r4, r6, r12 69cabdff1aSopenharmony_ci smlad r14, r5, r7, r14 70cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #56] 71cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #56] 72cabdff1aSopenharmony_ci smlad r12, r8, r10, r12 73cabdff1aSopenharmony_ci smlad r14, r9, r11, r14 74cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #72] 75cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #72] 76cabdff1aSopenharmony_ci smlad r12, r4, r6, r12 77cabdff1aSopenharmony_ci smlad r14, r5, r7, r14 78cabdff1aSopenharmony_ci ldrd r4, r5, [r2, #80] @ start loading cos table 79cabdff1aSopenharmony_ci smlad r12, r8, r10, r12 @ t1[2] is done 80cabdff1aSopenharmony_ci smlad r14, r9, r11, r14 @ t1[3] is done 81cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #88] 82cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #96] 83cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #104] @ cos table fully loaded 84cabdff1aSopenharmony_ci pkhtb r12, r14, r12, asr #16 @ combine t1[2] and t1[3] 85cabdff1aSopenharmony_ci smuad r4, r3, r4 86cabdff1aSopenharmony_ci smuad r5, r3, r5 87cabdff1aSopenharmony_ci smlad r4, r12, r8, r4 88cabdff1aSopenharmony_ci smlad r5, r12, r9, r5 89cabdff1aSopenharmony_ci smuad r6, r3, r6 90cabdff1aSopenharmony_ci smuad r7, r3, r7 91cabdff1aSopenharmony_ci smlad r6, r12, r10, r6 92cabdff1aSopenharmony_ci smlad r7, r12, r11, r7 93cabdff1aSopenharmony_ci pop {r8-r12, r14} 94cabdff1aSopenharmony_ci stmia r1, {r4, r5, r6, r7} 95cabdff1aSopenharmony_ci pop {r1, r3-r7, pc} 96cabdff1aSopenharmony_ciendfunc 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_cifunction ff_sbc_analyze_8_armv6, export=1 99cabdff1aSopenharmony_ci @ r0 = in, r1 = out, r2 = consts 100cabdff1aSopenharmony_ci push {r1, r3-r7, lr} 101cabdff1aSopenharmony_ci push {r8-r12, r14} 102cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #24] 103cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #24] 104cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #56] 105cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #56] 106cabdff1aSopenharmony_ci mov r14, #0x8000 107cabdff1aSopenharmony_ci smlad r3, r4, r6, r14 108cabdff1aSopenharmony_ci smlad r12, r5, r7, r14 109cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #88] 110cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #88] 111cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 112cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 113cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #120] 114cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #120] 115cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 116cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 117cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #152] 118cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #152] 119cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 120cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 121cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #16] 122cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #16] 123cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 @ t1[6] is done 124cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 @ t1[7] is done 125cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #48] 126cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #48] 127cabdff1aSopenharmony_ci pkhtb r3, r12, r3, asr #16 @ combine t1[6] and t1[7] 128cabdff1aSopenharmony_ci str r3, [sp, #-4]! @ save to stack 129cabdff1aSopenharmony_ci smlad r3, r8, r10, r14 130cabdff1aSopenharmony_ci smlad r12, r9, r11, r14 131cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #80] 132cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #80] 133cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 134cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 135cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #112] 136cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #112] 137cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 138cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 139cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #144] 140cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #144] 141cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 142cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 143cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #0] 144cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #0] 145cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 @ t1[4] is done 146cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 @ t1[5] is done 147cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #32] 148cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #32] 149cabdff1aSopenharmony_ci pkhtb r3, r12, r3, asr #16 @ combine t1[4] and t1[5] 150cabdff1aSopenharmony_ci str r3, [sp, #-4]! @ save to stack 151cabdff1aSopenharmony_ci smlad r3, r4, r6, r14 152cabdff1aSopenharmony_ci smlad r12, r5, r7, r14 153cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #64] 154cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #64] 155cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 156cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 157cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #96] 158cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #96] 159cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 160cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 161cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #128] 162cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #128] 163cabdff1aSopenharmony_ci smlad r3, r8, r10, r3 164cabdff1aSopenharmony_ci smlad r12, r9, r11, r12 165cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #8] 166cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #8] 167cabdff1aSopenharmony_ci smlad r3, r4, r6, r3 @ t1[0] is done 168cabdff1aSopenharmony_ci smlad r12, r5, r7, r12 @ t1[1] is done 169cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #40] 170cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #40] 171cabdff1aSopenharmony_ci pkhtb r3, r12, r3, asr #16 @ combine t1[0] and t1[1] 172cabdff1aSopenharmony_ci smlad r12, r8, r10, r14 173cabdff1aSopenharmony_ci smlad r14, r9, r11, r14 174cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #72] 175cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #72] 176cabdff1aSopenharmony_ci smlad r12, r4, r6, r12 177cabdff1aSopenharmony_ci smlad r14, r5, r7, r14 178cabdff1aSopenharmony_ci ldrd r4, r5, [r0, #104] 179cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #104] 180cabdff1aSopenharmony_ci smlad r12, r8, r10, r12 181cabdff1aSopenharmony_ci smlad r14, r9, r11, r14 182cabdff1aSopenharmony_ci ldrd r8, r9, [r0, #136] 183cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #136]! 184cabdff1aSopenharmony_ci smlad r12, r4, r6, r12 185cabdff1aSopenharmony_ci smlad r14, r5, r7, r14 186cabdff1aSopenharmony_ci ldrd r4, r5, [r2, #(160 - 136 + 0)] 187cabdff1aSopenharmony_ci smlad r12, r8, r10, r12 @ t1[2] is done 188cabdff1aSopenharmony_ci smlad r14, r9, r11, r14 @ t1[3] is done 189cabdff1aSopenharmony_ci ldrd r6, r7, [r2, #(160 - 136 + 8)] 190cabdff1aSopenharmony_ci smuad r4, r3, r4 191cabdff1aSopenharmony_ci smuad r5, r3, r5 192cabdff1aSopenharmony_ci pkhtb r12, r14, r12, asr #16 @ combine t1[2] and t1[3] 193cabdff1aSopenharmony_ci @ r3 = t2[0:1] 194cabdff1aSopenharmony_ci @ r12 = t2[2:3] 195cabdff1aSopenharmony_ci pop {r0, r14} @ t2[4:5], t2[6:7] 196cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #(160 - 136 + 32)] 197cabdff1aSopenharmony_ci smuad r6, r3, r6 198cabdff1aSopenharmony_ci smuad r7, r3, r7 199cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #(160 - 136 + 40)] 200cabdff1aSopenharmony_ci smlad r4, r12, r8, r4 201cabdff1aSopenharmony_ci smlad r5, r12, r9, r5 202cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #(160 - 136 + 64)] 203cabdff1aSopenharmony_ci smlad r6, r12, r10, r6 204cabdff1aSopenharmony_ci smlad r7, r12, r11, r7 205cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #(160 - 136 + 72)] 206cabdff1aSopenharmony_ci smlad r4, r0, r8, r4 207cabdff1aSopenharmony_ci smlad r5, r0, r9, r5 208cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #(160 - 136 + 96)] 209cabdff1aSopenharmony_ci smlad r6, r0, r10, r6 210cabdff1aSopenharmony_ci smlad r7, r0, r11, r7 211cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #(160 - 136 + 104)] 212cabdff1aSopenharmony_ci smlad r4, r14, r8, r4 213cabdff1aSopenharmony_ci smlad r5, r14, r9, r5 214cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #(160 - 136 + 16 + 0)] 215cabdff1aSopenharmony_ci smlad r6, r14, r10, r6 216cabdff1aSopenharmony_ci smlad r7, r14, r11, r7 217cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #(160 - 136 + 16 + 8)] 218cabdff1aSopenharmony_ci stmia r1!, {r4, r5} 219cabdff1aSopenharmony_ci smuad r4, r3, r8 220cabdff1aSopenharmony_ci smuad r5, r3, r9 221cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #(160 - 136 + 16 + 32)] 222cabdff1aSopenharmony_ci stmia r1!, {r6, r7} 223cabdff1aSopenharmony_ci smuad r6, r3, r10 224cabdff1aSopenharmony_ci smuad r7, r3, r11 225cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #(160 - 136 + 16 + 40)] 226cabdff1aSopenharmony_ci smlad r4, r12, r8, r4 227cabdff1aSopenharmony_ci smlad r5, r12, r9, r5 228cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #(160 - 136 + 16 + 64)] 229cabdff1aSopenharmony_ci smlad r6, r12, r10, r6 230cabdff1aSopenharmony_ci smlad r7, r12, r11, r7 231cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #(160 - 136 + 16 + 72)] 232cabdff1aSopenharmony_ci smlad r4, r0, r8, r4 233cabdff1aSopenharmony_ci smlad r5, r0, r9, r5 234cabdff1aSopenharmony_ci ldrd r8, r9, [r2, #(160 - 136 + 16 + 96)] 235cabdff1aSopenharmony_ci smlad r6, r0, r10, r6 236cabdff1aSopenharmony_ci smlad r7, r0, r11, r7 237cabdff1aSopenharmony_ci ldrd r10, r11, [r2, #(160 - 136 + 16 + 104)] 238cabdff1aSopenharmony_ci smlad r4, r14, r8, r4 239cabdff1aSopenharmony_ci smlad r5, r14, r9, r5 240cabdff1aSopenharmony_ci smlad r6, r14, r10, r6 241cabdff1aSopenharmony_ci smlad r7, r14, r11, r7 242cabdff1aSopenharmony_ci pop {r8-r12, r14} 243cabdff1aSopenharmony_ci stmia r1!, {r4, r5, r6, r7} 244cabdff1aSopenharmony_ci pop {r1, r3-r7, pc} 245cabdff1aSopenharmony_ciendfunc 246