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 5353941812 : cmplx CL_shr( cmplx inp, Word16 shift_val )
21 : {
22 : cmplx out;
23 5353941812 : out.re = L_shr( inp.re, shift_val );
24 5353941812 : 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 5353941812 : return out;
31 : }
32 :
33 1523622312 : cmplx CL_shl( cmplx inp, Word16 shift_val )
34 : {
35 : cmplx out;
36 1523622312 : out.re = L_shl( inp.re, shift_val );
37 1523622312 : 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 1523622312 : return out;
44 : }
45 :
46 14723528746 : cmplx CL_add( cmplx inp1, cmplx inp2 )
47 : {
48 : cmplx out;
49 14723528746 : out.re = L_add( inp1.re, inp2.re );
50 14723528746 : 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 14723528746 : return out;
57 : }
58 :
59 10910354614 : cmplx CL_sub( cmplx inp1, cmplx inp2 )
60 : {
61 : cmplx out;
62 10910354614 : out.re = L_sub( inp1.re, inp2.re );
63 10910354614 : 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 10910354614 : return out;
70 : }
71 :
72 5793788904 : cmplx CL_scale( cmplx x, Word16 y )
73 : {
74 : cmplx result;
75 5793788904 : result.re = Mpy_32_16_r( x.re, y );
76 5793788904 : 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 5793788904 : 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 3261480248 : cmplx CL_msu_j( cmplx x, cmplx y )
99 : {
100 : cmplx result;
101 3261480248 : result.re = L_add( x.re, y.im );
102 3261480248 : 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 3261480248 : return result;
109 : }
110 :
111 4854399944 : cmplx CL_mac_j( cmplx x, cmplx y )
112 : {
113 : cmplx result;
114 4854399944 : result.re = L_sub( x.re, y.im );
115 4854399944 : 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 4854399944 : return result;
122 : }
123 :
124 226189 : cmplx CL_move( cmplx x )
125 : {
126 : #ifdef WMOPS
127 : multiCounter[currCounter].CL_move++;
128 : #endif
129 226189 : return x;
130 : }
131 :
132 7643872 : Word32 CL_Extract_real( cmplx x )
133 : {
134 : #ifdef WMOPS
135 : multiCounter[currCounter].CL_Extract_real++;
136 : #endif
137 7643872 : return x.re;
138 : }
139 :
140 7643872 : Word32 CL_Extract_imag( cmplx x )
141 : {
142 : #ifdef WMOPS
143 : multiCounter[currCounter].CL_Extract_imag++;
144 : #endif
145 7643872 : return x.im;
146 : }
147 :
148 7643872 : cmplx CL_form( Word32 re, Word32 im )
149 : {
150 : cmplx result;
151 7643872 : result.re = re;
152 7643872 : result.im = im;
153 : #ifdef WMOPS
154 : multiCounter[currCounter].CL_form++;
155 : #endif
156 7643872 : 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 99271322 : cmplx CL_negate( cmplx x )
179 : {
180 : cmplx result;
181 99271322 : result.re = L_negate( x.re );
182 99271322 : 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 99271322 : return result;
189 : }
190 :
191 1184555832 : cmplx CL_conjugate( cmplx x )
192 : {
193 : cmplx result;
194 1184555832 : result.re = x.re;
195 1184555832 : result.im = L_negate( x.im );
196 : #ifdef WMOPS
197 : multiCounter[currCounter].CL_conjugate++;
198 : multiCounter[currCounter].L_negate--;
199 : #endif
200 1184555832 : return result;
201 : }
202 :
203 :
204 71019058 : cmplx CL_mul_j( cmplx input )
205 : {
206 : cmplx temp, result;
207 71019058 : temp = CL_negate( input );
208 71019058 : result.re = temp.im;
209 71019058 : result.im = input.re;
210 : #ifdef WMOPS
211 : multiCounter[currCounter].CL_mul_j++;
212 : multiCounter[currCounter].CL_negate--;
213 : #endif
214 71019058 : return result;
215 : }
216 :
217 538732322 : cmplx CL_swap_real_imag( cmplx input )
218 : {
219 : cmplx result;
220 538732322 : result.re = input.im;
221 538732322 : result.im = input.re;
222 : #ifdef WMOPS
223 : multiCounter[currCounter].CL_swap_real_imag++;
224 : #endif
225 538732322 : return result;
226 : }
227 :
228 0 : cmplx_s C_add( cmplx_s inp1, cmplx_s inp2 )
229 : {
230 : cmplx_s out;
231 0 : out.re = add( inp1.re, inp2.re );
232 0 : 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 0 : return out;
240 : }
241 :
242 0 : cmplx_s C_sub( cmplx_s inp1, cmplx_s inp2 )
243 : {
244 : cmplx_s out;
245 0 : out.re = sub( inp1.re, inp2.re );
246 0 : 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 0 : return out;
254 : }
255 :
256 0 : cmplx_s C_mul_j( cmplx_s input )
257 : {
258 : cmplx_s result;
259 : Word16 temp;
260 0 : temp = negate( input.im );
261 0 : result.re = temp;
262 0 : result.im = input.re;
263 :
264 : #ifdef WMOPS
265 : multiCounter[currCounter].C_mul_j++;
266 : multiCounter[currCounter].negate--;
267 : #endif
268 0 : return result;
269 : }
270 :
271 0 : cmplx_s C_multr( cmplx_s x, cmplx_s c )
272 : {
273 : cmplx_s result;
274 0 : 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 0 : 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 0 : return result;
291 : }
292 :
293 3821936 : cmplx_s C_form( Word16 re, Word16 im )
294 : {
295 : cmplx_s result;
296 3821936 : result.re = re;
297 3821936 : result.im = im;
298 : #ifdef WMOPS
299 : multiCounter[currCounter].C_form++;
300 : #endif
301 3821936 : 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 */
|