summaryrefslogtreecommitdiff
path: root/plugins/demac/libdemac/predictor-arm.S
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/demac/libdemac/predictor-arm.S')
-rw-r--r--plugins/demac/libdemac/predictor-arm.S694
1 files changed, 0 insertions, 694 deletions
diff --git a/plugins/demac/libdemac/predictor-arm.S b/plugins/demac/libdemac/predictor-arm.S
deleted file mode 100644
index bfb96738..00000000
--- a/plugins/demac/libdemac/predictor-arm.S
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
-
-libdemac - A Monkey's Audio decoder
-
-$Id: predictor-arm.S 21916 2009-07-17 09:17:54Z amiconn $
-
-Copyright (C) Dave Chapman 2007
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
-
-*/
-#include "demac_config.h"
-
- .section ICODE_SECTION_DEMAC_ARM,"ax",%progbits
-
- .align 2
-
-/* NOTE: The following need to be kept in sync with parser.h */
-
-#define YDELAYA 200
-#define YDELAYB 168
-#define XDELAYA 136
-#define XDELAYB 104
-#define YADAPTCOEFFSA 72
-#define XADAPTCOEFFSA 56
-#define YADAPTCOEFFSB 40
-#define XADAPTCOEFFSB 20
-
-/* struct predictor_t members: */
-#define buf 0 /* int32_t* buf */
-
-#define YlastA 4 /* int32_t YlastA; */
-#define XlastA 8 /* int32_t XlastA; */
-
-#define YfilterB 12 /* int32_t YfilterB; */
-#define XfilterA 16 /* int32_t XfilterA; */
-
-#define XfilterB 20 /* int32_t XfilterB; */
-#define YfilterA 24 /* int32_t YfilterA; */
-
-#define YcoeffsA 28 /* int32_t YcoeffsA[4]; */
-#define XcoeffsA 44 /* int32_t XcoeffsA[4]; */
-#define YcoeffsB 60 /* int32_t YcoeffsB[5]; */
-#define XcoeffsB 80 /* int32_t XcoeffsB[5]; */
-
-#define historybuffer 100 /* int32_t historybuffer[] */
-
-@ Macro for loading 2 registers, for various ARM versions.
-@ Registers must start with an even register, and must be consecutive.
-
-.macro LDR2OFS reg1, reg2, base, offset
-#if ARM_ARCH >= 6
- ldrd \reg1, [\base, \offset]
-#else /* ARM_ARCH < 6 */
-#ifdef CPU_ARM7TDMI
- add \reg1, \base, \offset
- ldmia \reg1, {\reg1, \reg2}
-#else /* ARM9 (v4 and v5) is faster this way */
- ldr \reg1, [\base, \offset]
- ldr \reg2, [\base, \offset+4]
-#endif
-#endif /* ARM_ARCH */
-.endm
-
-@ Macro for storing 2 registers, for various ARM versions.
-@ Registers must start with an even register, and must be consecutive.
-
-.macro STR2OFS reg1, reg2, base, offset
-#if ARM_ARCH >= 6
- strd \reg1, [\base, \offset]
-#else
- str \reg1, [\base, \offset]
- str \reg2, [\base, \offset+4]
-#endif
-.endm
-
- .global predictor_decode_stereo
- .type predictor_decode_stereo,%function
-
-@ Register usage:
-@
-@ r0-r11 - scratch
-@ r12 - struct predictor_t* p
-@ r14 - int32_t* p->buf
-
-@ void predictor_decode_stereo(struct predictor_t* p,
-@ int32_t* decoded0,
-@ int32_t* decoded1,
-@ int count)
-
-predictor_decode_stereo:
- stmdb sp!, {r1-r11, lr}
-
- @ r1 (decoded0) is [sp]
- @ r2 (decoded1) is [sp, #4]
- @ r3 (count) is [sp, #8]
-
- mov r12, r0 @ r12 := p
- ldr r14, [r0] @ r14 := p->buf
-
-loop:
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@ PREDICTOR Y
-
-@ Predictor Y, Filter A
-
- ldr r11, [r12, #YlastA] @ r11 := p->YlastA
-
- add r2, r14, #YDELAYA-12 @ r2 := &p->buf[YDELAYA-3]
- ldmia r2, {r2, r3, r10} @ r2 := p->buf[YDELAYA-3]
- @ r3 := p->buf[YDELAYA-2]
- @ r10 := p->buf[YDELAYA-1]
-
- add r6, r12, #YcoeffsA
- ldmia r6, {r6 - r9} @ r6 := p->YcoeffsA[0]
- @ r7 := p->YcoeffsA[1]
- @ r8 := p->YcoeffsA[2]
- @ r9 := p->YcoeffsA[3]
-
- subs r10, r11, r10 @ r10 := r11 - r10
-
- STR2OFS r10, r11, r14, #YDELAYA-4
- @ p->buf[YDELAYA-1] = r10
- @ p->buf[YDELAYA] = r11
-
- mul r0, r11, r6 @ r0 := p->buf[YDELAYA] * p->YcoeffsA[0]
- mla r0, r10, r7, r0 @ r0 += p->buf[YDELAYA-1] * p->YcoeffsA[1]
- mla r0, r3, r8, r0 @ r0 += p->buf[YDELAYA-2] * p->YcoeffsA[2]
- mla r0, r2, r9, r0 @ r0 += p->buf[YDELAYA-3] * p->YcoeffsA[3]
-
- @ flags were set above, in the subs instruction
- mvngt r10, #0
- movlt r10, #1 @ r10 := SIGN(r10) (see .c for SIGN macro)
-
- cmp r11, #0
- mvngt r11, #0
- movlt r11, #1 @ r11 := SIGN(r11) (see .c for SIGN macro)
-
- STR2OFS r10, r11, r14, #YADAPTCOEFFSA-4
- @ p->buf[YADAPTCOEFFSA-1] := r10
- @ p->buf[YADAPTCOEFFSA] := r11
-
- @ NOTE: r0 now contains predictionA - don't overwrite.
-
-@ Predictor Y, Filter B
-
- LDR2OFS r6, r7, r12, #YfilterB @ r6 := p->YfilterB
- @ r7 := p->XfilterA
-
- add r2, r14, #YDELAYB-16 @ r2 := &p->buf[YDELAYB-4]
- ldmia r2, {r2 - r4, r10} @ r2 := p->buf[YDELAYB-4]
- @ r3 := p->buf[YDELAYB-3]
- @ r4 := p->buf[YDELAYB-2]
- @ r10 := p->buf[YDELAYB-1]
-
- rsb r6, r6, r6, lsl #5 @ r6 := r6 * 32 - r6 ( == r6*31)
- sub r11, r7, r6, asr #5 @ r11 (p->buf[YDELAYB]) := r7 - (r6 >> 5)
-
- str r7, [r12, #YfilterB] @ p->YfilterB := r7 (p->XfilterA)
-
- add r5, r12, #YcoeffsB
- ldmia r5, {r5 - r9} @ r5 := p->YcoeffsB[0]
- @ r6 := p->YcoeffsB[1]
- @ r7 := p->YcoeffsB[2]
- @ r8 := p->YcoeffsB[3]
- @ r9 := p->YcoeffsB[4]
-
- subs r10, r11, r10 @ r10 := r11 - r10
-
- STR2OFS r10, r11, r14, #YDELAYB-4
- @ p->buf[YDELAYB-1] = r10
- @ p->buf[YDELAYB] = r11
-
- mul r1, r11, r5 @ r1 := p->buf[YDELAYB] * p->YcoeffsB[0]
- mla r1, r10, r6, r1 @ r1 += p->buf[YDELAYB-1] * p->YcoeffsB[1]
- mla r1, r4, r7, r1 @ r1 += p->buf[YDELAYB-2] * p->YcoeffsB[2]
- mla r1, r3, r8, r1 @ r1 += p->buf[YDELAYB-3] * p->YcoeffsB[3]
- mla r1, r2, r9, r1 @ r1 += p->buf[YDELAYB-4] * p->YcoeffsB[4]
-
- @ flags were set above, in the subs instruction
- mvngt r10, #0
- movlt r10, #1 @ r10 := SIGN(r10) (see .c for SIGN macro)
-
- cmp r11, #0
- mvngt r11, #0
- movlt r11, #1 @ r11 := SIGN(r11) (see .c for SIGN macro)
-
- STR2OFS r10, r11, r14, #YADAPTCOEFFSB-4
- @ p->buf[YADAPTCOEFFSB-1] := r10
- @ p->buf[YADAPTCOEFFSB] := r11
-
- @ r0 still contains predictionA
- @ r1 contains predictionB
-
- @ Finish Predictor Y
-
- ldr r2, [sp] @ r2 := decoded0
- add r0, r0, r1, asr #1 @ r0 := r0 + (r1 >> 1)
- ldr r4, [r12, #YfilterA] @ r4 := p->YfilterA
- ldr r3, [r2] @ r3 := *decoded0
- rsb r4, r4, r4, lsl #5 @ r4 := r4 * 32 - r4 ( == r4*31)
- add r1, r3, r0, asr #10 @ r1 := r3 + (r0 >> 10)
- str r1, [r12, #YlastA] @ p->YlastA := r1
- add r1, r1, r4, asr #5 @ r1 := r1 + (r4 >> 5)
- str r1, [r12, #YfilterA] @ p->YfilterA := r1
-
- @ r1 contains p->YfilterA
- @ r2 contains decoded0
- @ r3 contains *decoded0
-
- @ r5, r6, r7, r8, r9 contain p->YcoeffsB[0..4]
- @ r10, r11 contain p->buf[YADAPTCOEFFSB-1] and p->buf[YADAPTCOEFFSB]
-
- str r1, [r2], #4 @ *(decoded0++) := r1 (p->YfilterA)
- str r2, [sp] @ save decoded0
- cmp r3, #0
- beq 3f
-
- add r2, r14, #YADAPTCOEFFSB-16
- ldmia r2, {r2 - r4} @ r2 := p->buf[YADAPTCOEFFSB-4]
- @ r3 := p->buf[YADAPTCOEFFSB-3]
- @ r4 := p->buf[YADAPTCOEFFSB-2]
- blt 1f
-
- @ *decoded0 > 0
-
- sub r5, r5, r11 @ r5 := p->YcoeffsB[0] - p->buf[YADAPTCOEFFSB]
- sub r6, r6, r10 @ r6 := p->YcoeffsB[1] - p->buf[YADAPTCOEFFSB-1]
- sub r9, r9, r2 @ r9 := p->YcoeffsB[4] - p->buf[YADAPTCOEFFSB-4]
- sub r8, r8, r3 @ r8 := p->YcoeffsB[3] - p->buf[YADAPTCOEFFSB-3]
- sub r7, r7, r4 @ r7 := p->YcoeffsB[2] - p->buf[YADAPTCOEFFSB-2]
-
- add r0, r12, #YcoeffsB
- stmia r0, {r5 - r9} @ Save p->YcoeffsB[]
-
- add r1, r12, #YcoeffsA
- ldmia r1, {r2 - r5} @ r2 := p->YcoeffsA[0]
- @ r3 := p->YcoeffsA[1]
- @ r4 := p->YcoeffsA[2]
- @ r5 := p->YcoeffsA[3]
-
- add r6, r14, #YADAPTCOEFFSA-12
- ldmia r6, {r6 - r9} @ r6 := p->buf[YADAPTCOEFFSA-3]
- @ r7 := p->buf[YADAPTCOEFFSA-2]
- @ r8 := p->buf[YADAPTCOEFFSA-1]
- @ r9 := p->buf[YADAPTCOEFFSA]
-
- sub r5, r5, r6 @ r5 := p->YcoeffsA[3] - p->buf[YADAPTCOEFFSA-3]
- sub r4, r4, r7 @ r4 := p->YcoeffsA[2] - p->buf[YADAPTCOEFFSA-2]
- sub r3, r3, r8 @ r3 := p->YcoeffsA[1] - p->buf[YADAPTCOEFFSA-1]
- sub r2, r2, r9 @ r2 := p->YcoeffsA[0] - p->buf[YADAPTCOEFFSA]
-
- b 2f
-
-
-1: @ *decoded0 < 0
-
- add r5, r5, r11 @ r5 := p->YcoeffsB[0] + p->buf[YADAPTCOEFFSB]
- add r6, r6, r10 @ r6 := p->YcoeffsB[1] + p->buf[YADAPTCOEFFSB-1]
- add r9, r9, r2 @ r9 := p->YcoeffsB[4] + p->buf[YADAPTCOEFFSB-4]
- add r8, r8, r3 @ r9 := p->YcoeffsB[3] + p->buf[YADAPTCOEFFSB-3]
- add r7, r7, r4 @ r8 := p->YcoeffsB[2] + p->buf[YADAPTCOEFFSB-2]
-
- add r0, r12, #YcoeffsB
- stmia r0, {r5 - r9} @ Save p->YcoeffsB[]
-
- add r1, r12, #YcoeffsA
- ldmia r1, {r2 - r5} @ r2 := p->YcoeffsA[0]
- @ r3 := p->YcoeffsA[1]
- @ r4 := p->YcoeffsA[2]
- @ r5 := p->YcoeffsA[3]
-
- add r6, r14, #YADAPTCOEFFSA-12
- ldmia r6, {r6 - r9} @ r6 := p->buf[YADAPTCOEFFSA-3]
- @ r7 := p->buf[YADAPTCOEFFSA-2]
- @ r8 := p->buf[YADAPTCOEFFSA-1]
- @ r9 := p->buf[YADAPTCOEFFSA]
-
- add r5, r5, r6 @ r5 := p->YcoeffsA[3] + p->buf[YADAPTCOEFFSA-3]
- add r4, r4, r7 @ r4 := p->YcoeffsA[2] + p->buf[YADAPTCOEFFSA-2]
- add r3, r3, r8 @ r3 := p->YcoeffsA[1] + p->buf[YADAPTCOEFFSA-1]
- add r2, r2, r9 @ r2 := p->YcoeffsA[0] + p->buf[YADAPTCOEFFSA]
-
-2:
- stmia r1, {r2 - r5} @ Save p->YcoeffsA
-
-3:
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@ PREDICTOR X
-
-@ Predictor X, Filter A
-
- ldr r11, [r12, #XlastA] @ r11 := p->XlastA
-
- add r2, r14, #XDELAYA-12 @ r2 := &p->buf[XDELAYA-3]
- ldmia r2, {r2, r3, r10} @ r2 := p->buf[XDELAYA-3]
- @ r3 := p->buf[XDELAYA-2]
- @ r10 := p->buf[XDELAYA-1]
-
- add r6, r12, #XcoeffsA
- ldmia r6, {r6 - r9} @ r6 := p->XcoeffsA[0]
- @ r7 := p->XcoeffsA[1]
- @ r8 := p->XcoeffsA[2]
- @ r9 := p->XcoeffsA[3]
-
- subs r10, r11, r10 @ r10 := r11 - r10
-
- STR2OFS r10, r11, r14, #XDELAYA-4
- @ p->buf[XDELAYA-1] = r10
- @ p->buf[XDELAYA] = r11
-
- mul r0, r11, r6 @ r0 := p->buf[XDELAYA] * p->XcoeffsA[0]
- mla r0, r10, r7, r0 @ r0 += p->buf[XDELAYA-1] * p->XcoeffsA[1]
- mla r0, r3, r8, r0 @ r0 += p->buf[XDELAYA-2] * p->XcoeffsA[2]
- mla r0, r2, r9, r0 @ r0 += p->buf[XDELAYA-3] * p->XcoeffsA[3]
-
- @ flags were set above, in the subs instruction
- mvngt r10, #0
- movlt r10, #1 @ r10 := SIGN(r10) (see .c for SIGN macro)
-
- cmp r11, #0
- mvngt r11, #0
- movlt r11, #1 @ r11 := SIGN(r11) (see .c for SIGN macro)
-
- STR2OFS r10, r11, r14, #XADAPTCOEFFSA-4
- @ p->buf[XADAPTCOEFFSA-1] := r10
- @ p->buf[XADAPTCOEFFSA] := r11
-
- @ NOTE: r0 now contains predictionA - don't overwrite.
-
-@ Predictor X, Filter B
-
- LDR2OFS r6, r7, r12, #XfilterB @ r6 := p->XfilterB
- @ r7 := p->YfilterA
-
- add r2, r14, #XDELAYB-16 @ r2 := &p->buf[XDELAYB-4]
- ldmia r2, {r2 - r4, r10} @ r2 := p->buf[XDELAYB-4]
- @ r3 := p->buf[XDELAYB-3]
- @ r4 := p->buf[XDELAYB-2]
- @ r10 := p->buf[XDELAYB-1]
-
- rsb r6, r6, r6, lsl #5 @ r6 := r2 * 32 - r6 ( == r6*31)
- sub r11, r7, r6, asr #5 @ r11 (p->buf[XDELAYB]) := r7 - (r6 >> 5)
-
- str r7, [r12, #XfilterB] @ p->XfilterB := r7 (p->YfilterA)
-
- add r5, r12, #XcoeffsB
- ldmia r5, {r5 - r9} @ r5 := p->XcoeffsB[0]
- @ r6 := p->XcoeffsB[1]
- @ r7 := p->XcoeffsB[2]
- @ r8 := p->XcoeffsB[3]
- @ r9 := p->XcoeffsB[4]
-
- subs r10, r11, r10 @ r10 := r11 - r10
-
- STR2OFS r10, r11, r14, #XDELAYB-4
- @ p->buf[XDELAYB-1] = r10
- @ p->buf[XDELAYB] = r11
-
- mul r1, r11, r5 @ r1 := p->buf[XDELAYB] * p->XcoeffsB[0]
- mla r1, r10, r6, r1 @ r1 += p->buf[XDELAYB-1] * p->XcoeffsB[1]
- mla r1, r4, r7, r1 @ r1 += p->buf[XDELAYB-2] * p->XcoeffsB[2]
- mla r1, r3, r8, r1 @ r1 += p->buf[XDELAYB-3] * p->XcoeffsB[3]
- mla r1, r2, r9, r1 @ r1 += p->buf[XDELAYB-4] * p->XcoeffsB[4]
-
- @ flags were set above, in the subs instruction
- mvngt r10, #0
- movlt r10, #1 @ r10 := SIGN(r10) (see .c for SIGN macro)
-
- cmp r11, #0
- mvngt r11, #0
- movlt r11, #1 @ r11 := SIGN(r11) (see .c for SIGN macro)
-
- STR2OFS r10, r11, r14, #XADAPTCOEFFSB-4
- @ p->buf[XADAPTCOEFFSB-1] := r10
- @ p->buf[XADAPTCOEFFSB] := r11
-
- @ r0 still contains predictionA
- @ r1 contains predictionB
-
- @ Finish Predictor X
-
- ldr r2, [sp, #4] @ r2 := decoded1
- add r0, r0, r1, asr #1 @ r0 := r0 + (r1 >> 1)
- ldr r4, [r12, #XfilterA] @ r4 := p->XfilterA
- ldr r3, [r2] @ r3 := *decoded1
- rsb r4, r4, r4, lsl #5 @ r4 := r4 * 32 - r4 ( == r4*31)
- add r1, r3, r0, asr #10 @ r1 := r3 + (r0 >> 10)
- str r1, [r12, #XlastA] @ p->XlastA := r1
- add r1, r1, r4, asr #5 @ r1 := r1 + (r4 >> 5)
- str r1, [r12, #XfilterA] @ p->XfilterA := r1
-
- @ r1 contains p->XfilterA
- @ r2 contains decoded1
- @ r3 contains *decoded1
-
- @ r5, r6, r7, r8, r9 contain p->XcoeffsB[0..4]
- @ r10, r11 contain p->buf[XADAPTCOEFFSB-1] and p->buf[XADAPTCOEFFSB]
-
- str r1, [r2], #4 @ *(decoded1++) := r1 (p->XfilterA)
- str r2, [sp, #4] @ save decoded1
- cmp r3, #0
- beq 3f
-
- add r2, r14, #XADAPTCOEFFSB-16
- ldmia r2, {r2 - r4} @ r2 := p->buf[XADAPTCOEFFSB-4]
- @ r3 := p->buf[XADAPTCOEFFSB-3]
- @ r4 := p->buf[XADAPTCOEFFSB-2]
- blt 1f
-
- @ *decoded1 > 0
-
- sub r5, r5, r11 @ r5 := p->XcoeffsB[0] - p->buf[XADAPTCOEFFSB]
- sub r6, r6, r10 @ r6 := p->XcoeffsB[1] - p->buf[XADAPTCOEFFSB-1]
- sub r9, r9, r2 @ r9 := p->XcoeffsB[4] - p->buf[XADAPTCOEFFSB-4]
- sub r8, r8, r3 @ r8 := p->XcoeffsB[3] - p->buf[XADAPTCOEFFSB-3]
- sub r7, r7, r4 @ r7 := p->XcoeffsB[2] - p->buf[XADAPTCOEFFSB-2]
-
- add r0, r12, #XcoeffsB
- stmia r0, {r5 - r9} @ Save p->XcoeffsB[]
-
- add r1, r12, #XcoeffsA
- ldmia r1, {r2 - r5} @ r2 := p->XcoeffsA[0]
- @ r3 := p->XcoeffsA[1]
- @ r4 := p->XcoeffsA[2]
- @ r5 := p->XcoeffsA[3]
-
- add r6, r14, #XADAPTCOEFFSA-12
- ldmia r6, {r6 - r9} @ r6 := p->buf[XADAPTCOEFFSA-3]
- @ r7 := p->buf[XADAPTCOEFFSA-2]
- @ r8 := p->buf[XADAPTCOEFFSA-1]
- @ r9 := p->buf[XADAPTCOEFFSA]
-
- sub r5, r5, r6 @ r5 := p->XcoeffsA[3] - p->buf[XADAPTCOEFFSA-3]
- sub r4, r4, r7 @ r4 := p->XcoeffsA[2] - p->buf[XADAPTCOEFFSA-2]
- sub r3, r3, r8 @ r3 := p->XcoeffsA[1] - p->buf[XADAPTCOEFFSA-1]
- sub r2, r2, r9 @ r2 := p->XcoeffsA[0] - p->buf[XADAPTCOEFFSA]
-
- b 2f
-
-
-1: @ *decoded1 < 0
-
- add r5, r5, r11 @ r5 := p->XcoeffsB[0] + p->buf[XADAPTCOEFFSB]
- add r6, r6, r10 @ r6 := p->XcoeffsB[1] + p->buf[XADAPTCOEFFSB-1]
- add r9, r9, r2 @ r9 := p->XcoeffsB[4] + p->buf[XADAPTCOEFFSB-4]
- add r8, r8, r3 @ r8 := p->XcoeffsB[3] + p->buf[XADAPTCOEFFSB-3]
- add r7, r7, r4 @ r7 := p->XcoeffsB[2] + p->buf[XADAPTCOEFFSB-2]
-
- add r0, r12, #XcoeffsB
- stmia r0, {r5 - r9} @ Save p->XcoeffsB[]
-
- add r1, r12, #XcoeffsA
- ldmia r1, {r2 - r5} @ r2 := p->XcoeffsA[0]
- @ r3 := p->XcoeffsA[1]
- @ r4 := p->XcoeffsA[2]
- @ r5 := p->XcoeffsA[3]
-
- add r6, r14, #XADAPTCOEFFSA-12
- ldmia r6, {r6 - r9} @ r6 := p->buf[XADAPTCOEFFSA-3]
- @ r7 := p->buf[XADAPTCOEFFSA-2]
- @ r8 := p->buf[XADAPTCOEFFSA-1]
- @ r9 := p->buf[XADAPTCOEFFSA]
-
- add r5, r5, r6 @ r5 := p->XcoeffsA[3] + p->buf[XADAPTCOEFFSA-3]
- add r4, r4, r7 @ r4 := p->XcoeffsA[2] + p->buf[XADAPTCOEFFSA-2]
- add r3, r3, r8 @ r3 := p->XcoeffsA[1] + p->buf[XADAPTCOEFFSA-1]
- add r2, r2, r9 @ r2 := p->XcoeffsA[0] + p->buf[XADAPTCOEFFSA]
-
-2:
- stmia r1, {r2 - r5} @ Save p->XcoeffsA
-
-3:
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@ COMMON
-
- add r14, r14, #4 @ p->buf++
-
- add r11, r12, #historybuffer @ r11 := &p->historybuffer[0]
-
- sub r10, r14, #PREDICTOR_HISTORY_SIZE*4
- @ r10 := p->buf - PREDICTOR_HISTORY_SIZE
-
- ldr r0, [sp, #8]
- cmp r10, r11
- beq move_hist @ The history buffer is full, we need to do a memmove
-
- @ Check loop count
- subs r0, r0, #1
- strne r0, [sp, #8]
- bne loop
-
-done:
- str r14, [r12] @ Save value of p->buf
- add sp, sp, #12 @ Don't bother restoring r1-r3
- ldmia sp!, {r4 - r11, pc}
-
-move_hist:
- @ dest = r11 (p->historybuffer)
- @ src = r14 (p->buf)
- @ n = 200
-
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
-
- ldr r0, [sp, #8]
- add r14, r12, #historybuffer @ p->buf = &p->historybuffer[0]
-
- @ Check loop count
- subs r0, r0, #1
- strne r0, [sp, #8]
- bne loop
-
- b done
- .size predictor_decode_stereo, .-predictor_decode_stereo
-
- .global predictor_decode_mono
- .type predictor_decode_mono,%function
-
-@ Register usage:
-@
-@ r0-r11 - scratch
-@ r12 - struct predictor_t* p
-@ r14 - int32_t* p->buf
-
-@ void predictor_decode_mono(struct predictor_t* p,
-@ int32_t* decoded0,
-@ int count)
-
-predictor_decode_mono:
- stmdb sp!, {r1, r2, r4-r11, lr}
-
- @ r1 (decoded0) is [sp]
- @ r2 (count) is [sp, #4]
-
- mov r12, r0 @ r12 := p
- ldr r14, [r0] @ r14 := p->buf
-
-loopm:
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@ PREDICTOR
-
- ldr r11, [r12, #YlastA] @ r11 := p->YlastA
-
- add r2, r14, #YDELAYA-12 @ r2 := &p->buf[YDELAYA-3]
- ldmia r2, {r2, r3, r10} @ r2 := p->buf[YDELAYA-3]
- @ r3 := p->buf[YDELAYA-2]
- @ r10 := p->buf[YDELAYA-1]
-
- add r5, r12, #YcoeffsA @ r5 := &p->YcoeffsA[0]
- ldmia r5, {r6 - r9} @ r6 := p->YcoeffsA[0]
- @ r7 := p->YcoeffsA[1]
- @ r8 := p->YcoeffsA[2]
- @ r9 := p->YcoeffsA[3]
-
- subs r10, r11, r10 @ r10 := r11 - r10
-
- STR2OFS r10, r11, r14, #YDELAYA-4
- @ p->buf[YDELAYA-1] = r10
- @ p->buf[YDELAYA] = r11
-
- mul r0, r11, r6 @ r0 := p->buf[YDELAYA] * p->YcoeffsA[0]
- mla r0, r10, r7, r0 @ r0 += p->buf[YDELAYA-1] * p->YcoeffsA[1]
- mla r0, r3, r8, r0 @ r0 += p->buf[YDELAYA-2] * p->YcoeffsA[2]
- mla r0, r2, r9, r0 @ r0 += p->buf[YDELAYA-3] * p->YcoeffsA[3]
-
- @ flags were set above, in the subs instruction
- mvngt r10, #0
- movlt r10, #1 @ r10 := SIGN(r10) (see .c for SIGN macro)
-
- cmp r11, #0
- mvngt r11, #0
- movlt r11, #1 @ r11 := SIGN(r11) (see .c for SIGN macro)
-
- STR2OFS r10, r11, r14, #YADAPTCOEFFSA-4
- @ p->buf[YADAPTCOEFFSA-1] := r10
- @ p->buf[YADAPTCOEFFSA] := r11
-
- ldr r2, [sp] @ r2 := decoded0
- ldr r4, [r12, #YfilterA] @ r4 := p->YfilterA
- ldr r3, [r2] @ r3 := *decoded0
- rsb r4, r4, r4, lsl #5 @ r4 := r4 * 32 - r4 ( == r4*31)
- add r1, r3, r0, asr #10 @ r1 := r3 + (r0 >> 10)
- str r1, [r12, #YlastA] @ p->YlastA := r1
- add r1, r1, r4, asr #5 @ r1 := r1 + (r4 >> 5)
- str r1, [r12, #YfilterA] @ p->YfilterA := r1
-
- @ r1 contains p->YfilterA
- @ r2 contains decoded0
- @ r3 contains *decoded0
-
- @ r6, r7, r8, r9 contain p->YcoeffsA[0..3]
- @ r10, r11 contain p->buf[YADAPTCOEFFSA-1] and p->buf[YADAPTCOEFFSA]
-
- str r1, [r2], #4 @ *(decoded0++) := r1 (p->YfilterA)
- str r2, [sp] @ save decoded0
- cmp r3, #0
- beq 3f
-
- LDR2OFS r2, r3, r14, #YADAPTCOEFFSA-12
- @ r2 := p->buf[YADAPTCOEFFSA-3]
- @ r3 := p->buf[YADAPTCOEFFSA-2]
- blt 1f
-
- @ *decoded0 > 0
-
- sub r6, r6, r11 @ r6 := p->YcoeffsA[0] - p->buf[YADAPTCOEFFSA]
- sub r7, r7, r10 @ r7 := p->YcoeffsA[1] - p->buf[YADAPTCOEFFSA-1]
- sub r9, r9, r2 @ r9 := p->YcoeffsA[3] - p->buf[YADAPTCOEFFSA-3]
- sub r8, r8, r3 @ r8 := p->YcoeffsA[2] - p->buf[YADAPTCOEFFSA-2]
-
- b 2f
-
-1: @ *decoded0 < 0
-
- add r6, r6, r11 @ r6 := p->YcoeffsA[0] + p->buf[YADAPTCOEFFSA]
- add r7, r7, r10 @ r7 := p->YcoeffsA[1] + p->buf[YADAPTCOEFFSA-1]
- add r9, r9, r2 @ r9 := p->YcoeffsA[3] + p->buf[YADAPTCOEFFSA-3]
- add r8, r8, r3 @ r8 := p->YcoeffsA[2] + p->buf[YADAPTCOEFFSA-2]
-
-2:
- stmia r5, {r6 - r9} @ Save p->YcoeffsA
-
-3:
-
-@@@@@@@@@@@@@@@@@@@@@@@@@@@ COMMON
-
- add r14, r14, #4 @ p->buf++
-
- add r11, r12, #historybuffer @ r11 := &p->historybuffer[0]
-
- sub r10, r14, #PREDICTOR_HISTORY_SIZE*4
- @ r10 := p->buf - PREDICTOR_HISTORY_SIZE
-
- ldr r0, [sp, #4]
- cmp r10, r11
- beq move_histm @ The history buffer is full, we need to do a memmove
-
- @ Check loop count
- subs r0, r0, #1
- strne r0, [sp, #4]
- bne loopm
-
-donem:
- str r14, [r12] @ Save value of p->buf
- add sp, sp, #8 @ Don't bother restoring r1, r2
- ldmia sp!, {r4 - r11, pc}
-
-move_histm:
- @ dest = r11 (p->historybuffer)
- @ src = r14 (p->buf)
- @ n = 200
-
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
- ldmia r14!, {r0-r9} @ 40 bytes
- stmia r11!, {r0-r9}
-
- ldr r0, [sp, #4]
- add r14, r12, #historybuffer @ p->buf = &p->historybuffer[0]
-
- @ Check loop count
- subs r0, r0, #1
- strne r0, [sp, #4]
- bne loopm
-
- b donem
- .size predictor_decode_mono, .-predictor_decode_mono