diff options
Diffstat (limited to 'apps/codecs/libFLAC')
-rw-r--r-- | apps/codecs/libFLAC/SOURCES | 3 | ||||
-rw-r--r-- | apps/codecs/libFLAC/coldfire.c | 165 | ||||
-rw-r--r-- | apps/codecs/libFLAC/include/private/coldfire.h | 46 | ||||
-rw-r--r-- | apps/codecs/libFLAC/stream_decoder.c | 8 |
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 | |||
10 | memory.c | 10 | memory.c |
11 | seekable_stream_decoder.c | 11 | seekable_stream_decoder.c |
12 | stream_decoder.c | 12 | stream_decoder.c |
13 | #if CONFIG_CPU==MCF5249 | ||
14 | coldfire.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 | |||
4 | void 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 | |||
43 | void 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) { |