summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorYoshihisa Uchida <uchida@rockbox.org>2010-06-02 10:54:11 +0000
committerYoshihisa Uchida <uchida@rockbox.org>2010-06-02 10:54:11 +0000
commit6ebe76c147b00d2decd9501ad45ab7fd6db5b9c0 (patch)
treec2e9cf63e53b8ff2ba0529fd454cc1f2f4a7ef0e /apps
parente8a662432af5eedc3b66d505f6d2501f68d50dce (diff)
downloadrockbox-6ebe76c147b00d2decd9501ad45ab7fd6db5b9c0.tar.gz
rockbox-6ebe76c147b00d2decd9501ad45ab7fd6db5b9c0.zip
tta codec: optimize for arm target. pp502x: ~1% speed up.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26478 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r--apps/codecs/libtta/filter_arm.S69
1 files changed, 32 insertions, 37 deletions
diff --git a/apps/codecs/libtta/filter_arm.S b/apps/codecs/libtta/filter_arm.S
index 37c515d3a9..d34b182a04 100644
--- a/apps/codecs/libtta/filter_arm.S
+++ b/apps/codecs/libtta/filter_arm.S
@@ -47,17 +47,17 @@ hybrid_filter:
47 @ r6 fs->error 47 @ r6 fs->error
48 @ lr sum := fs->round 48 @ lr sum := fs->round
49 49
50 add r2, r0, #148 @ r2 = fs->dl
51 add r3, r0, #52 @ r3 = fs->dx
52 add r4, r0, #20 @ r4 = fs->qm
53 ldmia r0, {r5, r6, lr} @ r5 = fs->index 50 ldmia r0, {r5, r6, lr} @ r5 = fs->index
54 @ r6 = fs->error 51 @ r6 = fs->error
55 @ lr = fs->round 52 @ lr = fs->round
56 mov r5, r5, asl #2 53 add r2, r0, #148 @ r2 = fs->dl
57 add r2, r2, r5 @ r2 = fs->dl + fs->index 54 add r3, r0, #52 @ r3 = fs->dx
58 add r3, r3, r5 @ r3 = fs->dx + fs->index 55 add r4, r0, #20 @ r4 = fs->qm
56 add r2, r2, r5 @ r2 = (unsigned char*)fs->dl + fs->index
57 add r3, r3, r5 @ r3 = (unsigned char*)fs->dx + fs->index
59 58
60 cmp r6, #0 59 cmp r6, #0
60 bmi .hf_negative
61 bne .hf_positive 61 bne .hf_positive
62 62
63 @ case fs->error == 0 63 @ case fs->error == 0
@@ -72,17 +72,15 @@ hybrid_filter:
72 ldmia r4!, {r5, r6, r7, r8 } 72 ldmia r4!, {r5, r6, r7, r8 }
73 b .hf2 73 b .hf2
74 74
75.hf_positive: 75.hf_negative:
76 blt .hf_negative 76 @ case fs->error < 0
77
78 @ case fs->error > 0
79 77
80 ldmia r4, {r5, r6, r7, r8 } 78 ldmia r4, {r5, r6, r7, r8 }
81 ldmia r3!, {r9, r10, r11, r12} 79 ldmia r3!, {r9, r10, r11, r12}
82 add r5, r5, r9 80 sub r5, r5, r9
83 add r6, r6, r10 81 sub r6, r6, r10
84 add r7, r7, r11 82 sub r7, r7, r11
85 add r8, r8, r12 83 sub r8, r8, r12
86 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[0], ..., fs->qm[3] 84 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[0], ..., fs->qm[3]
87 ldmia r2!, {r9, r10, r11, r12} 85 ldmia r2!, {r9, r10, r11, r12}
88 mla lr, r5, r9, lr 86 mla lr, r5, r9, lr
@@ -91,22 +89,22 @@ hybrid_filter:
91 mla lr, r8, r12, lr 89 mla lr, r8, r12, lr
92 ldmia r4, {r5, r6, r7, r8 } 90 ldmia r4, {r5, r6, r7, r8 }
93 ldmia r3!, {r9, r10, r11, r12} 91 ldmia r3!, {r9, r10, r11, r12}
94 add r5, r5, r9 92 sub r5, r5, r9
95 add r6, r6, r10 93 sub r6, r6, r10
96 add r7, r7, r11 94 sub r7, r7, r11
97 add r8, r8, r12 95 sub r8, r8, r12
98 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[4], ..., fs->qm[7] 96 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[4], ..., fs->qm[7]
99 b .hf2 97 b .hf2
100 98
101.hf_negative: 99.hf_positive:
102 @ case fs->error < 0 100 @ case fs->error > 0
103 101
104 ldmia r4, {r5, r6, r7, r8 } 102 ldmia r4, {r5, r6, r7, r8 }
105 ldmia r3!, {r9, r10, r11, r12} 103 ldmia r3!, {r9, r10, r11, r12}
106 sub r5, r5, r9 104 add r5, r5, r9
107 sub r6, r6, r10 105 add r6, r6, r10
108 sub r7, r7, r11 106 add r7, r7, r11
109 sub r8, r8, r12 107 add r8, r8, r12
110 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[0], ..., fs->qm[3] 108 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[0], ..., fs->qm[3]
111 ldmia r2!, {r9, r10, r11, r12} 109 ldmia r2!, {r9, r10, r11, r12}
112 mla lr, r5, r9, lr 110 mla lr, r5, r9, lr
@@ -115,10 +113,10 @@ hybrid_filter:
115 mla lr, r8, r12, lr 113 mla lr, r8, r12, lr
116 ldmia r4, {r5, r6, r7, r8 } 114 ldmia r4, {r5, r6, r7, r8 }
117 ldmia r3!, {r9, r10, r11, r12} 115 ldmia r3!, {r9, r10, r11, r12}
118 sub r5, r5, r9 116 add r5, r5, r9
119 sub r6, r6, r10 117 add r6, r6, r10
120 sub r7, r7, r11 118 add r7, r7, r11
121 sub r8, r8, r12 119 add r8, r8, r12
122 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[4], ..., fs->qm[7] 120 stmia r4!, {r5, r6, r7, r8 } @ update fs->qm[4], ..., fs->qm[7]
123 121
124.hf2: 122.hf2:
@@ -140,9 +138,9 @@ hybrid_filter:
140 @ update fs->index 138 @ update fs->index
141 139
142 ldr r1, [r0] @ r1 = fs->index 140 ldr r1, [r0] @ r1 = fs->index
143 add r1, r1, #1 141 add r1, r1, #4
144 ands r1, r1, #15 @ set Z flag (after this, CPSR must keep !!) 142 ands r1, r1, #63 @ set Z flag (after this, CPSR must keep !!)
145 stmia r0, {r1, r5} @ fs->index = (++fs->index & 15) 143 stmia r0, {r1, r5} @ fs->index = (fs->index + 4) & 63
146 @ fs->error = (original) *in 144 @ fs->error = (original) *in
147 145
148 @ change *pM, *(pM-1), *(pM-2), *(pM-3) 146 @ change *pM, *(pM-1), *(pM-2), *(pM-3)
@@ -166,13 +164,10 @@ hybrid_filter:
166 sub r11, r12, r11 164 sub r11, r12, r11
167 sub r10, r11, r10 165 sub r10, r11, r10
168 166
169 @ check fs->index is zero
170 beq .hf_memshl
171
172 @ set to the memory: *pA, *(pA-1), *(pA-2), *(pA-3), *pM, *(pM-1), *(pM-2), *(pM-3) 167 @ set to the memory: *pA, *(pA-1), *(pA-2), *(pA-3), *pM, *(pM-1), *(pM-2), *(pM-3)
173 stmda r2, {r10, r11, r12, lr} 168 stmneda r2, {r10, r11, r12, lr}
174 stmda r3, {r5, r6, r7, r8} 169 stmneda r3, {r5, r6, r7, r8}
175 ldmfd sp!, {r4-r12, pc} @ hybrid_filter end (when fs->index != 0) 170 ldmnefd sp!, {r4-r12, pc} @ hybrid_filter end (when fs->index != 0)
176 171
177.hf_memshl: 172.hf_memshl:
178 @ memshl (fs->dl) 173 @ memshl (fs->dl)