diff options
Diffstat (limited to 'apps/codecs/lib/asm_arm.h')
-rw-r--r-- | apps/codecs/lib/asm_arm.h | 30 |
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 | ||
61 | static inline void XPROD31(int32_t a, int32_t b, | 57 | static 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) { |