summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/codecs/libFLAC/SOURCES3
-rw-r--r--apps/codecs/libFLAC/coldfire.c165
-rw-r--r--apps/codecs/libFLAC/include/private/coldfire.h46
-rw-r--r--apps/codecs/libFLAC/stream_decoder.c8
4 files changed, 222 insertions, 0 deletions
diff --git a/apps/codecs/libFLAC/SOURCES b/apps/codecs/libFLAC/SOURCES
index fc793f5e10..7f5abc26fb 100644
--- a/apps/codecs/libFLAC/SOURCES
+++ b/apps/codecs/libFLAC/SOURCES
@@ -10,3 +10,6 @@ md5.c
10memory.c 10memory.c
11seekable_stream_decoder.c 11seekable_stream_decoder.c
12stream_decoder.c 12stream_decoder.c
13#if CONFIG_CPU==MCF5249
14coldfire.c
15#endif
diff --git a/apps/codecs/libFLAC/coldfire.c b/apps/codecs/libFLAC/coldfire.c
new file mode 100644
index 0000000000..c763c2001f
--- /dev/null
+++ b/apps/codecs/libFLAC/coldfire.c
@@ -0,0 +1,165 @@
1#ifndef SIMULATOR
2#include <private/coldfire.h>
3
4void FLAC__lpc_restore_signal_order8_mac(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[])
5{
6 register const FLAC__int32 *qlp0 = &qlp_coeff[(order-1)];
7 register FLAC__int32 sum;
8 register const FLAC__int32 *history;
9
10 SET_MACSR(0);
11 history = &data[(-order)];
12 SET_ACC(0, acc0);
13
14 switch (order) {
15 case 8:
16 for( ; data_len != 0; --data_len) {
17 asm volatile(
18 "mov.l (%1), %%d0\n\t"
19 "mov.l (%2), %%d1\n\t"
20 "mac.l %%d0, %%d1, 4(%2), %%d1, %%acc0\n\t"
21 "mov.l -4(%1), %%d0\n\t"
22 "mac.l %%d0, %%d1, 8(%2), %%d1, %%acc0\n\t"
23 "mov.l -8(%1), %%d0\n\t"
24 "mac.l %%d0, %%d1, 12(%2), %%d1, %%acc0\n\t"
25 "mov.l -12(%1), %%d0\n\t"
26 "mac.l %%d0, %%d1, 16(%2), %%d1, %%acc0\n\t"
27 "mov.l -16(%1), %%d0\n\t"
28 "mac.l %%d0, %%d1, 20(%2), %%d1, %%acc0\n\t"
29 "mov.l -20(%1), %%d0\n\t"
30 "mac.l %%d0, %%d1, 24(%2), %%d1, %%acc0\n\t"
31 "mov.l -24(%1), %%d0\n\t"
32 "mac.l %%d0, %%d1, 28(%2), %%d1, %%acc0\n\t"
33 "mov.l -28(%1), %%d0\n\t"
34 "mac.l %%d0, %%d1, %%acc0\n\t"
35 "movclr.l %%acc0, %0"
36 : "=ad" (sum) : "a" (qlp0), "a" (history) : "d0", "d1");
37 ++history;
38 *(data++) = *(residual++) + (sum >> lp_quantization);
39 }
40 return;
41 case 7:
42 for( ; data_len != 0; --data_len) {
43 asm volatile(
44 "mov.l (%1), %%d0\n\t"
45 "mov.l (%2), %%d1\n\t"
46 "mac.l %%d0, %%d1, 4(%2), %%d1, %%acc0\n\t"
47 "mov.l -4(%1), %%d0\n\t"
48 "mac.l %%d0, %%d1, 8(%2), %%d1, %%acc0\n\t"
49 "mov.l -8(%1), %%d0\n\t"
50 "mac.l %%d0, %%d1, 12(%2), %%d1, %%acc0\n\t"
51 "mov.l -12(%1), %%d0\n\t"
52 "mac.l %%d0, %%d1, 16(%2), %%d1, %%acc0\n\t"
53 "mov.l -16(%1), %%d0\n\t"
54 "mac.l %%d0, %%d1, 20(%2), %%d1, %%acc0\n\t"
55 "mov.l -20(%1), %%d0\n\t"
56 "mac.l %%d0, %%d1, 24(%2), %%d1, %%acc0\n\t"
57 "mov.l -24(%1), %%d0\n\t"
58 "mac.l %%d0, %%d1, %%acc0\n\t"
59 "movclr.l %%acc0, %0"
60 : "=ad" (sum) : "a" (qlp0), "a" (history) : "d0", "d1");
61 ++history;
62 *(data++) = *(residual++) + (sum >> lp_quantization);
63 }
64 return;
65 case 6:
66 for( ; data_len != 0; --data_len) {
67 asm volatile(
68 "mov.l (%1), %%d0\n\t"
69 "mov.l (%2), %%d1\n\t"
70 "mac.l %%d0, %%d1, 4(%2), %%d1, %%acc0\n\t"
71 "mov.l -4(%1), %%d0\n\t"
72 "mac.l %%d0, %%d1, 8(%2), %%d1, %%acc0\n\t"
73 "mov.l -8(%1), %%d0\n\t"
74 "mac.l %%d0, %%d1, 12(%2), %%d1, %%acc0\n\t"
75 "mov.l -12(%1), %%d0\n\t"
76 "mac.l %%d0, %%d1, 16(%2), %%d1, %%acc0\n\t"
77 "mov.l -16(%1), %%d0\n\t"
78 "mac.l %%d0, %%d1, 20(%2), %%d1, %%acc0\n\t"
79 "mov.l -20(%1), %%d0\n\t"
80 "mac.l %%d0, %%d1, %%acc0\n\t"
81 "movclr.l %%acc0, %0"
82 : "=ad" (sum) : "a" (qlp0), "a" (history) : "d0", "d1");
83 ++history;
84 *(data++) = *(residual++) + (sum >> lp_quantization);
85 }
86 return;
87 case 5:
88 for( ; data_len != 0; --data_len) {
89 asm volatile(
90 "mov.l (%1), %%d0\n\t"
91 "mov.l (%2), %%d1\n\t"
92 "mac.l %%d0, %%d1, 4(%2), %%d1, %%acc0\n\t"
93 "mov.l -4(%1), %%d0\n\t"
94 "mac.l %%d0, %%d1, 8(%2), %%d1, %%acc0\n\t"
95 "mov.l -8(%1), %%d0\n\t"
96 "mac.l %%d0, %%d1, 12(%2), %%d1, %%acc0\n\t"
97 "mov.l -12(%1), %%d0\n\t"
98 "mac.l %%d0, %%d1, 16(%2), %%d1, %%acc0\n\t"
99 "mov.l -16(%1), %%d0\n\t"
100 "mac.l %%d0, %%d1, %%acc0\n\t"
101 "movclr.l %%acc0, %0"
102 : "=ad" (sum) : "a" (qlp0), "a" (history) : "d0", "d1");
103 ++history;
104 *(data++) = *(residual++) + (sum >> lp_quantization);
105 }
106 return;
107 case 4:
108 for( ; data_len != 0; --data_len) {
109 asm volatile(
110 "mov.l (%1), %%d0\n\t"
111 "mov.l (%2), %%d1\n\t"
112 "mac.l %%d0, %%d1, 4(%2), %%d1, %%acc0\n\t"
113 "mov.l -4(%1), %%d0\n\t"
114 "mac.l %%d0, %%d1, 8(%2), %%d1, %%acc0\n\t"
115 "mov.l -8(%1), %%d0\n\t"
116 "mac.l %%d0, %%d1, 12(%2), %%d1, %%acc0\n\t"
117 "mov.l -12(%1), %%d0\n\t"
118 "mac.l %%d0, %%d1, %%acc0\n\t"
119 "movclr.l %%acc0, %0"
120 : "=ad" (sum) : "a" (qlp0), "a" (history) : "d0", "d1");
121 ++history;
122 *(data++) = *(residual++) + (sum >> lp_quantization);
123 }
124 return;
125 case 3:
126 for( ; data_len != 0; --data_len) {
127 asm volatile(
128 "mov.l (%1), %%d0\n\t"
129 "mov.l (%2), %%d1\n\t"
130 "mac.l %%d0, %%d1, 4(%2), %%d1, %%acc0\n\t"
131 "mov.l -4(%1), %%d0\n\t"
132 "mac.l %%d0, %%d1, 8(%2), %%d1, %%acc0\n\t"
133 "mov.l -8(%1), %%d0\n\t"
134 "mac.l %%d0, %%d1, %%acc0\n\t"
135 "movclr.l %%acc0, %0"
136 : "=ad" (sum) : "a" (qlp0), "a" (history) : "d0", "d1");
137 ++history;
138 *(data++) = *(residual++) + (sum >> lp_quantization);
139 }
140 return;
141 case 2:
142 for( ; data_len != 0; --data_len) {
143 asm volatile(
144 "mov.l (%1), %%d0\n\t"
145 "mov.l (%2), %%d1\n\t"
146 "mac.l %%d0, %%d1, 4(%2), %%d1, %%acc0\n\t"
147 "mov.l -4(%1), %%d0\n\t"
148 "mac.l %%d0, %%d1, %%acc0\n\t"
149 "movclr.l %%acc0, %0"
150 : "=ad" (sum) : "a" (qlp0), "a" (history) : "d0", "d1");
151 ++history;
152 *(data++) = *(residual++) + (sum >> lp_quantization);
153 }
154 return;
155 case 1:
156 // won't gain anything by using mac here.
157 for( ; data_len != 0; --data_len) {
158 sum = (qlp0[0] * (*(history++)));
159 *(data++) = *(residual++) + (sum >> lp_quantization);
160 }
161 return;
162 }
163}
164
165#endif
diff --git a/apps/codecs/libFLAC/include/private/coldfire.h b/apps/codecs/libFLAC/include/private/coldfire.h
new file mode 100644
index 0000000000..22f1711f2c
--- /dev/null
+++ b/apps/codecs/libFLAC/include/private/coldfire.h
@@ -0,0 +1,46 @@
1#ifndef SIMULATOR
2#ifndef _FLAC_COLDFIRE_H
3#define _FLAC_COLDFIRE_H
4
5#include <FLAC/ordinals.h>
6
7#define MACL(x, y, acc) \
8 asm volatile ("mac.l %0, %1, %%" #acc \
9 : : "ad" ((x)), "ad" ((y)));
10
11#define MACL_SHIFT(x, y, shift, acc) \
12 asm volatile ("mac.l %0, %1, #" #shift ", %%" #acc \
13 : : "ad" ((x)), "ad" ((y)));
14
15#define MSACL(x, y, acc) \
16 asm volatile ("msac.l %0, %1, %%" #acc \
17 : : "ad" ((x)), "ad" ((y)));
18
19#define MSACL_SHIFT(x, y, shift, acc) \
20 asm volatile ("msac.l %0, %1, #" #shift ", %%" #acc \
21 : : "ad" ((x)), "ad" ((y)));
22
23#define SET_MACSR(x) \
24 asm volatile ("mov.l %0, %%macsr" : : "adi" ((x)));
25
26#define TRANSFER_ACC(acca, accb) \
27 asm volatile ("mov.l %" #acca ", %" #accb);
28
29#define SET_ACC(x, acc) \
30 asm volatile ("mov.l %0, %%" #acc : : "adi" ((x)));
31
32#define GET_ACC(x, acc) \
33 asm volatile ("mov.l %%" #acc ", %0\n\t" : "=ad" ((x)));
34
35#define GET_ACC_CLR(x, acc) \
36 asm volatile ("movclr.l %%" #acc ", %0\n\t" : "=ad" ((x)));
37
38#define EMAC_SATURATE 0x00000080
39#define EMAC_FRACTIONAL 0x00000020
40#define EMAC_ROUND 0x00000010
41
42
43void FLAC__lpc_restore_signal_order8_mac(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]);
44
45#endif
46#endif
diff --git a/apps/codecs/libFLAC/stream_decoder.c b/apps/codecs/libFLAC/stream_decoder.c
index ec43314fe9..eb78d18be0 100644
--- a/apps/codecs/libFLAC/stream_decoder.c
+++ b/apps/codecs/libFLAC/stream_decoder.c
@@ -43,6 +43,10 @@
43#include "private/lpc.h" 43#include "private/lpc.h"
44#include "private/memory.h" 44#include "private/memory.h"
45 45
46#if CONFIG_CPU==MCF5249
47#include <private/coldfire.h>
48#endif
49
46#ifdef HAVE_CONFIG_H 50#ifdef HAVE_CONFIG_H
47#include <config.h> 51#include <config.h>
48#endif 52#endif
@@ -298,7 +302,11 @@ FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_init(FLAC__StreamDecoder
298 decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; 302 decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal;
299 decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; 303 decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide;
300 decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; 304 decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal;
305#if CONFIG_CPU==MCF5249 && !SIMULATOR
306 decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal_order8_mac;
307#else
301 decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal; 308 decoder->private_->local_lpc_restore_signal_16bit_order8 = FLAC__lpc_restore_signal;
309#endif
302 /* now override with asm where appropriate */ 310 /* now override with asm where appropriate */
303#ifndef FLAC__NO_ASM 311#ifndef FLAC__NO_ASM
304 if(decoder->private_->cpuinfo.use_asm) { 312 if(decoder->private_->cpuinfo.use_asm) {