aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/include/asm
diff options
context:
space:
mode:
authorSteven J. Hill <sjhill@mips.com>2013-01-03 14:01:52 -0500
committerJohn Crispin <blogic@openwrt.org>2013-02-16 18:15:23 -0500
commit32a7ede673cd0be580f24d855099a8a5f195e80c (patch)
tree58529df42257c146094b0e3843be2a98ed18922b /arch/mips/include/asm
parentf8fa4811dbb264aef13f982e963389fd828b1ac0 (diff)
MIPS: dsp: Add assembler support for DSP ASEs.
Newer toolchains support the DSP and DSP Rev2 instructions. This patch performs a check for that support and adds compiler and assembler flags for only the files that need use those instructions. Signed-off-by: Steven J. Hill <sjhill@mips.com> Acked-by: Florian Fainelli <florian@openwrt.org> Patchwork: http://patchwork.linux-mips.org/patch/4752/ Signed-off-by: John Crispin <blogic@openwrt.org>
Diffstat (limited to 'arch/mips/include/asm')
-rw-r--r--arch/mips/include/asm/mipsregs.h53
1 files changed, 36 insertions, 17 deletions
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index 3e36745670b2..578132219ff6 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -1155,36 +1155,26 @@ do { \
1155 : "=r" (__res)); \ 1155 : "=r" (__res)); \
1156 __res;}) 1156 __res;})
1157 1157
1158#ifdef HAVE_AS_DSP
1158#define rddsp(mask) \ 1159#define rddsp(mask) \
1159({ \ 1160({ \
1160 unsigned int __res; \ 1161 unsigned int __dspctl; \
1161 \ 1162 \
1162 __asm__ __volatile__( \ 1163 __asm__ __volatile__( \
1163 " .set push \n" \ 1164 " rddsp %0, %x1 \n" \
1164 " .set noat \n" \ 1165 : "=r" (__dspctl) \
1165 " # rddsp $1, %x1 \n" \
1166 " .word 0x7c000cb8 | (%x1 << 16) \n" \
1167 " move %0, $1 \n" \
1168 " .set pop \n" \
1169 : "=r" (__res) \
1170 : "i" (mask)); \ 1166 : "i" (mask)); \
1171 __res; \ 1167 __dspctl; \
1172}) 1168})
1173 1169
1174#define wrdsp(val, mask) \ 1170#define wrdsp(val, mask) \
1175do { \ 1171do { \
1176 __asm__ __volatile__( \ 1172 __asm__ __volatile__( \
1177 " .set push \n" \ 1173 " wrdsp %0, %x1 \n" \
1178 " .set noat \n" \ 1174 : \
1179 " move $1, %0 \n" \
1180 " # wrdsp $1, %x1 \n" \
1181 " .word 0x7c2004f8 | (%x1 << 11) \n" \
1182 " .set pop \n" \
1183 : \
1184 : "r" (val), "i" (mask)); \ 1175 : "r" (val), "i" (mask)); \
1185} while (0) 1176} while (0)
1186 1177
1187#if 0 /* Need DSP ASE capable assembler ... */
1188#define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;}) 1178#define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;})
1189#define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;}) 1179#define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;})
1190#define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;}) 1180#define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;})
@@ -1207,6 +1197,35 @@ do { \
1207 1197
1208#else 1198#else
1209 1199
1200#define rddsp(mask) \
1201({ \
1202 unsigned int __res; \
1203 \
1204 __asm__ __volatile__( \
1205 " .set push \n" \
1206 " .set noat \n" \
1207 " # rddsp $1, %x1 \n" \
1208 " .word 0x7c000cb8 | (%x1 << 16) \n" \
1209 " move %0, $1 \n" \
1210 " .set pop \n" \
1211 : "=r" (__res) \
1212 : "i" (mask)); \
1213 __res; \
1214})
1215
1216#define wrdsp(val, mask) \
1217do { \
1218 __asm__ __volatile__( \
1219 " .set push \n" \
1220 " .set noat \n" \
1221 " move $1, %0 \n" \
1222 " # wrdsp $1, %x1 \n" \
1223 " .word 0x7c2004f8 | (%x1 << 11) \n" \
1224 " .set pop \n" \
1225 : \
1226 : "r" (val), "i" (mask)); \
1227} while (0)
1228
1210#define mfhi0() \ 1229#define mfhi0() \
1211({ \ 1230({ \
1212 unsigned long __treg; \ 1231 unsigned long __treg; \