Line data Source code
1 : /*****************************************************************************
2 :
3 : *
4 :
5 : * Complex arithmetic operators
6 :
7 : *
8 :
9 : *****************************************************************************/
10 :
11 :
12 : #include "stl.h"
13 :
14 : #define WMC_TOOL_SKIP
15 :
16 : #ifdef COMPLEX_OPERATOR
17 :
18 : /* ================================ New Complex Basops ========================= */
19 :
20 8275829444 : cmplx CL_shr( cmplx inp, Word16 shift_val )
21 : {
22 : cmplx out;
23 8275829444 : out.re = L_shr( inp.re, shift_val );
24 8275829444 : out.im = L_shr( inp.im, shift_val );
25 : #ifdef WMOPS
26 : multiCounter[currCounter].CL_shr++;
27 : multiCounter[currCounter].L_shr--;
28 : multiCounter[currCounter].L_shr--;
29 : #endif
30 8275829444 : return out;
31 : }
32 :
33 2732699216 : cmplx CL_shl( cmplx inp, Word16 shift_val )
34 : {
35 : cmplx out;
36 2732699216 : out.re = L_shl( inp.re, shift_val );
37 2732699216 : out.im = L_shl( inp.im, shift_val );
38 : #ifdef WMOPS
39 : multiCounter[currCounter].CL_shl++;
40 : multiCounter[currCounter].L_shl--;
41 : multiCounter[currCounter].L_shl--;
42 : #endif
43 2732699216 : return out;
44 : }
45 :
46 28379626860 : cmplx CL_add( cmplx inp1, cmplx inp2 )
47 : {
48 : cmplx out;
49 28379626860 : out.re = L_add( inp1.re, inp2.re );
50 28379626860 : out.im = L_add( inp1.im, inp2.im );
51 : #ifdef WMOPS
52 : multiCounter[currCounter].CL_add++;
53 : multiCounter[currCounter].L_add--;
54 : multiCounter[currCounter].L_add--;
55 : #endif
56 28379626860 : return out;
57 : }
58 :
59 21551258008 : cmplx CL_sub( cmplx inp1, cmplx inp2 )
60 : {
61 : cmplx out;
62 21551258008 : out.re = L_sub( inp1.re, inp2.re );
63 21551258008 : out.im = L_sub( inp1.im, inp2.im );
64 : #ifdef WMOPS
65 : multiCounter[currCounter].CL_sub++;
66 : multiCounter[currCounter].L_sub--;
67 : multiCounter[currCounter].L_sub--;
68 : #endif
69 21551258008 : return out;
70 : }
71 :
72 13914022022 : cmplx CL_scale( cmplx x, Word16 y )
73 : {
74 : cmplx result;
75 13914022022 : result.re = Mpy_32_16_r( x.re, y );
76 13914022022 : result.im = Mpy_32_16_r( x.im, y );
77 : #ifdef WMOPS
78 : multiCounter[currCounter].Mpy_32_16_r--;
79 : multiCounter[currCounter].Mpy_32_16_r--;
80 : multiCounter[currCounter].CL_scale++;
81 : #endif /* #ifdef WMOPS */
82 13914022022 : return ( result );
83 : }
84 :
85 0 : cmplx CL_dscale( cmplx x, Word16 y1, Word16 y2 )
86 : {
87 : cmplx result;
88 0 : result.re = Mpy_32_16_r( x.re, y1 );
89 0 : result.im = Mpy_32_16_r( x.im, y2 );
90 : #ifdef WMOPS
91 : multiCounter[currCounter].Mpy_32_16_r--;
92 : multiCounter[currCounter].Mpy_32_16_r--;
93 : multiCounter[currCounter].CL_dscale++;
94 : #endif /* #ifdef WMOPS */
95 0 : return ( result );
96 : }
97 :
98 5710486632 : cmplx CL_msu_j( cmplx x, cmplx y )
99 : {
100 : cmplx result;
101 5710486632 : result.re = L_add( x.re, y.im );
102 5710486632 : result.im = L_sub( x.im, y.re );
103 : #ifdef WMOPS
104 : multiCounter[currCounter].CL_msu_j++;
105 : multiCounter[currCounter].L_add--;
106 : multiCounter[currCounter].L_sub--;
107 : #endif
108 5710486632 : return result;
109 : }
110 :
111 9986527521 : cmplx CL_mac_j( cmplx x, cmplx y )
112 : {
113 : cmplx result;
114 9986527521 : result.re = L_sub( x.re, y.im );
115 9986527521 : result.im = L_add( x.im, y.re );
116 : #ifdef WMOPS
117 : multiCounter[currCounter].CL_mac_j++;
118 : multiCounter[currCounter].L_add--;
119 : multiCounter[currCounter].L_sub--;
120 : #endif
121 9986527521 : return result;
122 : }
123 :
124 943914 : cmplx CL_move( cmplx x )
125 : {
126 : #ifdef WMOPS
127 : multiCounter[currCounter].CL_move++;
128 : #endif
129 943914 : return x;
130 : }
131 :
132 13792352 : Word32 CL_Extract_real( cmplx x )
133 : {
134 : #ifdef WMOPS
135 : multiCounter[currCounter].CL_Extract_real++;
136 : #endif
137 13792352 : return x.re;
138 : }
139 :
140 13792352 : Word32 CL_Extract_imag( cmplx x )
141 : {
142 : #ifdef WMOPS
143 : multiCounter[currCounter].CL_Extract_imag++;
144 : #endif
145 13792352 : return x.im;
146 : }
147 :
148 13792352 : cmplx CL_form( Word32 re, Word32 im )
149 : {
150 : cmplx result;
151 13792352 : result.re = re;
152 13792352 : result.im = im;
153 : #ifdef WMOPS
154 : multiCounter[currCounter].CL_form++;
155 : #endif
156 13792352 : return result;
157 : }
158 :
159 0 : cmplx CL_multr_32x16( cmplx input, cmplx_s coeff )
160 : {
161 : cmplx result;
162 0 : result.re = W_round48_L( W_sub_nosat( W_mult_32_16( input.re, coeff.re ), W_mult_32_16( input.im, coeff.im ) ) );
163 0 : result.im = W_round48_L( W_add_nosat( W_mult_32_16( input.re, coeff.im ), W_mult_32_16( input.im, coeff.re ) ) );
164 : #ifdef WMOPS
165 : multiCounter[currCounter].CL_multr_32x16++;
166 : multiCounter[currCounter].W_mult_32_16--;
167 : multiCounter[currCounter].W_mult_32_16--;
168 : multiCounter[currCounter].W_mult_32_16--;
169 : multiCounter[currCounter].W_mult_32_16--;
170 : multiCounter[currCounter].W_sub_nosat--;
171 : multiCounter[currCounter].W_add_nosat--;
172 : multiCounter[currCounter].W_round48_L--;
173 : multiCounter[currCounter].W_round48_L--;
174 : #endif
175 0 : return result;
176 : }
177 :
178 167341214 : cmplx CL_negate( cmplx x )
179 : {
180 : cmplx result;
181 167341214 : result.re = L_negate( x.re );
182 167341214 : result.im = L_negate( x.im );
183 : #ifdef WMOPS
184 : multiCounter[currCounter].CL_negate++;
185 : multiCounter[currCounter].L_negate--;
186 : multiCounter[currCounter].L_negate--;
187 : #endif
188 167341214 : return result;
189 : }
190 :
191 3377837660 : cmplx CL_conjugate( cmplx x )
192 : {
193 : cmplx result;
194 3377837660 : result.re = x.re;
195 3377837660 : result.im = L_negate( x.im );
196 : #ifdef WMOPS
197 : multiCounter[currCounter].CL_conjugate++;
198 : multiCounter[currCounter].L_negate--;
199 : #endif
200 3377837660 : return result;
201 : }
202 :
203 :
204 116378720 : cmplx CL_mul_j( cmplx input )
205 : {
206 : cmplx temp, result;
207 116378720 : temp = CL_negate( input );
208 116378720 : result.re = temp.im;
209 116378720 : result.im = input.re;
210 : #ifdef WMOPS
211 : multiCounter[currCounter].CL_mul_j++;
212 : multiCounter[currCounter].CL_negate--;
213 : #endif
214 116378720 : return result;
215 : }
216 :
217 1682873096 : cmplx CL_swap_real_imag( cmplx input )
218 : {
219 : cmplx result;
220 1682873096 : result.re = input.im;
221 1682873096 : result.im = input.re;
222 : #ifdef WMOPS
223 : multiCounter[currCounter].CL_swap_real_imag++;
224 : #endif
225 1682873096 : return result;
226 : }
227 :
228 992000 : cmplx_s C_add( cmplx_s inp1, cmplx_s inp2 )
229 : {
230 : cmplx_s out;
231 992000 : out.re = add( inp1.re, inp2.re );
232 992000 : out.im = add( inp1.im, inp2.im );
233 :
234 : #ifdef WMOPS
235 : multiCounter[currCounter].C_add++;
236 : multiCounter[currCounter].add--;
237 : multiCounter[currCounter].add--;
238 : #endif
239 992000 : return out;
240 : }
241 :
242 992000 : cmplx_s C_sub( cmplx_s inp1, cmplx_s inp2 )
243 : {
244 : cmplx_s out;
245 992000 : out.re = sub( inp1.re, inp2.re );
246 992000 : out.im = sub( inp1.im, inp2.im );
247 :
248 : #ifdef WMOPS
249 : multiCounter[currCounter].C_sub++;
250 : multiCounter[currCounter].sub--;
251 : multiCounter[currCounter].sub--;
252 : #endif
253 992000 : return out;
254 : }
255 :
256 248000 : cmplx_s C_mul_j( cmplx_s input )
257 : {
258 : cmplx_s result;
259 : Word16 temp;
260 248000 : temp = negate( input.im );
261 248000 : result.re = temp;
262 248000 : result.im = input.re;
263 :
264 : #ifdef WMOPS
265 : multiCounter[currCounter].C_mul_j++;
266 : multiCounter[currCounter].negate--;
267 : #endif
268 248000 : return result;
269 : }
270 :
271 372000 : cmplx_s C_multr( cmplx_s x, cmplx_s c )
272 : {
273 : cmplx_s result;
274 372000 : result.re = round_fx( W_sat_l( W_sub_nosat( W_mult_16_16( x.re, c.re ), W_mult_16_16( x.im, c.im ) ) ) );
275 372000 : result.im = round_fx( W_sat_l( W_add_nosat( W_mult_16_16( x.im, c.re ), W_mult_16_16( x.re, c.im ) ) ) );
276 :
277 : #ifdef WMOPS
278 : multiCounter[currCounter].C_multr++;
279 : multiCounter[currCounter].W_mult_16_16--;
280 : multiCounter[currCounter].W_mult_16_16--;
281 : multiCounter[currCounter].W_mult_16_16--;
282 : multiCounter[currCounter].W_mult_16_16--;
283 : multiCounter[currCounter].W_sub_nosat--;
284 : multiCounter[currCounter].W_add_nosat--;
285 : multiCounter[currCounter].W_sat_l--;
286 : multiCounter[currCounter].W_sat_l--;
287 : multiCounter[currCounter].round--;
288 : multiCounter[currCounter].round--;
289 : #endif
290 372000 : return result;
291 : }
292 :
293 6896176 : cmplx_s C_form( Word16 re, Word16 im )
294 : {
295 : cmplx_s result;
296 6896176 : result.re = re;
297 6896176 : result.im = im;
298 : #ifdef WMOPS
299 : multiCounter[currCounter].C_form++;
300 : #endif
301 6896176 : return result;
302 : }
303 :
304 0 : cmplx C_scale( cmplx_s x, Word16 y )
305 : {
306 : cmplx result;
307 0 : result.re = L_mult( x.re, y );
308 0 : result.im = L_mult( x.im, y );
309 : #ifdef WMOPS
310 : multiCounter[currCounter].L_mult--;
311 : multiCounter[currCounter].L_mult--;
312 : multiCounter[currCounter].C_scale++;
313 : #endif /* #ifdef WMOPS */
314 0 : return ( result );
315 : }
316 :
317 0 : cmplx_s CL_round32_16( cmplx x )
318 : {
319 : cmplx_s result;
320 0 : result.re = round_fx( x.re );
321 0 : result.im = round_fx( x.im );
322 :
323 : #ifdef WMOPS
324 : multiCounter[currCounter].CL_round32_16++;
325 : multiCounter[currCounter].round--;
326 : multiCounter[currCounter].round--;
327 : #endif
328 0 : return result;
329 : }
330 :
331 0 : cmplx CL_scale_32( cmplx x, Word32 y )
332 : {
333 : cmplx result;
334 0 : result.re = Mpy_32_32_r( x.re, y );
335 0 : result.im = Mpy_32_32_r( x.im, y );
336 : #ifdef WMOPS
337 : multiCounter[currCounter].Mpy_32_32_r--;
338 : multiCounter[currCounter].Mpy_32_32_r--;
339 : multiCounter[currCounter].CL_scale_32++;
340 : #endif /* #ifdef WMOPS */
341 0 : return ( result );
342 : }
343 :
344 0 : cmplx CL_dscale_32( cmplx x, Word32 y1, Word32 y2 )
345 : {
346 : cmplx result;
347 0 : result.re = Mpy_32_32_r( x.re, y1 );
348 0 : result.im = Mpy_32_32_r( x.im, y2 );
349 : #ifdef WMOPS
350 : multiCounter[currCounter].Mpy_32_32_r--;
351 : multiCounter[currCounter].Mpy_32_32_r--;
352 : multiCounter[currCounter].CL_dscale_32++;
353 : #endif /* #ifdef WMOPS */
354 0 : return ( result );
355 : }
356 :
357 0 : cmplx CL_multr_32x32( cmplx x, cmplx y )
358 : {
359 : cmplx result;
360 0 : result.re = W_round64_L( W_sub( W_mult_32_32( x.re, y.re ), W_mult_32_32( x.im, y.im ) ) );
361 0 : result.im = W_round64_L( W_add( W_mult_32_32( x.im, y.re ), W_mult_32_32( x.re, y.im ) ) );
362 :
363 : #ifdef WMOPS
364 : multiCounter[currCounter].CL_multr_32x32++;
365 : multiCounter[currCounter].W_mult_32_32--;
366 : multiCounter[currCounter].W_mult_32_32--;
367 : multiCounter[currCounter].W_mult_32_32--;
368 : multiCounter[currCounter].W_mult_32_32--;
369 : multiCounter[currCounter].W_round64_L--;
370 : multiCounter[currCounter].W_round64_L--;
371 : multiCounter[currCounter].W_sub--;
372 : multiCounter[currCounter].W_add--;
373 : #endif
374 0 : return result;
375 : }
376 :
377 0 : cmplx_s C_mac_r( cmplx x, cmplx_s y, Word16 c )
378 : {
379 : cmplx_s result;
380 0 : cmplx temp = CL_add( x, C_scale( y, c ) );
381 0 : result = CL_round32_16( temp );
382 :
383 : #ifdef WMOPS
384 : multiCounter[currCounter].C_mac_r++;
385 : multiCounter[currCounter].CL_add--;
386 : multiCounter[currCounter].C_scale--;
387 : multiCounter[currCounter].CL_round32_16--;
388 : #endif
389 0 : return result;
390 : }
391 :
392 0 : cmplx_s C_msu_r( cmplx x, cmplx_s y, Word16 c )
393 : {
394 : cmplx_s result;
395 0 : cmplx temp = CL_sub( x, C_scale( y, c ) );
396 0 : result = CL_round32_16( temp );
397 :
398 : #ifdef WMOPS
399 : multiCounter[currCounter].C_msu_r++;
400 : multiCounter[currCounter].CL_sub--;
401 : multiCounter[currCounter].C_scale--;
402 : multiCounter[currCounter].CL_round32_16--;
403 : #endif
404 0 : return result;
405 : }
406 :
407 0 : Word16 C_Extract_real( cmplx_s x )
408 : {
409 : #ifdef WMOPS
410 : multiCounter[currCounter].C_Extract_real++;
411 : #endif
412 0 : return x.re;
413 : }
414 :
415 0 : Word16 C_Extract_imag( cmplx_s x )
416 : {
417 : #ifdef WMOPS
418 : multiCounter[currCounter].C_Extract_imag++;
419 : #endif
420 0 : return x.im;
421 : }
422 :
423 0 : cmplx_s C_negate( cmplx_s x )
424 : {
425 : cmplx_s result;
426 0 : result.re = negate( x.re );
427 0 : result.im = negate( x.im );
428 : #ifdef WMOPS
429 : multiCounter[currCounter].C_negate++;
430 : multiCounter[currCounter].negate--;
431 : multiCounter[currCounter].negate--;
432 : #endif
433 0 : return result;
434 : }
435 :
436 0 : cmplx_s C_conjugate( cmplx_s x )
437 : {
438 : cmplx_s result;
439 0 : result.re = x.re;
440 0 : result.im = negate( x.im );
441 : #ifdef WMOPS
442 : multiCounter[currCounter].C_conjugate++;
443 : multiCounter[currCounter].negate--;
444 : #endif
445 0 : return result;
446 : }
447 :
448 0 : cmplx_s C_shr( cmplx_s inp, Word16 shift_val )
449 : {
450 : cmplx_s out;
451 0 : out.re = shr( inp.re, shift_val );
452 0 : out.im = shr( inp.im, shift_val );
453 : #ifdef WMOPS
454 : multiCounter[currCounter].C_shr++;
455 : multiCounter[currCounter].shr--;
456 : multiCounter[currCounter].shr--;
457 : #endif
458 0 : return out;
459 : }
460 :
461 0 : cmplx_s C_shl( cmplx_s inp, Word16 shift_val )
462 : {
463 : cmplx_s out;
464 0 : out.re = shl( inp.re, shift_val );
465 0 : out.im = shl( inp.im, shift_val );
466 : #ifdef WMOPS
467 : multiCounter[currCounter].C_shl++;
468 : multiCounter[currCounter].shl--;
469 : multiCounter[currCounter].shl--;
470 : #endif
471 0 : return out;
472 : }
473 :
474 : #endif /* #ifdef COMPLEX_OPERATOR */
475 :
476 : /* end of file */
|