summaryrefslogtreecommitdiff
path: root/apps/codecs/lib/asm_arm.h
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/lib/asm_arm.h')
-rw-r--r--apps/codecs/lib/asm_arm.h30
1 files changed, 11 insertions, 19 deletions
diff --git a/apps/codecs/lib/asm_arm.h b/apps/codecs/lib/asm_arm.h
index 0db868dcb3..89606184da 100644
--- a/apps/codecs/lib/asm_arm.h
+++ b/apps/codecs/lib/asm_arm.h
@@ -23,8 +23,7 @@ static inline int32_t MULT32(int32_t x, int32_t y) {
23 int lo,hi; 23 int lo,hi;
24 asm volatile("smull\t%0, %1, %2, %3" 24 asm volatile("smull\t%0, %1, %2, %3"
25 : "=&r"(lo),"=&r"(hi) 25 : "=&r"(lo),"=&r"(hi)
26 : "%r"(x),"r"(y) 26 : "%r"(x),"r"(y) );
27 : "cc");
28 return(hi); 27 return(hi);
29} 28}
30 29
@@ -39,23 +38,20 @@ static inline int32_t MULT31_SHIFT15(int32_t x, int32_t y) {
39 "adc %1, %0, %1, lsl #17\n\t" 38 "adc %1, %0, %1, lsl #17\n\t"
40 : "=&r"(lo),"=&r"(hi) 39 : "=&r"(lo),"=&r"(hi)
41 : "%r"(x),"r"(y) 40 : "%r"(x),"r"(y)
42 : "cc"); 41 : "cc" );
43 return(hi); 42 return(hi);
44} 43}
45 44
46#define MB() asm volatile ("" : : : "memory")
47
48#define XPROD32(a, b, t, v, x, y) \ 45#define XPROD32(a, b, t, v, x, y) \
49{ \ 46{ \
50 long l; \ 47 long l; \
51 asm( "smull %0, %1, %4, %6\n\t" \ 48 asm( "smull %0, %1, %4, %6\n\t" \
52 "smlal %0, %1, %5, %7\n\t" \
53 "rsb %3, %4, #0\n\t" \ 49 "rsb %3, %4, #0\n\t" \
50 "smlal %0, %1, %5, %7\n\t" \
54 "smull %0, %2, %5, %6\n\t" \ 51 "smull %0, %2, %5, %6\n\t" \
55 "smlal %0, %2, %3, %7" \ 52 "smlal %0, %2, %3, %7" \
56 : "=&r" (l), "=&r" (x), "=&r" (y), "=r" ((a)) \ 53 : "=&r" (l), "=&r" (x), "=&r" (y), "=r" ((a)) \
57 : "3" ((a)), "r" ((b)), "r" ((t)), "r" ((v)) \ 54 : "3" ((a)), "r" ((b)), "r" ((t)), "r" ((v)) ); \
58 : "cc" ); \
59} 55}
60 56
61static inline void XPROD31(int32_t a, int32_t b, 57static inline void XPROD31(int32_t a, int32_t b,
@@ -64,15 +60,13 @@ static inline void XPROD31(int32_t a, int32_t b,
64{ 60{
65 int x1, y1, l; 61 int x1, y1, l;
66 asm( "smull %0, %1, %4, %6\n\t" 62 asm( "smull %0, %1, %4, %6\n\t"
67 "smlal %0, %1, %5, %7\n\t"
68 "rsb %3, %4, #0\n\t" 63 "rsb %3, %4, #0\n\t"
64 "smlal %0, %1, %5, %7\n\t"
69 "smull %0, %2, %5, %6\n\t" 65 "smull %0, %2, %5, %6\n\t"
70 "smlal %0, %2, %3, %7" 66 "smlal %0, %2, %3, %7"
71 : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a) 67 : "=&r" (l), "=&r" (x1), "=&r" (y1), "=r" (a)
72 : "3" (a), "r" (b), "r" (t), "r" (v) 68 : "3" (a), "r" (b), "r" (t), "r" (v) );
73 : "cc" );
74 *x = x1 << 1; 69 *x = x1 << 1;
75 MB();
76 *y = y1 << 1; 70 *y = y1 << 1;
77} 71}
78 72
@@ -81,16 +75,14 @@ static inline void XNPROD31(int32_t a, int32_t b,
81 int32_t *x, int32_t *y) 75 int32_t *x, int32_t *y)
82{ 76{
83 int x1, y1, l; 77 int x1, y1, l;
84 asm( "rsb %2, %4, #0\n\t" 78 asm( "smull %0, %1, %3, %5\n\t"
85 "smull %0, %1, %3, %5\n\t" 79 "rsb %2, %4, #0\n\t"
86 "smlal %0, %1, %2, %6\n\t" 80 "smlal %0, %1, %2, %6\n\t"
87 "smull %0, %2, %4, %5\n\t" 81 "smull %0, %2, %4, %5\n\t"
88 "smlal %0, %2, %3, %6" 82 "smlal %0, %2, %3, %6"
89 : "=&r" (l), "=&r" (x1), "=&r" (y1) 83 : "=&r" (l), "=&r" (x1), "=&r" (y1)
90 : "r" (a), "r" (b), "r" (t), "r" (v) 84 : "r" (a), "r" (b), "r" (t), "r" (v) );
91 : "cc" );
92 *x = x1 << 1; 85 *x = x1 << 1;
93 MB();
94 *y = y1 << 1; 86 *y = y1 << 1;
95} 87}
96 88
@@ -158,7 +150,7 @@ void vect_mult_fw(int32_t *data, int32_t *window, int n)
158 : [d] "+r" (data), [w] "+r" (window) 150 : [d] "+r" (data), [w] "+r" (window)
159 : : "r0", "r1", "r2", "r3", 151 : : "r0", "r1", "r2", "r3",
160 "r4", "r5", "r6", "r7", "r8", "r9", 152 "r4", "r5", "r6", "r7", "r8", "r9",
161 "memory", "cc"); 153 "memory" );
162 n -= 4; 154 n -= 4;
163 } 155 }
164 while(n>0) { 156 while(n>0) {
@@ -187,7 +179,7 @@ void vect_mult_bw(int32_t *data, int32_t *window, int n)
187 : [d] "+r" (data), [w] "+r" (window) 179 : [d] "+r" (data), [w] "+r" (window)
188 : : "r0", "r1", "r2", "r3", 180 : : "r0", "r1", "r2", "r3",
189 "r4", "r5", "r6", "r7", "r8", "r9", 181 "r4", "r5", "r6", "r7", "r8", "r9",
190 "memory", "cc"); 182 "memory" );
191 n -= 4; 183 n -= 4;
192 } 184 }
193 while(n>0) { 185 while(n>0) {