diff options
author | Thomas Martitz <kugel@rockbox.org> | 2012-01-06 06:26:48 +0100 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2012-01-22 18:46:45 +0100 |
commit | 3c17f28eca86ff3ee9e7cef6c4d5198c27b7c03c (patch) | |
tree | 672ee79463fc3c20c186f6d34ebd88cbe430c662 /firmware/target | |
parent | 991ae1e39553172a7dd6cd8c634aebfce892e261 (diff) | |
download | rockbox-3c17f28eca86ff3ee9e7cef6c4d5198c27b7c03c.tar.gz rockbox-3c17f28eca86ff3ee9e7cef6c4d5198c27b7c03c.zip |
Move pcm_mixer helper routines to firmware/asm.
Diffstat (limited to 'firmware/target')
-rw-r--r-- | firmware/target/arm/pcm-mixer-armv4.c | 182 | ||||
-rw-r--r-- | firmware/target/arm/pcm-mixer-armv5.c | 106 | ||||
-rw-r--r-- | firmware/target/arm/pcm-mixer-armv6.c | 118 | ||||
-rw-r--r-- | firmware/target/coldfire/pcm-mixer-coldfire.c | 134 |
4 files changed, 0 insertions, 540 deletions
diff --git a/firmware/target/arm/pcm-mixer-armv4.c b/firmware/target/arm/pcm-mixer-armv4.c deleted file mode 100644 index 4818544d7b..0000000000 --- a/firmware/target/arm/pcm-mixer-armv4.c +++ /dev/null | |||
@@ -1,182 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2011 by Michael Sevakis | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #define MIXER_OPTIMIZED_WRITE_SAMPLES | ||
23 | #define MIXER_OPTIMIZED_MIX_SAMPLES | ||
24 | |||
25 | /* Mix channels' samples and apply gain factors */ | ||
26 | static FORCE_INLINE void mix_samples(void *out, | ||
27 | void *src0, | ||
28 | int32_t src0_amp, | ||
29 | void *src1, | ||
30 | int32_t src1_amp, | ||
31 | size_t size) | ||
32 | { | ||
33 | if (src0_amp == MIX_AMP_UNITY && src1_amp == MIX_AMP_UNITY) | ||
34 | { | ||
35 | /* Both are unity amplitude */ | ||
36 | int32_t l0, l1, h0, h1; | ||
37 | asm volatile ( | ||
38 | "1: \n" | ||
39 | "ldrsh %4, [%1], #2 \n" | ||
40 | "ldrsh %5, [%2], #2 \n" | ||
41 | "ldrsh %6, [%1], #2 \n" | ||
42 | "ldrsh %7, [%2], #2 \n" | ||
43 | "add %4, %4, %5 \n" | ||
44 | "add %6, %6, %7 \n" | ||
45 | "mov %5, %4, asr #15 \n" | ||
46 | "teq %5, %5, asr #31 \n" | ||
47 | "eorne %4, %8, %4, asr #31 \n" | ||
48 | "mov %7, %6, asr #15 \n" | ||
49 | "teq %7, %7, asr #31 \n" | ||
50 | "eorne %6, %8, %6, asr #31 \n" | ||
51 | "subs %3, %3, #4 \n" | ||
52 | "and %4, %4, %8, lsr #16 \n" | ||
53 | "orr %6, %4, %6, lsl #16 \n" | ||
54 | "str %6, [%0], #4 \n" | ||
55 | "bhi 1b \n" | ||
56 | : "+r"(out), "+r"(src0), "+r"(src1), "+r"(size), | ||
57 | "=&r"(l0), "=&r"(l1), "=&r"(h0), "=&r"(h1) | ||
58 | : "r"(0xffff7fff)); | ||
59 | } | ||
60 | else if (src0_amp != MIX_AMP_UNITY && src1_amp != MIX_AMP_UNITY) | ||
61 | { | ||
62 | /* Neither are unity amplitude */ | ||
63 | int32_t l0, l1, h0, h1; | ||
64 | asm volatile ( | ||
65 | "1: \n" | ||
66 | "ldrsh %4, [%1], #2 \n" | ||
67 | "ldrsh %5, [%2], #2 \n" | ||
68 | "ldrsh %6, [%1], #2 \n" | ||
69 | "ldrsh %7, [%2], #2 \n" | ||
70 | "mul %4, %8, %4 \n" | ||
71 | "mul %5, %9, %5 \n" | ||
72 | "mul %6, %8, %6 \n" | ||
73 | "mul %7, %9, %7 \n" | ||
74 | "mov %4, %4, asr #16 \n" | ||
75 | "add %4, %4, %5, asr #16 \n" | ||
76 | "mov %6, %6, asr #16 \n" | ||
77 | "add %6, %6, %7, asr #16 \n" | ||
78 | "mov %5, %4, asr #15 \n" | ||
79 | "teq %5, %5, asr #31 \n" | ||
80 | "eorne %4, %10, %4, asr #31 \n" | ||
81 | "mov %7, %6, asr #15 \n" | ||
82 | "teq %7, %7, asr #31 \n" | ||
83 | "eorne %6, %10, %6, asr #31 \n" | ||
84 | "subs %3, %3, #4 \n" | ||
85 | "and %4, %4, %10, lsr #16 \n" | ||
86 | "orr %6, %4, %6, lsl #16 \n" | ||
87 | "str %6, [%0], #4 \n" | ||
88 | "bhi 1b \n" | ||
89 | : "+r"(out), "+r"(src0), "+r"(src1), "+r"(size), | ||
90 | "=&r"(l0), "=&r"(l1), "=&r"(h0), "=&r"(h1) | ||
91 | : "r"(src0_amp), "r"(src1_amp), "r"(0xffff7fff)); | ||
92 | } | ||
93 | else | ||
94 | { | ||
95 | /* One is unity amplitude */ | ||
96 | if (src0_amp != MIX_AMP_UNITY) | ||
97 | { | ||
98 | /* Keep unity in src0, amp0 */ | ||
99 | int16_t *src_tmp = src0; | ||
100 | src0 = src1; | ||
101 | src1 = src_tmp; | ||
102 | src1_amp = src0_amp; | ||
103 | src0_amp = MIX_AMP_UNITY; | ||
104 | } | ||
105 | |||
106 | int32_t l0, l1, h0, h1; | ||
107 | asm volatile ( | ||
108 | "1: \n" | ||
109 | "ldrsh %4, [%1], #2 \n" | ||
110 | "ldrsh %5, [%2], #2 \n" | ||
111 | "ldrsh %6, [%1], #2 \n" | ||
112 | "ldrsh %7, [%2], #2 \n" | ||
113 | "mul %5, %8, %5 \n" | ||
114 | "mul %7, %8, %7 \n" | ||
115 | "add %4, %4, %5, asr #16 \n" | ||
116 | "add %6, %6, %7, asr #16 \n" | ||
117 | "mov %5, %4, asr #15 \n" | ||
118 | "teq %5, %5, asr #31 \n" | ||
119 | "eorne %4, %9, %4, asr #31 \n" | ||
120 | "mov %7, %6, asr #15 \n" | ||
121 | "teq %7, %7, asr #31 \n" | ||
122 | "eorne %6, %9, %6, asr #31 \n" | ||
123 | "subs %3, %3, #4 \n" | ||
124 | "and %4, %4, %9, lsr #16 \n" | ||
125 | "orr %6, %4, %6, lsl #16 \n" | ||
126 | "str %6, [%0], #4 \n" | ||
127 | "bhi 1b \n" | ||
128 | : "+r"(out), "+r"(src0), "+r"(src1), "+r"(size), | ||
129 | "=&r"(l0), "=&r"(l1), "=&r"(h0), "=&r"(h1) | ||
130 | : "r"(src1_amp), "r"(0xffff7fff)); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | /* Write channel's samples and apply gain factor */ | ||
135 | static FORCE_INLINE void write_samples(void *out, | ||
136 | void *src, | ||
137 | int32_t amp, | ||
138 | size_t size) | ||
139 | { | ||
140 | if (LIKELY(amp == MIX_AMP_UNITY)) | ||
141 | { | ||
142 | /* Channel is unity amplitude */ | ||
143 | asm volatile ( | ||
144 | "ands r1, %2, #0x1f \n" | ||
145 | "beq 2f \n" | ||
146 | "1: \n" | ||
147 | "ldr r0, [%1], #4 \n" | ||
148 | "subs r1, r1, #4 \n" | ||
149 | "str r0, [%0], #4 \n" | ||
150 | "bne 1b \n" | ||
151 | "bics %2, %2, #0x1f \n" | ||
152 | "beq 3f \n" | ||
153 | "2: \n" | ||
154 | "ldmia %1!, { r0-r7 } \n" | ||
155 | "subs %2, %2, #32 \n" | ||
156 | "stmia %0!, { r0-r7 } \n" | ||
157 | "bhi 2b \n" | ||
158 | "3: \n" | ||
159 | : "+r"(out), "+r"(src), "+r"(size) | ||
160 | : | ||
161 | : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7"); | ||
162 | } | ||
163 | else | ||
164 | { | ||
165 | /* Channel needs amplitude cut */ | ||
166 | uint32_t l, h; | ||
167 | asm volatile ( | ||
168 | "1: \n" | ||
169 | "ldrsh %3, [%1], #2 \n" | ||
170 | "ldrsh %4, [%1], #2 \n" | ||
171 | "subs %2, %2, #4 \n" | ||
172 | "mul %3, %5, %3 \n" | ||
173 | "mul %4, %5, %4 \n" | ||
174 | "and %4, %4, %6, lsl #16 \n" | ||
175 | "orr %4, %4, %3, lsr #16 \n" | ||
176 | "str %4, [%0], #4 \n" | ||
177 | "bhi 1b \n" | ||
178 | : "+r"(out), "+r"(src), "+r"(size), | ||
179 | "=&r"(l), "=&r"(h) | ||
180 | : "r"(amp), "r"(0xffffffffu)); | ||
181 | } | ||
182 | } | ||
diff --git a/firmware/target/arm/pcm-mixer-armv5.c b/firmware/target/arm/pcm-mixer-armv5.c deleted file mode 100644 index 64f2c86f52..0000000000 --- a/firmware/target/arm/pcm-mixer-armv5.c +++ /dev/null | |||
@@ -1,106 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2011 by Michael Sevakis | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #define MIXER_OPTIMIZED_WRITE_SAMPLES | ||
23 | #define MIXER_OPTIMIZED_MIX_SAMPLES | ||
24 | |||
25 | /* Mix channels' samples and apply gain factors */ | ||
26 | static FORCE_INLINE void mix_samples(void *out, | ||
27 | void *src0, | ||
28 | int32_t src0_amp, | ||
29 | void *src1, | ||
30 | int32_t src1_amp, | ||
31 | size_t size) | ||
32 | { | ||
33 | int32_t s0, s1, tmp; | ||
34 | asm volatile ( | ||
35 | "1: \n" | ||
36 | "ldr %4, [%1], #4 \n" | ||
37 | "ldr %5, [%2], #4 \n" | ||
38 | "smulwb %6, %7, %4 \n" | ||
39 | "smulwt %4, %7, %4 \n" | ||
40 | "smlawb %6, %8, %5, %6 \n" | ||
41 | "smlawt %4, %8, %5, %4 \n" | ||
42 | "mov %5, %6, asr #15 \n" | ||
43 | "teq %5, %5, asr #31 \n" | ||
44 | "eorne %6, %9, %6, asr #31 \n" | ||
45 | "mov %5, %4, asr #15 \n" | ||
46 | "teq %5, %5, asr #31 \n" | ||
47 | "eorne %4, %9, %4, asr #31 \n" | ||
48 | "subs %3, %3, #4 \n" | ||
49 | "and %6, %6, %9, lsr #16 \n" | ||
50 | "orr %6, %6, %4, lsl #16 \n" | ||
51 | "str %6, [%0], #4 \n" | ||
52 | "bhi 1b \n" | ||
53 | : "+r"(out), "+r"(src0), "+r"(src1), "+r"(size), | ||
54 | "=&r"(s0), "=&r"(s1), "=&r"(tmp) | ||
55 | : "r"(src0_amp), "r"(src1_amp), "r"(0xffff7fff)); | ||
56 | } | ||
57 | |||
58 | /* Write channel's samples and apply gain factor */ | ||
59 | static FORCE_INLINE void write_samples(void *out, | ||
60 | void *src, | ||
61 | int32_t amp, | ||
62 | size_t size) | ||
63 | { | ||
64 | if (LIKELY(amp == MIX_AMP_UNITY)) | ||
65 | { | ||
66 | /* Channel is unity amplitude */ | ||
67 | asm volatile ( | ||
68 | "ands r1, %2, #0x1f \n" | ||
69 | "beq 2f \n" | ||
70 | "1: \n" | ||
71 | "ldr r0, [%1], #4 \n" | ||
72 | "subs r1, r1, #4 \n" | ||
73 | "str r0, [%0], #4 \n" | ||
74 | "bne 1b \n" | ||
75 | "bics %2, %2, #0x1f \n" | ||
76 | "beq 3f \n" | ||
77 | "2: \n" | ||
78 | "ldmia %1!, { r0-r7 } \n" | ||
79 | "subs %2, %2, #32 \n" | ||
80 | "stmia %0!, { r0-r7 } \n" | ||
81 | "bhi 2b \n" | ||
82 | "3: \n" | ||
83 | : "+r"(out), "+r"(src), "+r"(size) | ||
84 | : | ||
85 | : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7"); | ||
86 | } | ||
87 | else | ||
88 | { | ||
89 | /* Channel needs amplitude cut */ | ||
90 | uint32_t l, h; | ||
91 | asm volatile ( | ||
92 | "1: \n" | ||
93 | "ldr %3, [%1], #4 \n" | ||
94 | "subs %2, %2, #4 \n" | ||
95 | "smulwt %4, %5, %3 \n" | ||
96 | "smulwb %3, %5, %3 \n" | ||
97 | "mov %4, %4, lsl #16 \n" | ||
98 | "mov %3, %3, lsl #16 \n" | ||
99 | "orr %4, %4, %3, lsr #16 \n" | ||
100 | "str %4, [%0], #4 \n" | ||
101 | "bhi 1b \n" | ||
102 | : "+r"(out), "+r"(src), "+r"(size), | ||
103 | "=&r"(l), "=&r"(h) | ||
104 | : "r"(amp)); | ||
105 | } | ||
106 | } | ||
diff --git a/firmware/target/arm/pcm-mixer-armv6.c b/firmware/target/arm/pcm-mixer-armv6.c deleted file mode 100644 index 94eecd0f90..0000000000 --- a/firmware/target/arm/pcm-mixer-armv6.c +++ /dev/null | |||
@@ -1,118 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2011 by Michael Sevakis | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | #define MIXER_OPTIMIZED_MIX_SAMPLES | ||
22 | #define MIXER_OPTIMIZED_WRITE_SAMPLES | ||
23 | |||
24 | /* Mix channels' samples and apply gain factors */ | ||
25 | static FORCE_INLINE void mix_samples(void *out, | ||
26 | void *src0, | ||
27 | int32_t src0_amp, | ||
28 | void *src1, | ||
29 | int32_t src1_amp, | ||
30 | size_t size) | ||
31 | { | ||
32 | uint32_t s0, s1; | ||
33 | |||
34 | if (src0_amp == MIX_AMP_UNITY && src1_amp == MIX_AMP_UNITY) | ||
35 | { | ||
36 | /* Both are unity amplitude */ | ||
37 | asm volatile ( | ||
38 | "1: \n" | ||
39 | "ldr %4, [%1], #4 \n" | ||
40 | "ldr %5, [%2], #4 \n" | ||
41 | "subs %3, %3, #4 \n" | ||
42 | "qadd16 %5, %5, %4 \n" | ||
43 | "str %5, [%0], #4 \n" | ||
44 | "bhi 1b \n" | ||
45 | : "+r"(out), "+r"(src0), "+r"(src1), "+r"(size), | ||
46 | "=&r"(s0), "=&r"(s1)); | ||
47 | } | ||
48 | else | ||
49 | { | ||
50 | /* One or neither are unity amplitude */ | ||
51 | uint32_t tmp; | ||
52 | asm volatile ( | ||
53 | "1: \n" | ||
54 | "ldr %4, [%1], #4 \n" | ||
55 | "ldr %5, [%2], #4 \n" | ||
56 | "subs %3, %3, #4 \n" | ||
57 | "smulwb %6, %7, %4 \n" | ||
58 | "smulwt %4, %7, %4 \n" | ||
59 | "smlawb %6, %8, %5, %6 \n" | ||
60 | "smlawt %4, %8, %5, %4 \n" | ||
61 | "ssat %6, #16, %6 \n" | ||
62 | "ssat %4, #16, %4 \n" | ||
63 | "pkhbt %6, %6, %4, asl #16 \n" | ||
64 | "str %6, [%0], #4 \n" | ||
65 | "bhi 1b \n" | ||
66 | : "+r"(out), "+r"(src0), "+r"(src1), "+r"(size), | ||
67 | "=&r"(s0), "=&r"(s1), "=&r"(tmp) | ||
68 | : "r"(src0_amp), "r"(src1_amp)); | ||
69 | } | ||
70 | } | ||
71 | |||
72 | /* Write channel's samples and apply gain factor */ | ||
73 | static FORCE_INLINE void write_samples(void *out, | ||
74 | void *src, | ||
75 | int32_t amp, | ||
76 | size_t size) | ||
77 | { | ||
78 | if (LIKELY(amp == MIX_AMP_UNITY)) | ||
79 | { | ||
80 | /* Channel is unity amplitude */ | ||
81 | asm volatile ( | ||
82 | "ands r1, %2, #0x1f \n" | ||
83 | "beq 2f \n" | ||
84 | "1: \n" | ||
85 | "ldr r0, [%1], #4 \n" | ||
86 | "subs r1, r1, #4 \n" | ||
87 | "str r0, [%0], #4 \n" | ||
88 | "bne 1b \n" | ||
89 | "bics %2, %2, #0x1f \n" | ||
90 | "beq 3f \n" | ||
91 | "2: \n" | ||
92 | "ldmia %1!, { r0-r7 } \n" | ||
93 | "subs %2, %2, #32 \n" | ||
94 | "stmia %0!, { r0-r7 } \n" | ||
95 | "bhi 2b \n" | ||
96 | "3: \n" | ||
97 | : "+r"(out), "+r"(src), "+r"(size) | ||
98 | : | ||
99 | : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7"); | ||
100 | } | ||
101 | else | ||
102 | { | ||
103 | /* Channel needs amplitude cut */ | ||
104 | uint32_t s, tmp; | ||
105 | asm volatile( | ||
106 | "1: \n" | ||
107 | "ldr %3, [%1], #4 \n" | ||
108 | "subs %2, %2, #4 \n" | ||
109 | "smulwt %4, %5, %3 \n" | ||
110 | "smulwb %3, %5, %3 \n" | ||
111 | "pkhbt %4, %3, %4, asl #16 \n" | ||
112 | "str %4, [%0], #4 \n" | ||
113 | "bhi 1b \n" | ||
114 | : "+r"(out), "+r"(src), "+r"(size), | ||
115 | "=&r"(s), "=&r"(tmp) | ||
116 | : "r"(amp)); | ||
117 | } | ||
118 | } | ||
diff --git a/firmware/target/coldfire/pcm-mixer-coldfire.c b/firmware/target/coldfire/pcm-mixer-coldfire.c deleted file mode 100644 index d8318fffaf..0000000000 --- a/firmware/target/coldfire/pcm-mixer-coldfire.c +++ /dev/null | |||
@@ -1,134 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2011 by Michael Sevakis | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #define MIXER_OPTIMIZED_MIX_SAMPLES | ||
23 | #define MIXER_OPTIMIZED_WRITE_SAMPLES | ||
24 | static struct emac_context | ||
25 | { | ||
26 | unsigned long r[4]; | ||
27 | } emac_context IBSS_ATTR; | ||
28 | |||
29 | /* Save emac context affected in ISR */ | ||
30 | static FORCE_INLINE void save_emac_context(void) | ||
31 | { | ||
32 | asm volatile ( | ||
33 | "move.l %%macsr, %%d0 \n" | ||
34 | "move.l %%accext01, %%d1 \n" | ||
35 | "movclr.l %%acc0, %%a0 \n" | ||
36 | "movclr.l %%acc1, %%a1 \n" | ||
37 | "movem.l %%d0-%%d1/%%a0-%%a1, (%0) \n" | ||
38 | : | ||
39 | : "a"(&emac_context) | ||
40 | : "d0", "d1", "a0", "a1"); | ||
41 | } | ||
42 | |||
43 | /* Restore emac context affected in ISR */ | ||
44 | static FORCE_INLINE void restore_emac_context(void) | ||
45 | { | ||
46 | asm volatile ( | ||
47 | "movem.l (%0), %%d0-%%d1/%%a0-%%a1 \n" | ||
48 | "move.l %%a1, %%acc1 \n" | ||
49 | "move.l %%a0, %%acc0 \n" | ||
50 | "move.l %%d1, %%accext01 \n" | ||
51 | "move.l %%d0, %%macsr \n" | ||
52 | : | ||
53 | : "a"(&emac_context) | ||
54 | : "d0", "d1", "a0", "a1"); | ||
55 | } | ||
56 | |||
57 | /* Mix channels' samples and apply gain factors */ | ||
58 | static FORCE_INLINE void mix_samples(void *out, | ||
59 | void *src0, | ||
60 | int32_t src0_amp, | ||
61 | void *src1, | ||
62 | int32_t src1_amp, | ||
63 | size_t size) | ||
64 | { | ||
65 | uint32_t s0, s1, s2, s3; | ||
66 | save_emac_context(); | ||
67 | coldfire_set_macsr(EMAC_ROUND | EMAC_SATURATE); | ||
68 | |||
69 | asm volatile ( | ||
70 | "move.l (%1)+, %5 \n" | ||
71 | "1: \n" | ||
72 | "movea.w %5, %4 \n" | ||
73 | "asr.l %10, %5 \n" | ||
74 | "mac.l %4, %8, %%acc0 \n" | ||
75 | "mac.l %5, %8, (%2)+, %5, %%acc1 \n" | ||
76 | "movea.w %5, %4 \n" | ||
77 | "asr.l %10, %5 \n" | ||
78 | "mac.l %4, %9, %%acc0 \n" | ||
79 | "mac.l %5, %9, (%1)+, %5, %%acc1 \n" | ||
80 | "movclr.l %%acc0, %6 \n" | ||
81 | "movclr.l %%acc1, %7 \n" | ||
82 | "swap.w %6 \n" | ||
83 | "move.w %6, %7 \n" | ||
84 | "move.l %7, (%0)+ \n" | ||
85 | "subq.l #4, %3 \n" | ||
86 | "bhi.b 1b \n" | ||
87 | : "+a"(out), "+a"(src0), "+a"(src1), "+d"(size), | ||
88 | "=&a"(s0), "=&d"(s1), "=&d"(s2), "=&d"(s3) | ||
89 | : "r"(src0_amp), "r"(src1_amp), "d"(16) | ||
90 | ); | ||
91 | |||
92 | restore_emac_context(); | ||
93 | } | ||
94 | |||
95 | /* Write channel's samples and apply gain factor */ | ||
96 | static FORCE_INLINE void write_samples(void *out, | ||
97 | void *src, | ||
98 | int32_t amp, | ||
99 | size_t size) | ||
100 | { | ||
101 | if (LIKELY(amp == MIX_AMP_UNITY)) | ||
102 | { | ||
103 | /* Channel is unity amplitude */ | ||
104 | memcpy(out, src, size); | ||
105 | } | ||
106 | else | ||
107 | { | ||
108 | /* Channel needs amplitude cut */ | ||
109 | uint32_t s0, s1, s2, s3; | ||
110 | save_emac_context(); | ||
111 | coldfire_set_macsr(EMAC_ROUND | EMAC_SATURATE); | ||
112 | |||
113 | asm volatile ( | ||
114 | "move.l (%1)+, %4 \n" | ||
115 | "1: \n" | ||
116 | "movea.w %4, %3 \n" | ||
117 | "asr.l %8, %4 \n" | ||
118 | "mac.l %3, %7, %%acc0 \n" | ||
119 | "mac.l %4, %7, (%1)+, %4, %%acc1 \n" | ||
120 | "movclr.l %%acc0, %5 \n" | ||
121 | "movclr.l %%acc1, %6 \n" | ||
122 | "swap.w %5 \n" | ||
123 | "move.w %5, %6 \n" | ||
124 | "move.l %6, (%0)+ \n" | ||
125 | "subq.l #4, %2 \n" | ||
126 | "bhi.b 1b \n" | ||
127 | : "+a"(out), "+a"(src), "+d"(size), | ||
128 | "=&a"(s0), "=&d"(s1), "=&d"(s2), "=&d"(s3) | ||
129 | : "r"(amp), "d"(16) | ||
130 | ); | ||
131 | |||
132 | restore_emac_context(); | ||
133 | } | ||
134 | } | ||