Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
56 | mjames | 1 | #include "ref.h" |
2 | |||
3 | q31_t ref__QADD8(q31_t x, q31_t y) |
||
4 | { |
||
5 | q31_t sum; |
||
6 | q7_t r, s, t, u; |
||
7 | |||
8 | r = (q7_t) x; |
||
9 | s = (q7_t) y; |
||
10 | |||
11 | r = ref_sat_n((q31_t) (r + s), 8); |
||
12 | s = ref_sat_n(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); |
||
13 | t = ref_sat_n(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); |
||
14 | u = ref_sat_n(((q31_t) ((x >> 24) + (y >> 24))), 8); |
||
15 | |||
16 | sum = |
||
17 | (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | |
||
18 | (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); |
||
19 | |||
20 | return sum; |
||
21 | |||
22 | } |
||
23 | |||
24 | q31_t ref__QSUB8(q31_t x, q31_t y) |
||
25 | { |
||
26 | q31_t sum; |
||
27 | q31_t r, s, t, u; |
||
28 | |||
29 | r = (q7_t) x; |
||
30 | s = (q7_t) y; |
||
31 | |||
32 | r = ref_sat_n((r - s), 8); |
||
33 | s = ref_sat_n(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; |
||
34 | t = ref_sat_n(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; |
||
35 | u = ref_sat_n(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; |
||
36 | |||
37 | sum = (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF); |
||
38 | |||
39 | return sum; |
||
40 | } |
||
41 | |||
42 | q31_t ref__QADD16(q31_t x, q31_t y) |
||
43 | { |
||
44 | q31_t sum; |
||
45 | q31_t r, s; |
||
46 | |||
47 | r = (q15_t) x; |
||
48 | s = (q15_t) y; |
||
49 | |||
50 | r = ref_sat_q15(r + s); |
||
51 | s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) + (y >> 16)))) << 16; |
||
52 | |||
53 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
54 | |||
55 | return sum; |
||
56 | |||
57 | } |
||
58 | |||
59 | q31_t ref__SHADD16(q31_t x, q31_t y) |
||
60 | { |
||
61 | q31_t sum; |
||
62 | q31_t r, s; |
||
63 | |||
64 | r = (q15_t) x; |
||
65 | s = (q15_t) y; |
||
66 | |||
67 | r = (r + s) >> 1; |
||
68 | s = ((q31_t) (((x >> 16) + (y >> 16)) >> 1) << 16); |
||
69 | |||
70 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
71 | |||
72 | return sum; |
||
73 | |||
74 | } |
||
75 | |||
76 | q31_t ref__QSUB16(q31_t x, q31_t y) |
||
77 | { |
||
78 | q31_t sum; |
||
79 | q31_t r, s; |
||
80 | |||
81 | r = (q15_t) x; |
||
82 | s = (q15_t) y; |
||
83 | |||
84 | r = ref_sat_q15(r - s); |
||
85 | s = (q31_t)ref_sat_q15(((q31_t) ((x >> 16) - (y >> 16)))) << 16; |
||
86 | |||
87 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
88 | |||
89 | return sum; |
||
90 | } |
||
91 | |||
92 | q31_t ref__SHSUB16(q31_t x, q31_t y) |
||
93 | { |
||
94 | q31_t diff; |
||
95 | q31_t r, s; |
||
96 | |||
97 | r = (q15_t) x; |
||
98 | s = (q15_t) y; |
||
99 | |||
100 | r = ((r >> 1) - (s >> 1)); |
||
101 | s = (((x >> 17) - (y >> 17)) << 16); |
||
102 | |||
103 | diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
104 | |||
105 | return diff; |
||
106 | } |
||
107 | |||
108 | q31_t ref__QASX(q31_t x, q31_t y) |
||
109 | { |
||
110 | q31_t sum = 0; |
||
111 | q31_t xL, xH, yL, yH; |
||
112 | |||
113 | // extract bottom halfword and sign extend |
||
114 | xL = (q15_t)(x & 0xffff); |
||
115 | // extract bottom halfword and sign extend |
||
116 | yL = (q15_t)(y & 0xffff); |
||
117 | // extract top halfword and sign extend |
||
118 | xH = (q15_t)(x >> 16); |
||
119 | // extract top halfword and sign extend |
||
120 | yH = (q15_t)(y >> 16); |
||
121 | |||
122 | sum = (((q31_t)ref_sat_q15(xH + yL )) << 16) | |
||
123 | (((q31_t)ref_sat_q15(xL - yH )) & 0xffff); |
||
124 | |||
125 | return sum; |
||
126 | } |
||
127 | |||
128 | q31_t ref__SHASX(q31_t x, q31_t y) |
||
129 | { |
||
130 | q31_t sum; |
||
131 | q31_t r, s; |
||
132 | |||
133 | r = (q15_t) x; |
||
134 | s = (q15_t) y; |
||
135 | |||
136 | r = (r - (y >> 16)) / 2; |
||
137 | s = (((x >> 16) + s) << 15); |
||
138 | |||
139 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
140 | |||
141 | return sum; |
||
142 | } |
||
143 | |||
144 | q31_t ref__QSAX(q31_t x, q31_t y) |
||
145 | { |
||
146 | q31_t sum = 0; |
||
147 | q31_t xL, xH, yL, yH; |
||
148 | |||
149 | // extract bottom halfword and sign extend |
||
150 | xL = (q15_t)(x & 0xffff); |
||
151 | // extract bottom halfword and sign extend |
||
152 | yL = (q15_t)(y & 0xffff); |
||
153 | // extract top halfword and sign extend |
||
154 | xH = (q15_t)(x >> 16); |
||
155 | // extract top halfword and sign extend |
||
156 | yH = (q15_t)(y >> 16); |
||
157 | |||
158 | sum = (((q31_t)ref_sat_q15(xH - yL )) << 16) | |
||
159 | (((q31_t)ref_sat_q15(xL + yH )) & 0xffff); |
||
160 | |||
161 | return sum; |
||
162 | } |
||
163 | |||
164 | q31_t ref__SHSAX(q31_t x, q31_t y) |
||
165 | { |
||
166 | q31_t sum; |
||
167 | q31_t r, s; |
||
168 | |||
169 | r = (q15_t) x; |
||
170 | s = (q15_t) y; |
||
171 | |||
172 | r = (r + (y >> 16)) / 2; |
||
173 | s = (((x >> 16) - s) << 15); |
||
174 | |||
175 | sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); |
||
176 | |||
177 | return sum; |
||
178 | } |
||
179 | |||
180 | q31_t ref__SMUSDX(q31_t x, q31_t y) |
||
181 | { |
||
182 | return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) - ((q15_t) (x >> 16) * (q15_t) y))); |
||
183 | } |
||
184 | |||
185 | q31_t ref__SMUADX(q31_t x, q31_t y) |
||
186 | { |
||
187 | return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) + ((q15_t) (x >> 16) * (q15_t) y))); |
||
188 | } |
||
189 | |||
190 | q31_t ref__QADD(q31_t x, q31_t y) |
||
191 | { |
||
192 | return ref_sat_q31((q63_t) x + y); |
||
193 | } |
||
194 | |||
195 | q31_t ref__QSUB(q31_t x, q31_t y) |
||
196 | { |
||
197 | return ref_sat_q31((q63_t) x - y); |
||
198 | } |
||
199 | |||
200 | q31_t ref__SMLAD(q31_t x, q31_t y, q31_t sum) |
||
201 | { |
||
202 | return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); |
||
203 | } |
||
204 | |||
205 | q31_t ref__SMLADX(q31_t x, q31_t y, q31_t sum) |
||
206 | { |
||
207 | return (sum + ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16))); |
||
208 | } |
||
209 | |||
210 | q31_t ref__SMLSDX(q31_t x, q31_t y, q31_t sum) |
||
211 | { |
||
212 | return (sum - ((q15_t) (x >> 16) * (q15_t) (y)) + ((q15_t) x * (q15_t) (y >> 16))); |
||
213 | } |
||
214 | |||
215 | q63_t ref__SMLALD(q31_t x, q31_t y, q63_t sum) |
||
216 | { |
||
217 | return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); |
||
218 | } |
||
219 | |||
220 | q63_t ref__SMLALDX(q31_t x, q31_t y, q63_t sum) |
||
221 | { |
||
222 | return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); |
||
223 | } |
||
224 | |||
225 | q31_t ref__SMUAD(q31_t x, q31_t y) |
||
226 | { |
||
227 | return (((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16))); |
||
228 | } |
||
229 | |||
230 | q31_t ref__SMUSD(q31_t x, q31_t y) |
||
231 | { |
||
232 | return (-((x >> 16) * (y >> 16)) + (((x << 16) >> 16) * ((y << 16) >> 16))); |
||
233 | } |
||
234 | |||
235 | q31_t ref__SXTB16(q31_t x) |
||
236 | { |
||
237 | return ((((x << 24) >> 24) & 0x0000FFFF) | (((x << 8) >> 8) & 0xFFFF0000)); |
||
238 | } |