~ubuntu-branches/ubuntu/wily/sflphone/wily

« back to all changes in this revision

Viewing changes to daemon/libs/pjproject-2.0.1/third_party/g7221/common/basic_op.c

  • Committer: Package Import Robot
  • Author(s): Mark Purcell
  • Date: 2014-01-28 18:23:36 UTC
  • mfrom: (1.1.11)
  • mto: This revision was merged to the branch mainline in revision 24.
  • Revision ID: package-import@ubuntu.com-20140128182336-3xenud1kbnwmf3mz
* New upstream release 
  - Fixes "New Upstream Release" (Closes: #735846)
  - Fixes "Ringtone does not stop" (Closes: #727164)
  - Fixes "[sflphone-kde] crash on startup" (Closes: #718178)
  - Fixes "sflphone GUI crashes when call is hung up" (Closes: #736583)
* Build-Depends: ensure GnuTLS 2.6
  - libucommon-dev (>= 6.0.7-1.1), libccrtp-dev (>= 2.0.6-3)
  - Fixes "FTBFS Build-Depends libgnutls{26,28}-dev" (Closes: #722040)
* Fix "boost 1.49 is going away" unversioned Build-Depends: (Closes: #736746)
* Add Build-Depends: libsndfile-dev, nepomuk-core-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#include "config.h"
2
 
 
3
 
#if !PJMEDIA_LIBG7221_FUNCS_INLINED || \
4
 
    (PJMEDIA_LIBG7221_FUNCS_INLINED && defined(__BASIC_OP_H__))
5
 
 
6
 
/*___________________________________________________________________________
7
 
 |                                                                           |
8
 
 | Basic arithmetic operators.                                               |
9
 
 |___________________________________________________________________________|
10
 
*/
11
 
 
12
 
/*___________________________________________________________________________
13
 
 |                                                                           |
14
 
 |   Include-Files                                                           |
15
 
 |___________________________________________________________________________|
16
 
*/
17
 
 
18
 
//#include <stdio.h>
19
 
//#include <stdlib.h>
20
 
#include "typedef.h"
21
 
#include "basic_op.h"
22
 
#include <pj/assert.h>
23
 
 
24
 
#if (WMOPS)
25
 
#include "count.h"
26
 
extern BASIC_OP multiCounter[MAXCOUNTERS];
27
 
extern int currCounter;
28
 
 
29
 
#endif
30
 
 
31
 
/*___________________________________________________________________________
32
 
 |                                                                           |
33
 
 |   Constants and Globals                                                   |
34
 
 |___________________________________________________________________________|
35
 
*/
36
 
#if INCLUDE_UNSAFE
37
 
Flag g7221_Overflow = 0;
38
 
Flag g7221_Carry = 0;
39
 
#endif
40
 
 
41
 
/*___________________________________________________________________________
42
 
 |                                                                           |
43
 
 |   Functions                                                               |
44
 
 |___________________________________________________________________________|
45
 
*/
46
 
/*___________________________________________________________________________
47
 
 |                                                                           |
48
 
 |   Function Name : shr                                                     |
49
 
 |                                                                           |
50
 
 |   Purpose :                                                               |
51
 
 |                                                                           |
52
 
 |   Arithmetically shift the 16 bit input var1 right var2 positions with    |
53
 
 |   sign extension. If var2 is negative, arithmetically shift var1 left by  |
54
 
 |   -var2 with sign extension. Saturate the result in case of underflows or |
55
 
 |   overflows.                                                              |
56
 
 |                                                                           |
57
 
 |   Complexity weight : 1                                                   |
58
 
 |                                                                           |
59
 
 |   Inputs :                                                                |
60
 
 |                                                                           |
61
 
 |    var1                                                                   |
62
 
 |             16 bit short signed integer (Word16) whose value falls in the |
63
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
64
 
 |                                                                           |
65
 
 |    var2                                                                   |
66
 
 |             16 bit short signed integer (Word16) whose value falls in the |
67
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
68
 
 |                                                                           |
69
 
 |   Outputs :                                                               |
70
 
 |                                                                           |
71
 
 |    none                                                                   |
72
 
 |                                                                           |
73
 
 |   Return Value :                                                          |
74
 
 |                                                                           |
75
 
 |    var_out                                                                |
76
 
 |             16 bit short signed integer (Word16) whose value falls in the |
77
 
 |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
78
 
 |___________________________________________________________________________|
79
 
*/
80
 
LIBG7221_DEF(Word16) shr (Word16 var1, Word16 var2)
81
 
{
82
 
    if (var2 < 0)
83
 
    {
84
 
        if (var2 < -16)
85
 
            var2 = -16;
86
 
        return shl_nocheck(var1, (Word16) -var2);
87
 
    }
88
 
    else
89
 
    {
90
 
        return shr_nocheck(var1, var2);
91
 
    }
92
 
}
93
 
/* ------------------------- End of shr() ------------------------- */
94
 
 
95
 
 
96
 
/*___________________________________________________________________________
97
 
 |                                                                           |
98
 
 |   Function Name : shl                                                     |
99
 
 |                                                                           |
100
 
 |   Purpose :                                                               |
101
 
 |                                                                           |
102
 
 |   Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
103
 
 |   the var2 LSB of the result. If var2 is negative, arithmetically shift   |
104
 
 |   var1 right by -var2 with sign extension. Saturate the result in case of |
105
 
 |   underflows or overflows.                                                |
106
 
 |                                                                           |
107
 
 |   Complexity weight : 1                                                   |
108
 
 |                                                                           |
109
 
 |   Inputs :                                                                |
110
 
 |                                                                           |
111
 
 |    var1                                                                   |
112
 
 |             16 bit short signed integer (Word16) whose value falls in the |
113
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
114
 
 |                                                                           |
115
 
 |    var2                                                                   |
116
 
 |             16 bit short signed integer (Word16) whose value falls in the |
117
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
118
 
 |                                                                           |
119
 
 |   Outputs :                                                               |
120
 
 |                                                                           |
121
 
 |    none                                                                   |
122
 
 |                                                                           |
123
 
 |   Return Value :                                                          |
124
 
 |                                                                           |
125
 
 |    var_out                                                                |
126
 
 |             16 bit short signed integer (Word16) whose value falls in the |
127
 
 |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
128
 
 |___________________________________________________________________________|
129
 
*/
130
 
LIBG7221_DEF(Word16) shl (Word16 var1, Word16 var2)
131
 
{
132
 
    if (var2 < 0)
133
 
    {
134
 
        return shr_nocheck(var1, (Word16) -var2);
135
 
    }
136
 
    else
137
 
    {
138
 
        return shl_nocheck(var1, var2);
139
 
    }
140
 
}
141
 
/* ------------------------- End of shl() ------------------------- */
142
 
 
143
 
 
144
 
 
145
 
/*___________________________________________________________________________
146
 
 |                                                                           |
147
 
 |   Function Name : mult                                                    |
148
 
 |                                                                           |
149
 
 |   Purpose :                                                               |
150
 
 |                                                                           |
151
 
 |    Performs the multiplication of var1 by var2 and gives a 16 bit result  |
152
 
 |    which is scaled i.e.:                                                  |
153
 
 |             mult(var1,var2) = extract_l(L_shr((var1 times var2),15)) and  |
154
 
 |             mult(-32768,-32768) = 32767.                                  |
155
 
 |                                                                           |
156
 
 |   Complexity weight : 1                                                   |
157
 
 |                                                                           |
158
 
 |   Inputs :                                                                |
159
 
 |                                                                           |
160
 
 |    var1                                                                   |
161
 
 |             16 bit short signed integer (Word16) whose value falls in the |
162
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
163
 
 |                                                                           |
164
 
 |    var2                                                                   |
165
 
 |             16 bit short signed integer (Word16) whose value falls in the |
166
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
167
 
 |                                                                           |
168
 
 |   Outputs :                                                               |
169
 
 |                                                                           |
170
 
 |    none                                                                   |
171
 
 |                                                                           |
172
 
 |   Return Value :                                                          |
173
 
 |                                                                           |
174
 
 |    var_out                                                                |
175
 
 |             16 bit short signed integer (Word16) whose value falls in the |
176
 
 |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
177
 
 |___________________________________________________________________________|
178
 
*/
179
 
LIBG7221_DEF(Word16) mult (Word16 var1, Word16 var2)
180
 
{
181
 
    Word16 var_out;
182
 
    Word32 L_product;
183
 
 
184
 
    L_product = (Word32) var1 *(Word32) var2;
185
 
 
186
 
    L_product = (L_product & (Word32) 0xffff8000L) >> 15;
187
 
 
188
 
    if (L_product & (Word32) 0x00010000L)
189
 
        L_product = L_product | (Word32) 0xffff0000L;
190
 
 
191
 
    var_out = saturate (L_product);
192
 
#if (WMOPS)
193
 
    multiCounter[currCounter].mult++;
194
 
#endif
195
 
    return (var_out);
196
 
}
197
 
/* ------------------------- End of mult() ------------------------- */
198
 
 
199
 
 
200
 
/*___________________________________________________________________________
201
 
 |                                                                           |
202
 
 |   Function Name : L_msu                                                   |
203
 
 |                                                                           |
204
 
 |   Purpose :                                                               |
205
 
 |                                                                           |
206
 
 |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
207
 
 |   bit result to L_var3 with saturation, return a 32 bit result:           |
208
 
 |        L_msu(L_var3,var1,var2) = L_sub(L_var3,L_mult(var1,var2)).         |
209
 
 |                                                                           |
210
 
 |   Complexity weight : 1                                                   |
211
 
 |                                                                           |
212
 
 |   Inputs :                                                                |
213
 
 |                                                                           |
214
 
 |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
215
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
216
 
 |                                                                           |
217
 
 |    var1                                                                   |
218
 
 |             16 bit short signed integer (Word16) whose value falls in the |
219
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
220
 
 |                                                                           |
221
 
 |    var2                                                                   |
222
 
 |             16 bit short signed integer (Word16) whose value falls in the |
223
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
224
 
 |                                                                           |
225
 
 |   Outputs :                                                               |
226
 
 |                                                                           |
227
 
 |    none                                                                   |
228
 
 |                                                                           |
229
 
 |   Return Value :                                                          |
230
 
 |                                                                           |
231
 
 |    L_var_out                                                              |
232
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
233
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
234
 
 |___________________________________________________________________________|
235
 
*/
236
 
LIBG7221_DEF(Word32) L_msu (Word32 L_var3, Word16 var1, Word16 var2)
237
 
{
238
 
    Word32 L_var_out;
239
 
    Word32 L_product;
240
 
 
241
 
    L_product = L_mult (var1, var2);
242
 
#if (WMOPS)
243
 
    multiCounter[currCounter].L_mult--;
244
 
#endif
245
 
    L_var_out = L_sub (L_var3, L_product);
246
 
#if (WMOPS)
247
 
    multiCounter[currCounter].L_sub--;
248
 
    multiCounter[currCounter].L_msu++;
249
 
#endif
250
 
    return (L_var_out);
251
 
}
252
 
/* ------------------------- End of L_msu() ------------------------- */
253
 
 
254
 
#if INCLUDE_UNSAFE
255
 
/*___________________________________________________________________________
256
 
 |                                                                           |
257
 
 |   Function Name : L_macNs                                                 |
258
 
 |                                                                           |
259
 
 |   Purpose :                                                               |
260
 
 |                                                                           |
261
 
 |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
262
 
 |   result to L_var3 without saturation, return a 32 bit result. Generate   |
263
 
 |   carry and overflow values :                                             |
264
 
 |        L_macNs(L_var3,var1,var2) = L_add_c(L_var3,L_mult(var1,var2)).     |
265
 
 |                                                                           |
266
 
 |   Complexity weight : 1                                                   |
267
 
 |                                                                           |
268
 
 |   Inputs :                                                                |
269
 
 |                                                                           |
270
 
 |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
271
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
272
 
 |                                                                           |
273
 
 |    var1                                                                   |
274
 
 |             16 bit short signed integer (Word16) whose value falls in the |
275
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
276
 
 |                                                                           |
277
 
 |    var2                                                                   |
278
 
 |             16 bit short signed integer (Word16) whose value falls in the |
279
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
280
 
 |                                                                           |
281
 
 |   Outputs :                                                               |
282
 
 |                                                                           |
283
 
 |    none                                                                   |
284
 
 |                                                                           |
285
 
 |   Return Value :                                                          |
286
 
 |                                                                           |
287
 
 |    L_var_out                                                              |
288
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
289
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
290
 
 |                                                                           |
291
 
 |   Caution :                                                               |
292
 
 |                                                                           |
293
 
 |    In some cases the Carry flag has to be cleared or set before using     |
294
 
 |    operators which take into account its value.                           |
295
 
 |___________________________________________________________________________|
296
 
*/
297
 
LIBG7221_DEF(Word32) L_macNs (Word32 L_var3, Word16 var1, Word16 var2)
298
 
{
299
 
    Word32 L_var_out;
300
 
 
301
 
    L_var_out = L_mult (var1, var2);
302
 
#if (WMOPS)
303
 
    multiCounter[currCounter].L_mult--;
304
 
#endif
305
 
    L_var_out = L_add_c (L_var3, L_var_out);
306
 
#if (WMOPS)
307
 
    multiCounter[currCounter].L_add_c--;
308
 
    multiCounter[currCounter].L_macNs++;
309
 
#endif
310
 
    return (L_var_out);
311
 
}
312
 
#endif
313
 
/* ------------------------- End of L_macNs() ------------------------- */
314
 
 
315
 
#if INCLUDE_UNSAFE
316
 
/*___________________________________________________________________________
317
 
 |                                                                           |
318
 
 |   Function Name : L_msuNs                                                 |
319
 
 |                                                                           |
320
 
 |   Purpose :                                                               |
321
 
 |                                                                           |
322
 
 |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
323
 
 |   bit result from L_var3 without saturation, return a 32 bit result. Ge-  |
324
 
 |   nerate carry and overflow values :                                      |
325
 
 |        L_msuNs(L_var3,var1,var2) = L_sub_c(L_var3,L_mult(var1,var2)).     |
326
 
 |                                                                           |
327
 
 |   Complexity weight : 1                                                   |
328
 
 |                                                                           |
329
 
 |   Inputs :                                                                |
330
 
 |                                                                           |
331
 
 |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
332
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
333
 
 |                                                                           |
334
 
 |    var1                                                                   |
335
 
 |             16 bit short signed integer (Word16) whose value falls in the |
336
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
337
 
 |                                                                           |
338
 
 |    var2                                                                   |
339
 
 |             16 bit short signed integer (Word16) whose value falls in the |
340
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
341
 
 |                                                                           |
342
 
 |   Outputs :                                                               |
343
 
 |                                                                           |
344
 
 |    none                                                                   |
345
 
 |                                                                           |
346
 
 |   Return Value :                                                          |
347
 
 |                                                                           |
348
 
 |    L_var_out                                                              |
349
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
350
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
351
 
 |                                                                           |
352
 
 |   Caution :                                                               |
353
 
 |                                                                           |
354
 
 |    In some cases the Carry flag has to be cleared or set before using     |
355
 
 |    operators which take into account its value.                           |
356
 
 |___________________________________________________________________________|
357
 
*/
358
 
LIBG7221_DEF(Word32) L_msuNs (Word32 L_var3, Word16 var1, Word16 var2)
359
 
{
360
 
    Word32 L_var_out;
361
 
 
362
 
    L_var_out = L_mult (var1, var2);
363
 
#if (WMOPS)
364
 
    multiCounter[currCounter].L_mult--;
365
 
#endif
366
 
    L_var_out = L_sub_c (L_var3, L_var_out);
367
 
#if (WMOPS)
368
 
    multiCounter[currCounter].L_sub_c--;
369
 
    multiCounter[currCounter].L_msuNs++;
370
 
#endif
371
 
    return (L_var_out);
372
 
}
373
 
#endif
374
 
 
375
 
/* ------------------------- End of L_msuNs() ------------------------- */
376
 
 
377
 
 
378
 
#if INCLUDE_UNSAFE
379
 
/*___________________________________________________________________________
380
 
 |                                                                           |
381
 
 |   Function Name : L_add_c                                                 |
382
 
 |                                                                           |
383
 
 |   Purpose :                                                               |
384
 
 |                                                                           |
385
 
 |   Performs 32 bits addition of the two 32 bits variables (L_var1+L_var2+C)|
386
 
 |   with carry. No saturation. Generate carry and Overflow values. The car- |
387
 
 |   ry and overflow values are binary variables which can be tested and as- |
388
 
 |   signed values.                                                          |
389
 
 |                                                                           |
390
 
 |   Complexity weight : 2                                                   |
391
 
 |                                                                           |
392
 
 |   Inputs :                                                                |
393
 
 |                                                                           |
394
 
 |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
395
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
396
 
 |                                                                           |
397
 
 |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
398
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
399
 
 |                                                                           |
400
 
 |   Outputs :                                                               |
401
 
 |                                                                           |
402
 
 |    none                                                                   |
403
 
 |                                                                           |
404
 
 |   Return Value :                                                          |
405
 
 |                                                                           |
406
 
 |    L_var_out                                                              |
407
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
408
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
409
 
 |                                                                           |
410
 
 |   Caution :                                                               |
411
 
 |                                                                           |
412
 
 |    In some cases the Carry flag has to be cleared or set before using     |
413
 
 |    operators which take into account its value.                           |
414
 
 |___________________________________________________________________________|
415
 
*/
416
 
LIBG7221_DEF(Word32) L_add_c (Word32 L_var1, Word32 L_var2)
417
 
{
418
 
    Word32 L_var_out;
419
 
    Word32 L_test;
420
 
    Flag carry_int = 0;
421
 
 
422
 
    L_var_out = L_var1 + L_var2 + GET_CARRY();
423
 
 
424
 
    L_test = L_var1 + L_var2;
425
 
 
426
 
    if ((L_var1 > 0) && (L_var2 > 0) && (L_test < 0))
427
 
    {
428
 
        SET_OVERFLOW(1);
429
 
        carry_int = 0;
430
 
    }
431
 
    else
432
 
    {
433
 
        if ((L_var1 < 0) && (L_var2 < 0))
434
 
        {
435
 
            if (L_test >= 0)
436
 
            {
437
 
                SET_OVERFLOW(1);
438
 
                carry_int = 1;
439
 
            }
440
 
            else
441
 
            {
442
 
                SET_OVERFLOW(0);
443
 
                carry_int = 1;
444
 
            }
445
 
        }
446
 
        else
447
 
        {
448
 
            if (((L_var1 ^ L_var2) < 0) && (L_test >= 0))
449
 
            {
450
 
                SET_OVERFLOW(0);
451
 
                carry_int = 1;
452
 
            }
453
 
            else
454
 
            {
455
 
                SET_OVERFLOW(0);
456
 
                carry_int = 0;
457
 
            }
458
 
        }
459
 
    }
460
 
 
461
 
    if (GET_CARRY())
462
 
    {
463
 
        if (L_test == MAX_32)
464
 
        {
465
 
            SET_OVERFLOW(1);
466
 
            SET_CARRY(carry_int);
467
 
        }
468
 
        else
469
 
        {
470
 
            if (L_test == (Word32) 0xFFFFFFFFL)
471
 
            {
472
 
                SET_CARRY(1);
473
 
            }
474
 
            else
475
 
            {
476
 
                SET_CARRY(carry_int);
477
 
            }
478
 
        }
479
 
    }
480
 
    else
481
 
    {
482
 
        SET_CARRY(carry_int);
483
 
    }
484
 
 
485
 
#if (WMOPS)
486
 
    multiCounter[currCounter].L_add_c++;
487
 
#endif
488
 
    return (L_var_out);
489
 
}
490
 
#endif
491
 
 
492
 
/* ------------------------- End of L_add_c() ------------------------- */
493
 
 
494
 
#if INCLUDE_UNSAFE
495
 
/*___________________________________________________________________________
496
 
 |                                                                           |
497
 
 |   Function Name : L_sub_c                                                 |
498
 
 |                                                                           |
499
 
 |   Purpose :                                                               |
500
 
 |                                                                           |
501
 
 |   Performs 32 bits subtraction of the two 32 bits variables with carry    |
502
 
 |   (borrow) : L_var1-L_var2-C. No saturation. Generate carry and Overflow  |
503
 
 |   values. The carry and overflow values are binary variables which can    |
504
 
 |   be tested and assigned values.                                          |
505
 
 |                                                                           |
506
 
 |   Complexity weight : 2                                                   |
507
 
 |                                                                           |
508
 
 |   Inputs :                                                                |
509
 
 |                                                                           |
510
 
 |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
511
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
512
 
 |                                                                           |
513
 
 |    L_var2   32 bit long signed integer (Word32) whose value falls in the  |
514
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
515
 
 |                                                                           |
516
 
 |   Outputs :                                                               |
517
 
 |                                                                           |
518
 
 |    none                                                                   |
519
 
 |                                                                           |
520
 
 |   Return Value :                                                          |
521
 
 |                                                                           |
522
 
 |    L_var_out                                                              |
523
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
524
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
525
 
 |                                                                           |
526
 
 |   Caution :                                                               |
527
 
 |                                                                           |
528
 
 |    In some cases the Carry flag has to be cleared or set before using     |
529
 
 |    operators which take into account its value.                           |
530
 
 |___________________________________________________________________________|
531
 
*/
532
 
LIBG7221_DEF(Word32) L_sub_c (Word32 L_var1, Word32 L_var2)
533
 
{
534
 
    Word32 L_var_out;
535
 
    Word32 L_test;
536
 
    Flag carry_int = 0;
537
 
 
538
 
    if (GET_CARRY())
539
 
    {
540
 
        SET_CARRY(0);
541
 
        if (L_var2 != MIN_32)
542
 
        {
543
 
            L_var_out = L_add_c (L_var1, -L_var2);
544
 
#if (WMOPS)
545
 
            multiCounter[currCounter].L_add_c--;
546
 
#endif
547
 
        }
548
 
        else
549
 
        {
550
 
            L_var_out = L_var1 - L_var2;
551
 
            if (L_var1 > 0L)
552
 
            {
553
 
                SET_OVERFLOW(1);
554
 
                SET_CARRY(0);
555
 
            }
556
 
        }
557
 
    }
558
 
    else
559
 
    {
560
 
        L_var_out = L_var1 - L_var2 - (Word32) 0X00000001L;
561
 
        L_test = L_var1 - L_var2;
562
 
 
563
 
        if ((L_test < 0) && (L_var1 > 0) && (L_var2 < 0))
564
 
        {
565
 
            SET_OVERFLOW(1);
566
 
            carry_int = 0;
567
 
        }
568
 
        else if ((L_test > 0) && (L_var1 < 0) && (L_var2 > 0))
569
 
        {
570
 
            SET_OVERFLOW(1);
571
 
            carry_int = 1;
572
 
        }
573
 
        else if ((L_test > 0) && ((L_var1 ^ L_var2) > 0))
574
 
        {
575
 
            SET_OVERFLOW(0);
576
 
            carry_int = 1;
577
 
        }
578
 
        if (L_test == MIN_32)
579
 
        {
580
 
            SET_OVERFLOW(1);
581
 
            SET_CARRY(carry_int);
582
 
        }
583
 
        else
584
 
        {
585
 
            SET_CARRY(carry_int);
586
 
        }
587
 
    }
588
 
 
589
 
#if (WMOPS)
590
 
    multiCounter[currCounter].L_sub_c++;
591
 
#endif
592
 
    return (L_var_out);
593
 
}
594
 
#endif
595
 
/* ------------------------- End of L_sub_c() ------------------------- */
596
 
 
597
 
 
598
 
/*___________________________________________________________________________
599
 
 |                                                                           |
600
 
 |   Function Name : L_negate                                                |
601
 
 |                                                                           |
602
 
 |   Purpose :                                                               |
603
 
 |                                                                           |
604
 
 |   Negate the 32 bit variable L_var1 with saturation; saturate in the case |
605
 
 |   where input is -2147483648 (0x8000 0000).                               |
606
 
 |                                                                           |
607
 
 |   Complexity weight : 2                                                   |
608
 
 |                                                                           |
609
 
 |   Inputs :                                                                |
610
 
 |                                                                           |
611
 
 |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
612
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
613
 
 |                                                                           |
614
 
 |   Outputs :                                                               |
615
 
 |                                                                           |
616
 
 |    none                                                                   |
617
 
 |                                                                           |
618
 
 |   Return Value :                                                          |
619
 
 |                                                                           |
620
 
 |    L_var_out                                                              |
621
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
622
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
623
 
 |___________________________________________________________________________|
624
 
*/
625
 
LIBG7221_DEF(Word32) L_negate (Word32 L_var1)
626
 
{
627
 
    Word32 L_var_out;
628
 
 
629
 
    L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;
630
 
#if (WMOPS)
631
 
    multiCounter[currCounter].L_negate++;
632
 
#endif
633
 
    return (L_var_out);
634
 
}
635
 
/* ------------------------- End of L_negate() ------------------------- */
636
 
 
637
 
 
638
 
/*___________________________________________________________________________
639
 
 |                                                                           |
640
 
 |   Function Name : mult_r                                                  |
641
 
 |                                                                           |
642
 
 |   Purpose :                                                               |
643
 
 |                                                                           |
644
 
 |   Same as mult with rounding, i.e.:                                       |
645
 
 |     mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |
646
 
 |     mult_r(-32768,-32768) = 32767.                                        |
647
 
 |                                                                           |
648
 
 |   Complexity weight : 2                                                   |
649
 
 |                                                                           |
650
 
 |   Inputs :                                                                |
651
 
 |                                                                           |
652
 
 |    var1                                                                   |
653
 
 |             16 bit short signed integer (Word16) whose value falls in the |
654
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
655
 
 |                                                                           |
656
 
 |    var2                                                                   |
657
 
 |             16 bit short signed integer (Word16) whose value falls in the |
658
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
659
 
 |                                                                           |
660
 
 |   Outputs :                                                               |
661
 
 |                                                                           |
662
 
 |    none                                                                   |
663
 
 |                                                                           |
664
 
 |   Return Value :                                                          |
665
 
 |                                                                           |
666
 
 |    var_out                                                                |
667
 
 |             16 bit short signed integer (Word16) whose value falls in the |
668
 
 |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
669
 
 |___________________________________________________________________________|
670
 
*/
671
 
LIBG7221_DEF(Word16) mult_r (Word16 var1, Word16 var2)
672
 
{
673
 
    Word16 var_out;
674
 
    Word32 L_product_arr;
675
 
 
676
 
    L_product_arr = (Word32) var1 *(Word32) var2;       /* product */
677
 
    L_product_arr += (Word32) 0x00004000L;      /* round */
678
 
    L_product_arr &= (Word32) 0xffff8000L;
679
 
    L_product_arr >>= 15;       /* shift */
680
 
 
681
 
    if (L_product_arr & (Word32) 0x00010000L)   /* sign extend when necessary */
682
 
    {
683
 
        L_product_arr |= (Word32) 0xffff0000L;
684
 
    }
685
 
    var_out = saturate (L_product_arr);
686
 
#if (WMOPS)
687
 
    multiCounter[currCounter].mult_r++;
688
 
#endif
689
 
    return (var_out);
690
 
}
691
 
/* ------------------------- End of mult_r() ------------------------- */
692
 
 
693
 
 
694
 
 
695
 
/*___________________________________________________________________________
696
 
 |                                                                           |
697
 
 |   Function Name : shr_r                                                   |
698
 
 |                                                                           |
699
 
 |   Purpose :                                                               |
700
 
 |                                                                           |
701
 
 |   Same as shr(var1,var2) but with rounding. Saturate the result in case of|
702
 
 |   underflows or overflows :                                               |
703
 
 |    - If var2 is greater than zero :                                       |
704
 
 |          if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1))))            |
705
 
 |          is equal to zero                                                 |
706
 
 |                     then                                                  |
707
 
 |                     shr_r(var1,var2) = shr(var1,var2)                     |
708
 
 |                     else                                                  |
709
 
 |                     shr_r(var1,var2) = add(shr(var1,var2),1)              |
710
 
 |    - If var2 is less than or equal to zero :                              |
711
 
 |                     shr_r(var1,var2) = shr(var1,var2).                    |
712
 
 |                                                                           |
713
 
 |   Complexity weight : 2                                                   |
714
 
 |                                                                           |
715
 
 |   Inputs :                                                                |
716
 
 |                                                                           |
717
 
 |    var1                                                                   |
718
 
 |             16 bit short signed integer (Word16) whose value falls in the |
719
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
720
 
 |                                                                           |
721
 
 |    var2                                                                   |
722
 
 |             16 bit short signed integer (Word16) whose value falls in the |
723
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
724
 
 |                                                                           |
725
 
 |   Outputs :                                                               |
726
 
 |                                                                           |
727
 
 |    none                                                                   |
728
 
 |                                                                           |
729
 
 |   Return Value :                                                          |
730
 
 |                                                                           |
731
 
 |    var_out                                                                |
732
 
 |             16 bit short signed integer (Word16) whose value falls in the |
733
 
 |             range : 0xffff 8000 <= var_out <= 0x0000 7fff.                |
734
 
 |___________________________________________________________________________|
735
 
*/
736
 
LIBG7221_DEF(Word16) shr_r (Word16 var1, Word16 var2)
737
 
{
738
 
    Word16 var_out;
739
 
 
740
 
    if (var2 > 15)
741
 
    {
742
 
        var_out = 0;
743
 
    }
744
 
    else
745
 
    {
746
 
        var_out = shr (var1, var2);
747
 
#if (WMOPS)
748
 
        multiCounter[currCounter].shr--;
749
 
#endif
750
 
 
751
 
        if (var2 > 0)
752
 
        {
753
 
            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
754
 
            {
755
 
                var_out++;
756
 
            }
757
 
        }
758
 
    }
759
 
#if (WMOPS)
760
 
    multiCounter[currCounter].shr_r++;
761
 
#endif
762
 
    return (var_out);
763
 
}
764
 
/* ------------------------- End of shr_r() ------------------------- */
765
 
 
766
 
 
767
 
/*___________________________________________________________________________
768
 
 |                                                                           |
769
 
 |   Function Name : mac_r                                                   |
770
 
 |                                                                           |
771
 
 |   Purpose :                                                               |
772
 
 |                                                                           |
773
 
 |   Multiply var1 by var2 and shift the result left by 1. Add the 32 bit    |
774
 
 |   result to L_var3 with saturation. Round the LS 16 bits of the result    |
775
 
 |   into the MS 16 bits with saturation and shift the result right by 16.   |
776
 
 |   Return a 16 bit result.                                                 |
777
 
 |            mac_r(L_var3,var1,var2) = round(L_mac(L_var3,var1,var2))       |
778
 
 |                                                                           |
779
 
 |   Complexity weight : 2                                                   |
780
 
 |                                                                           |
781
 
 |   Inputs :                                                                |
782
 
 |                                                                           |
783
 
 |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
784
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
785
 
 |                                                                           |
786
 
 |    var1                                                                   |
787
 
 |             16 bit short signed integer (Word16) whose value falls in the |
788
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
789
 
 |                                                                           |
790
 
 |    var2                                                                   |
791
 
 |             16 bit short signed integer (Word16) whose value falls in the |
792
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
793
 
 |                                                                           |
794
 
 |   Outputs :                                                               |
795
 
 |                                                                           |
796
 
 |    none                                                                   |
797
 
 |                                                                           |
798
 
 |   Return Value :                                                          |
799
 
 |                                                                           |
800
 
 |    var_out                                                                |
801
 
 |             16 bit short signed integer (Word16) whose value falls in the |
802
 
 |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |
803
 
 |___________________________________________________________________________|
804
 
*/
805
 
LIBG7221_DEF(Word16) mac_r (Word32 L_var3, Word16 var1, Word16 var2)
806
 
{
807
 
    Word16 var_out;
808
 
 
809
 
    L_var3 = L_mac (L_var3, var1, var2);
810
 
#if (WMOPS)
811
 
    multiCounter[currCounter].L_mac--;
812
 
#endif
813
 
    L_var3 = L_add (L_var3, (Word32) 0x00008000L);
814
 
#if (WMOPS)
815
 
    multiCounter[currCounter].L_add--;
816
 
#endif
817
 
    var_out = extract_h (L_var3);
818
 
#if (WMOPS)
819
 
    multiCounter[currCounter].extract_h--;
820
 
    multiCounter[currCounter].mac_r++;
821
 
#endif
822
 
    return (var_out);
823
 
}
824
 
/* ------------------------- End of mac_r() ------------------------- */
825
 
 
826
 
 
827
 
/*___________________________________________________________________________
828
 
 |                                                                           |
829
 
 |   Function Name : msu_r                                                   |
830
 
 |                                                                           |
831
 
 |   Purpose :                                                               |
832
 
 |                                                                           |
833
 
 |   Multiply var1 by var2 and shift the result left by 1. Subtract the 32   |
834
 
 |   bit result to L_var3 with saturation. Round the LS 16 bits of the res-  |
835
 
 |   ult into the MS 16 bits with saturation and shift the result right by   |
836
 
 |   16. Return a 16 bit result.                                             |
837
 
 |            msu_r(L_var3,var1,var2) = round(L_msu(L_var3,var1,var2))       |
838
 
 |                                                                           |
839
 
 |   Complexity weight : 2                                                   |
840
 
 |                                                                           |
841
 
 |   Inputs :                                                                |
842
 
 |                                                                           |
843
 
 |    L_var3   32 bit long signed integer (Word32) whose value falls in the  |
844
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
845
 
 |                                                                           |
846
 
 |    var1                                                                   |
847
 
 |             16 bit short signed integer (Word16) whose value falls in the |
848
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
849
 
 |                                                                           |
850
 
 |    var2                                                                   |
851
 
 |             16 bit short signed integer (Word16) whose value falls in the |
852
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
853
 
 |                                                                           |
854
 
 |   Outputs :                                                               |
855
 
 |                                                                           |
856
 
 |    none                                                                   |
857
 
 |                                                                           |
858
 
 |   Return Value :                                                          |
859
 
 |                                                                           |
860
 
 |    var_out                                                                |
861
 
 |             16 bit short signed integer (Word16) whose value falls in the |
862
 
 |             range : 0x0000 8000 <= L_var_out <= 0x0000 7fff.              |
863
 
 |___________________________________________________________________________|
864
 
*/
865
 
LIBG7221_DEF(Word16) msu_r (Word32 L_var3, Word16 var1, Word16 var2)
866
 
{
867
 
    Word16 var_out;
868
 
 
869
 
    L_var3 = L_msu (L_var3, var1, var2);
870
 
#if (WMOPS)
871
 
    multiCounter[currCounter].L_msu--;
872
 
#endif
873
 
    L_var3 = L_add (L_var3, (Word32) 0x00008000L);
874
 
#if (WMOPS)
875
 
    multiCounter[currCounter].L_add--;
876
 
#endif
877
 
    var_out = extract_h (L_var3);
878
 
#if (WMOPS)
879
 
    multiCounter[currCounter].extract_h--;
880
 
    multiCounter[currCounter].msu_r++;
881
 
#endif
882
 
    return (var_out);
883
 
}
884
 
/* ------------------------- End of msu_r() ------------------------- */
885
 
 
886
 
 
887
 
/*___________________________________________________________________________
888
 
 |                                                                           |
889
 
 |   Function Name : L_deposit_h                                             |
890
 
 |                                                                           |
891
 
 |   Purpose :                                                               |
892
 
 |                                                                           |
893
 
 |   Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The   |
894
 
 |   16 LS bits of the output are zeroed.                                    |
895
 
 |                                                                           |
896
 
 |   Complexity weight : 2                                                   |
897
 
 |                                                                           |
898
 
 |   Inputs :                                                                |
899
 
 |                                                                           |
900
 
 |    var1                                                                   |
901
 
 |             16 bit short signed integer (Word16) whose value falls in the |
902
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
903
 
 |                                                                           |
904
 
 |   Outputs :                                                               |
905
 
 |                                                                           |
906
 
 |    none                                                                   |
907
 
 |                                                                           |
908
 
 |   Return Value :                                                          |
909
 
 |                                                                           |
910
 
 |    L_var_out                                                              |
911
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
912
 
 |             range : 0x8000 0000 <= var_out <= 0x7fff 0000.                |
913
 
 |___________________________________________________________________________|
914
 
*/
915
 
LIBG7221_DEF(Word32) L_deposit_h (Word16 var1)
916
 
{
917
 
    Word32 L_var_out;
918
 
 
919
 
    L_var_out = (Word32) var1 << 16;
920
 
#if (WMOPS)
921
 
    multiCounter[currCounter].L_deposit_h++;
922
 
#endif
923
 
    return (L_var_out);
924
 
}
925
 
/* ------------------------- End of L_deposit_h() ------------------------- */
926
 
 
927
 
 
928
 
/*___________________________________________________________________________
929
 
 |                                                                           |
930
 
 |   Function Name : L_deposit_l                                             |
931
 
 |                                                                           |
932
 
 |   Purpose :                                                               |
933
 
 |                                                                           |
934
 
 |   Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The   |
935
 
 |   16 MS bits of the output are sign extended.                             |
936
 
 |                                                                           |
937
 
 |   Complexity weight : 2                                                   |
938
 
 |                                                                           |
939
 
 |   Inputs :                                                                |
940
 
 |                                                                           |
941
 
 |    var1                                                                   |
942
 
 |             16 bit short signed integer (Word16) whose value falls in the |
943
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
944
 
 |                                                                           |
945
 
 |   Outputs :                                                               |
946
 
 |                                                                           |
947
 
 |    none                                                                   |
948
 
 |                                                                           |
949
 
 |   Return Value :                                                          |
950
 
 |                                                                           |
951
 
 |    L_var_out                                                              |
952
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
953
 
 |             range : 0xFFFF 8000 <= var_out <= 0x0000 7fff.                |
954
 
 |___________________________________________________________________________|
955
 
*/
956
 
LIBG7221_DEF(Word32) L_deposit_l (Word16 var1)
957
 
{
958
 
    Word32 L_var_out;
959
 
 
960
 
    L_var_out = (Word32) var1;
961
 
#if (WMOPS)
962
 
    multiCounter[currCounter].L_deposit_l++;
963
 
#endif
964
 
    return (L_var_out);
965
 
}
966
 
/* ------------------------- End of L_deposit_l() ------------------------- */
967
 
 
968
 
 
969
 
/*___________________________________________________________________________
970
 
 |                                                                           |
971
 
 |   Function Name : L_shr_r                                                 |
972
 
 |                                                                           |
973
 
 |   Purpose :                                                               |
974
 
 |                                                                           |
975
 
 |   Same as L_shr(L_var1,var2) but with rounding. Saturate the result in    |
976
 
 |   case of underflows or overflows :                                       |
977
 
 |    - If var2 is greater than zero :                                       |
978
 
 |          if (L_sub(L_shl(L_shr(L_var1,var2),1),L_shr(L_var1,sub(var2,1))))|
979
 
 |          is equal to zero                                                 |
980
 
 |                     then                                                  |
981
 
 |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2)             |
982
 
 |                     else                                                  |
983
 
 |                     L_shr_r(L_var1,var2) = L_add(L_shr(L_var1,var2),1)    |
984
 
 |    - If var2 is less than or equal to zero :                              |
985
 
 |                     L_shr_r(L_var1,var2) = L_shr(L_var1,var2).            |
986
 
 |                                                                           |
987
 
 |   Complexity weight : 3                                                   |
988
 
 |                                                                           |
989
 
 |   Inputs :                                                                |
990
 
 |                                                                           |
991
 
 |    L_var1                                                                 |
992
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
993
 
 |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
994
 
 |                                                                           |
995
 
 |    var2                                                                   |
996
 
 |             16 bit short signed integer (Word16) whose value falls in the |
997
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
998
 
 |                                                                           |
999
 
 |   Outputs :                                                               |
1000
 
 |                                                                           |
1001
 
 |    none                                                                   |
1002
 
 |                                                                           |
1003
 
 |   Return Value :                                                          |
1004
 
 |                                                                           |
1005
 
 |    L_var_out                                                              |
1006
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1007
 
 |             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |
1008
 
 |___________________________________________________________________________|
1009
 
*/
1010
 
LIBG7221_DEF(Word32) L_shr_r (Word32 L_var1, Word16 var2)
1011
 
{
1012
 
    Word32 L_var_out;
1013
 
 
1014
 
    if (var2 > 31)
1015
 
    {
1016
 
        L_var_out = 0;
1017
 
    }
1018
 
    else
1019
 
    {
1020
 
        L_var_out = L_shr (L_var1, var2);
1021
 
#if (WMOPS)
1022
 
        multiCounter[currCounter].L_shr--;
1023
 
#endif
1024
 
        if (var2 > 0)
1025
 
        {
1026
 
            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
1027
 
            {
1028
 
                L_var_out++;
1029
 
            }
1030
 
        }
1031
 
    }
1032
 
#if (WMOPS)
1033
 
    multiCounter[currCounter].L_shr_r++;
1034
 
#endif
1035
 
    return (L_var_out);
1036
 
}
1037
 
/* ------------------------- End of L_shr_r() ------------------------- */
1038
 
 
1039
 
 
1040
 
/*___________________________________________________________________________
1041
 
 |                                                                           |
1042
 
 |   Function Name : L_abs                                                   |
1043
 
 |                                                                           |
1044
 
 |   Purpose :                                                               |
1045
 
 |                                                                           |
1046
 
 |    Absolute value of L_var1; Saturate in case where the input is          |
1047
 
 |                                                               -214783648  |
1048
 
 |                                                                           |
1049
 
 |   Complexity weight : 3                                                   |
1050
 
 |                                                                           |
1051
 
 |   Inputs :                                                                |
1052
 
 |                                                                           |
1053
 
 |    L_var1                                                                 |
1054
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1055
 
 |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
1056
 
 |                                                                           |
1057
 
 |   Outputs :                                                               |
1058
 
 |                                                                           |
1059
 
 |    none                                                                   |
1060
 
 |                                                                           |
1061
 
 |   Return Value :                                                          |
1062
 
 |                                                                           |
1063
 
 |    L_var_out                                                              |
1064
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1065
 
 |             range : 0x0000 0000 <= var_out <= 0x7fff ffff.                |
1066
 
 |___________________________________________________________________________|
1067
 
*/
1068
 
LIBG7221_DEF(Word32) L_abs (Word32 L_var1)
1069
 
{
1070
 
    Word32 L_var_out;
1071
 
 
1072
 
    if (L_var1 == MIN_32)
1073
 
    {
1074
 
        L_var_out = MAX_32;
1075
 
    }
1076
 
    else
1077
 
    {
1078
 
        if (L_var1 < 0)
1079
 
        {
1080
 
            L_var_out = -L_var1;
1081
 
        }
1082
 
        else
1083
 
        {
1084
 
            L_var_out = L_var1;
1085
 
        }
1086
 
    }
1087
 
 
1088
 
#if (WMOPS)
1089
 
    multiCounter[currCounter].L_abs++;
1090
 
#endif
1091
 
    return (L_var_out);
1092
 
}
1093
 
/* ------------------------- End of L_abs() ------------------------- */
1094
 
 
1095
 
 
1096
 
/*___________________________________________________________________________
1097
 
 |                                                                           |
1098
 
 |   Function Name : norm_s                                                  |
1099
 
 |                                                                           |
1100
 
 |   Purpose :                                                               |
1101
 
 |                                                                           |
1102
 
 |   Produces the number of left shift needed to normalize the 16 bit varia- |
1103
 
 |   ble var1 for positive values on the interval with minimum of 16384 and  |
1104
 
 |   maximum of 32767, and for negative values on the interval with minimum  |
1105
 
 |   of -32768 and maximum of -16384; in order to normalize the result, the  |
1106
 
 |   following operation must be done :                                      |
1107
 
 |                    norm_var1 = shl(var1,norm_s(var1)).                    |
1108
 
 |                                                                           |
1109
 
 |   Complexity weight : 15                                                  |
1110
 
 |                                                                           |
1111
 
 |   Inputs :                                                                |
1112
 
 |                                                                           |
1113
 
 |    var1                                                                   |
1114
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1115
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
1116
 
 |                                                                           |
1117
 
 |   Outputs :                                                               |
1118
 
 |                                                                           |
1119
 
 |    none                                                                   |
1120
 
 |                                                                           |
1121
 
 |   Return Value :                                                          |
1122
 
 |                                                                           |
1123
 
 |    var_out                                                                |
1124
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1125
 
 |             range : 0x0000 0000 <= var_out <= 0x0000 000f.                |
1126
 
 |___________________________________________________________________________|
1127
 
*/
1128
 
LIBG7221_DEF(Word16) norm_s (Word16 var1)
1129
 
{
1130
 
    Word16 var_out;
1131
 
 
1132
 
    if (var1 == 0)
1133
 
    {
1134
 
        var_out = 0;
1135
 
    }
1136
 
    else
1137
 
    {
1138
 
        if ((UWord16)var1 == (UWord16)0xffff)
1139
 
        {
1140
 
            var_out = 15;
1141
 
        }
1142
 
        else
1143
 
        {
1144
 
            if (var1 < 0)
1145
 
            {
1146
 
                var1 = (Word16)(~var1);
1147
 
            }
1148
 
            for (var_out = 0; var1 < 0x4000; var_out++)
1149
 
            {
1150
 
                var1 <<= 1;
1151
 
            }
1152
 
        }
1153
 
    }
1154
 
 
1155
 
#if (WMOPS)
1156
 
    multiCounter[currCounter].norm_s++;
1157
 
#endif
1158
 
    return (var_out);
1159
 
}
1160
 
/* ------------------------- End of norm_s() ------------------------- */
1161
 
 
1162
 
 
1163
 
/*___________________________________________________________________________
1164
 
 |                                                                           |
1165
 
 |   Function Name : div_s                                                   |
1166
 
 |                                                                           |
1167
 
 |   Purpose :                                                               |
1168
 
 |                                                                           |
1169
 
 |   Produces a result which is the fractional integer division of var1  by  |
1170
 
 |   var2; var1 and var2 must be positive and var2 must be greater or equal  |
1171
 
 |   to var1; the result is positive (leading bit equal to 0) and truncated  |
1172
 
 |   to 16 bits.                                                             |
1173
 
 |   If var1 = var2 then div(var1,var2) = 32767.                             |
1174
 
 |                                                                           |
1175
 
 |   Complexity weight : 18                                                  |
1176
 
 |                                                                           |
1177
 
 |   Inputs :                                                                |
1178
 
 |                                                                           |
1179
 
 |    var1                                                                   |
1180
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1181
 
 |             range : 0x0000 0000 <= var1 <= var2 and var2 != 0.            |
1182
 
 |                                                                           |
1183
 
 |    var2                                                                   |
1184
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1185
 
 |             range : var1 <= var2 <= 0x0000 7fff and var2 != 0.            |
1186
 
 |                                                                           |
1187
 
 |   Outputs :                                                               |
1188
 
 |                                                                           |
1189
 
 |    none                                                                   |
1190
 
 |                                                                           |
1191
 
 |   Return Value :                                                          |
1192
 
 |                                                                           |
1193
 
 |    var_out                                                                |
1194
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1195
 
 |             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
1196
 
 |             It's a Q15 value (point between b15 and b14).                 |
1197
 
 |___________________________________________________________________________|
1198
 
*/
1199
 
LIBG7221_DEF(Word16) div_s (Word16 var1, Word16 var2)
1200
 
{
1201
 
    Word16 var_out = 0;
1202
 
    Word16 iteration;
1203
 
    Word32 L_num;
1204
 
    Word32 L_denom;
1205
 
 
1206
 
    if ((var1 > var2) || (var1 < 0) || (var2 < 0))
1207
 
    {
1208
 
        //printf ("Division Error var1=%d  var2=%d\n", var1, var2);
1209
 
        //abort(); /* exit (0); */
1210
 
        pj_assert(!"Division Error");
1211
 
    }
1212
 
    if (var2 == 0)
1213
 
    {
1214
 
        //printf ("Division by 0, Fatal error \n");
1215
 
        //abort(); /* exit (0); */
1216
 
        assert(!"Division by 0");
1217
 
    }
1218
 
    if (var1 == 0)
1219
 
    {
1220
 
        var_out = 0;
1221
 
    }
1222
 
    else
1223
 
    {
1224
 
        if (var1 == var2)
1225
 
        {
1226
 
            var_out = MAX_16;
1227
 
        }
1228
 
        else
1229
 
        {
1230
 
            L_num = L_deposit_l (var1);
1231
 
#if (WMOPS)
1232
 
            multiCounter[currCounter].L_deposit_l--;
1233
 
#endif
1234
 
            L_denom = L_deposit_l (var2);
1235
 
#if (WMOPS)
1236
 
            multiCounter[currCounter].L_deposit_l--;
1237
 
#endif
1238
 
 
1239
 
            for (iteration = 0; iteration < 15; iteration++)
1240
 
            {
1241
 
                var_out <<= 1;
1242
 
                L_num <<= 1;
1243
 
 
1244
 
                if (L_num >= L_denom)
1245
 
                {
1246
 
                    L_num = L_sub (L_num, L_denom);
1247
 
#if (WMOPS)
1248
 
                    multiCounter[currCounter].L_sub--;
1249
 
#endif
1250
 
                    var_out = add (var_out, 1);
1251
 
#if (WMOPS)
1252
 
                    multiCounter[currCounter].add--;
1253
 
#endif
1254
 
                }
1255
 
            }
1256
 
        }
1257
 
    }
1258
 
 
1259
 
#if (WMOPS)
1260
 
    multiCounter[currCounter].div_s++;
1261
 
#endif
1262
 
    return (var_out);
1263
 
}
1264
 
/* ------------------------- End of div_s() ------------------------- */
1265
 
 
1266
 
 
1267
 
/*___________________________________________________________________________
1268
 
 |                                                                           |
1269
 
 |   Function Name : norm_l                                                  |
1270
 
 |                                                                           |
1271
 
 |   Purpose :                                                               |
1272
 
 |                                                                           |
1273
 
 |   Produces the number of left shifts needed to normalize the 32 bit varia-|
1274
 
 |   ble L_var1 for positive values on the interval with minimum of          |
1275
 
 |   1073741824 and maximum of 2147483647, and for negative values on the in-|
1276
 
 |   terval with minimum of -2147483648 and maximum of -1073741824; in order |
1277
 
 |   to normalize the result, the following operation must be done :         |
1278
 
 |                   norm_L_var1 = L_shl(L_var1,norm_l(L_var1)).             |
1279
 
 |                                                                           |
1280
 
 |   Complexity weight : 30                                                  |
1281
 
 |                                                                           |
1282
 
 |   Inputs :                                                                |
1283
 
 |                                                                           |
1284
 
 |    L_var1                                                                 |
1285
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1286
 
 |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
1287
 
 |                                                                           |
1288
 
 |   Outputs :                                                               |
1289
 
 |                                                                           |
1290
 
 |    none                                                                   |
1291
 
 |                                                                           |
1292
 
 |   Return Value :                                                          |
1293
 
 |                                                                           |
1294
 
 |    var_out                                                                |
1295
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1296
 
 |             range : 0x0000 0000 <= var_out <= 0x0000 001f.                |
1297
 
 |___________________________________________________________________________|
1298
 
*/
1299
 
LIBG7221_DEF(Word16) norm_l (Word32 L_var1)
1300
 
{
1301
 
    Word16 var_out;
1302
 
 
1303
 
    if (L_var1 == 0)
1304
 
    {
1305
 
        var_out = 0;
1306
 
    }
1307
 
    else
1308
 
    {
1309
 
        if (L_var1 == (Word32) 0xffffffffL)
1310
 
        {
1311
 
            var_out = 31;
1312
 
        }
1313
 
        else
1314
 
        {
1315
 
            if (L_var1 < 0)
1316
 
            {
1317
 
                L_var1 = ~L_var1;
1318
 
            }
1319
 
            for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
1320
 
            {
1321
 
                L_var1 <<= 1;
1322
 
            }
1323
 
        }
1324
 
    }
1325
 
 
1326
 
#if (WMOPS)
1327
 
    multiCounter[currCounter].norm_l++;
1328
 
#endif
1329
 
    return (var_out);
1330
 
}
1331
 
/* ------------------------- End of norm_l() ------------------------- */
1332
 
 
1333
 
 
1334
 
/*
1335
 
  *****************************************************************
1336
 
   Additional operators extracted from the G.723.1 Library
1337
 
   Adapted for WMOPS calculations
1338
 
  *****************************************************************
1339
 
*/
1340
 
 
1341
 
/*___________________________________________________________________________
1342
 
 |                                                                           |
1343
 
 |   Function Name : L_mls                                                   |
1344
 
 |                                                                           |
1345
 
 |   Purpose :                                                               |
1346
 
 |                                                                           |
1347
 
 |   Multiplies a 16 bit word v by a 32 bit word Lv and returns a 32 bit     |
1348
 
 |   word (multiplying 16 by 32 bit words gives 48 bit word; the function    |
1349
 
 |   extracts the 32 MSB and shift the result to the left by 1).             |
1350
 
 |                                                                           |
1351
 
 |   A 32 bit word can be written as                                         |
1352
 
 |    Lv = a  +  b * 2^16                                                    |
1353
 
 |   where a= unsigned 16 LSBs and b= signed 16 MSBs.                        |
1354
 
 |   The function returns v * Lv  /  2^15  which is equivalent to            |
1355
 
 |        a*v / 2^15 + b*v*2                                                 |
1356
 
 |                                                                           |
1357
 
 |   Complexity weight : 6 [to be confirmed]                                 |
1358
 
 |                                                                           |
1359
 
 |   Inputs :                                                                |
1360
 
 |                                                                           |
1361
 
 |   Lv                                                                      |
1362
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1363
 
 |             range : 0x8000 0000 <= var1 <= 0x7fff ffff.                   |
1364
 
 |   v                                                                       |
1365
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1366
 
 |             range : 0x8000 <= var1 <= 0x7fff.                             |
1367
 
 |                                                                           |
1368
 
 |   Outputs :                                                               |
1369
 
 |                                                                           |
1370
 
 |    none                                                                   |
1371
 
 |                                                                           |
1372
 
 |   Return Value :                                                          |
1373
 
 |                                                                           |
1374
 
 |    var_out                                                                |
1375
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1376
 
 |             range : 0x8000 0000 <= var_out <= 0x7fff ffff.                |
1377
 
 |                                                                           |
1378
 
 |___________________________________________________________________________|
1379
 
*/
1380
 
LIBG7221_DEF(Word32) L_mls (Word32 Lv, Word16 v)
1381
 
{
1382
 
   Word32   Temp  ;
1383
 
 
1384
 
   Temp = Lv & (Word32) 0x0000ffff ;
1385
 
   Temp = Temp * (Word32) v ;
1386
 
   Temp = L_shr_nocheck( Temp, (Word16) 15 ) ;
1387
 
   Temp = L_mac( Temp, v, extract_h(Lv) ) ;
1388
 
 
1389
 
#if (WMOPS)
1390
 
   multiCounter[currCounter].L_shr--;
1391
 
   multiCounter[currCounter].L_mac--;
1392
 
   multiCounter[currCounter].extract_h--;
1393
 
   multiCounter[currCounter].L_mls++;
1394
 
#endif
1395
 
 
1396
 
   return Temp ;
1397
 
}
1398
 
/* ------------------------- End of L_mls() ------------------------- */
1399
 
 
1400
 
 
1401
 
/*__________________________________________________________________________
1402
 
|                                                                           |
1403
 
|   Function Name : div_l                                                   |
1404
 
|                                                                           |
1405
 
|   Purpose :                                                               |
1406
 
|                                                                           |
1407
 
|   Produces a result which is the fractional integer division of L_var1 by|
1408
 
|   var2; L_var1 and var2 must be positive and var2 << 16 must be greater or|
1409
 
|   equal to L_var1; the result is positive (leading bit equal to 0) and    |
1410
 
|   truncated to 16 bits.                                                   |
1411
 
|   If L_var1 == var2 << 16 then div_l(L_var1,var2) = 32767.                |
1412
 
|                                                                           |
1413
 
|   Complexity weight : 20                                                  |
1414
 
|                                                                           |
1415
 
|   Inputs :                                                                |
1416
 
|                                                                           |
1417
 
|    L_var1                                                                 |
1418
 
|             32 bit long signed integer (Word32) whose value falls in the  |
1419
 
|             range : 0x0000 0000 <= var1 <= (var2 << 16)  and var2 != 0.   |
1420
 
|             L_var1 must be considered as a Q.31 value                     |
1421
 
|                                                                           |
1422
 
|    var2                                                                   |
1423
 
|             16 bit short signed integer (Word16) whose value falls in the |
1424
 
|             range : var1 <= (var2<< 16) <= 0x7fff0000 and var2 != 0.      |
1425
 
|             var2 must be considered as a Q.15 value                       |
1426
 
|                                                                           |
1427
 
|   Outputs :                                                               |
1428
 
|                                                                           |
1429
 
|    none                                                                   |
1430
 
|                                                                           |
1431
 
|   Return Value :                                                          |
1432
 
|                                                                           |
1433
 
|    var_out                                                                |
1434
 
|             16 bit short signed integer (Word16) whose value falls in the |
1435
 
|             range : 0x0000 0000 <= var_out <= 0x0000 7fff.                |
1436
 
|             It's a Q15 value (point between b15 and b14).                 |
1437
 
|___________________________________________________________________________|
1438
 
*/
1439
 
LIBG7221_DEF(Word16) div_l (Word32  L_num, Word16 den)
1440
 
{
1441
 
    Word16   var_out = (Word16)0;
1442
 
    Word32   L_den;
1443
 
    Word16   iteration;
1444
 
 
1445
 
#if (WMOPS)
1446
 
    multiCounter[currCounter].div_l++;
1447
 
#endif
1448
 
 
1449
 
    if ( den == (Word16) 0 ) {
1450
 
        //printf("Division by 0 in div_l, Fatal error \n");
1451
 
        //exit(0);
1452
 
        assert(!"Division by 0");
1453
 
    }
1454
 
 
1455
 
    if ( (L_num < (Word32) 0) || (den < (Word16) 0) ) {
1456
 
        //printf("Division Error in div_l, Fatal error \n");
1457
 
        //exit(0);
1458
 
        assert(!"Division Error");
1459
 
    }
1460
 
 
1461
 
    L_den = L_deposit_h( den ) ;
1462
 
#if (WMOPS)
1463
 
    multiCounter[currCounter].L_deposit_h--;
1464
 
#endif
1465
 
 
1466
 
    if ( L_num >= L_den ){
1467
 
        return MAX_16 ;
1468
 
    }
1469
 
    else {
1470
 
        L_num = L_shr_nocheck(L_num, (Word16)1) ;
1471
 
        L_den = L_shr_nocheck(L_den, (Word16)1);
1472
 
#if (WMOPS)
1473
 
        multiCounter[currCounter].L_shr-=2;
1474
 
#endif
1475
 
        for(iteration=(Word16)0; iteration< (Word16)15;iteration++) {
1476
 
            var_out = shl_nocheck( var_out, (Word16)1);
1477
 
            L_num   = L_shl_nocheck( L_num, (Word16)1);
1478
 
#if (WMOPS)
1479
 
            multiCounter[currCounter].shl--;
1480
 
            multiCounter[currCounter].L_shl--;
1481
 
#endif
1482
 
            if (L_num >= L_den) {
1483
 
                L_num = L_sub(L_num,L_den);
1484
 
                var_out = add(var_out, (Word16)1);
1485
 
#if (WMOPS)
1486
 
            multiCounter[currCounter].L_sub--;
1487
 
            multiCounter[currCounter].add--;
1488
 
#endif
1489
 
            }
1490
 
        }
1491
 
 
1492
 
        return var_out;
1493
 
    }
1494
 
}
1495
 
/* ------------------------- End of div_l() ------------------------- */
1496
 
 
1497
 
 
1498
 
/*__________________________________________________________________________
1499
 
|                                                                           |
1500
 
|   Function Name : i_mult                                                  |
1501
 
|                                                                           |
1502
 
|   Purpose :                                                               |
1503
 
|                                                                           |
1504
 
|   Integer 16-bit multiplication. No overflow protection is performed if   |
1505
 
|   ORIGINAL_G7231 is defined.                                              |
1506
 
|                                                                           |
1507
 
|   Complexity weight : TBD                                                 |
1508
 
|                                                                           |
1509
 
|   Inputs :                                                                |
1510
 
|                                                                           |
1511
 
|    a                                                                      |
1512
 
|             16 bit short signed integer (Word16).                         |
1513
 
|                                                                           |
1514
 
|    b                                                                      |
1515
 
|             16 bit short signed integer (Word16).                         |
1516
 
|                                                                           |
1517
 
|   Outputs :                                                               |
1518
 
|                                                                           |
1519
 
|    none                                                                   |
1520
 
|                                                                           |
1521
 
|   Return Value :                                                          |
1522
 
|                                                                           |
1523
 
|             16 bit short signed integer (Word16). No overflow checks      |
1524
 
|             are performed if ORIGINAL_G7231 is defined.                   |
1525
 
|___________________________________________________________________________|
1526
 
*/
1527
 
LIBG7221_DEF(Word16) i_mult (Word16 a, Word16 b)
1528
 
{
1529
 
#ifdef ORIGINAL_G7231
1530
 
   return a*b ;
1531
 
#else
1532
 
   Word32 register c=a*b;
1533
 
#if (WMOPS)
1534
 
    multiCounter[currCounter].i_mult++;
1535
 
#endif
1536
 
   return saturate(c) ;
1537
 
#endif
1538
 
}
1539
 
/* ------------------------- End of i_mult() ------------------------- */
1540
 
 
1541
 
 
1542
 
/*
1543
 
   **********************************************************************
1544
 
   The following three operators are not part of the original
1545
 
   G.729/G.723.1 set of basic operators and implement shiftless
1546
 
   accumulation operation.
1547
 
   **********************************************************************
1548
 
*/
1549
 
 
1550
 
/*___________________________________________________________________________
1551
 
 |
1552
 
 |   Function Name : L_mult0
1553
 
 |
1554
 
 |   Purpose :
1555
 
 |
1556
 
 |   L_mult0 is the 32 bit result of the multiplication of var1 times var2
1557
 
 |   without one left shift.
1558
 
 |
1559
 
 |   Complexity weight : 1
1560
 
 |
1561
 
 |   Inputs :
1562
 
 |
1563
 
 |    var1     16 bit short signed integer (Word16) whose value falls in the
1564
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
1565
 
 |
1566
 
 |    var2     16 bit short signed integer (Word16) whose value falls in the
1567
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
1568
 
 |
1569
 
 |   Return Value :
1570
 
 |
1571
 
 |    L_var_out
1572
 
 |             32 bit long signed integer (Word32) whose value falls in the
1573
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
1574
 
 |___________________________________________________________________________
1575
 
*/
1576
 
LIBG7221_DEF(Word32) L_mult0 (Word16 var1,Word16 var2)
1577
 
{
1578
 
  Word32 L_var_out;
1579
 
 
1580
 
  L_var_out = (Word32)var1 * (Word32)var2;
1581
 
 
1582
 
#if (WMOPS)
1583
 
    multiCounter[currCounter].L_mult0++;
1584
 
#endif
1585
 
  return(L_var_out);
1586
 
}
1587
 
/* ------------------------- End of L_mult0() ------------------------- */
1588
 
 
1589
 
 
1590
 
/*___________________________________________________________________________
1591
 
 |
1592
 
 |   Function Name : L_mac0
1593
 
 |
1594
 
 |   Purpose :
1595
 
 |
1596
 
 |   Multiply var1 by var2 (without left shift) and add the 32 bit result to
1597
 
 |   L_var3 with saturation, return a 32 bit result:
1598
 
 |        L_mac0(L_var3,var1,var2) = L_add(L_var3,(L_mult0(var1,var2)).
1599
 
 |
1600
 
 |   Complexity weight : 1
1601
 
 |
1602
 
 |   Inputs :
1603
 
 |
1604
 
 |    L_var3   32 bit long signed integer (Word32) whose value falls in the
1605
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
1606
 
 |
1607
 
 |    var1     16 bit short signed integer (Word16) whose value falls in the
1608
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
1609
 
 |
1610
 
 |    var2     16 bit short signed integer (Word16) whose value falls in the
1611
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
1612
 
 |
1613
 
 |   Return Value :
1614
 
 |
1615
 
 |    L_var_out
1616
 
 |             32 bit long signed integer (Word32) whose value falls in the
1617
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
1618
 
 |___________________________________________________________________________
1619
 
*/
1620
 
LIBG7221_DEF(Word32) L_mac0 (Word32 L_var3, Word16 var1, Word16 var2)
1621
 
{
1622
 
  Word32 L_var_out;
1623
 
  Word32 L_product;
1624
 
 
1625
 
  L_product = L_mult0(var1,var2);
1626
 
  L_var_out = L_add(L_var3,L_product);
1627
 
 
1628
 
#if (WMOPS)
1629
 
    multiCounter[currCounter].L_mac0++;
1630
 
    multiCounter[currCounter].L_mult0--;
1631
 
    multiCounter[currCounter].L_add--;
1632
 
#endif
1633
 
  return(L_var_out);
1634
 
}
1635
 
/* ------------------------- End of L_mac0() ------------------------- */
1636
 
 
1637
 
 
1638
 
/*___________________________________________________________________________
1639
 
 |
1640
 
 |   Function Name : L_msu0
1641
 
 |
1642
 
 |   Purpose :
1643
 
 |
1644
 
 |   Multiply var1 by var2 (without left shift) and subtract the 32 bit
1645
 
 |   result to L_var3 with saturation, return a 32 bit result:
1646
 
 |        L_msu0(L_var3,var1,var2) = L_sub(L_var3,(L_mult0(var1,var2)).
1647
 
 |
1648
 
 |   Complexity weight : 1
1649
 
 |
1650
 
 |   Inputs :
1651
 
 |
1652
 
 |    L_var3   32 bit long signed integer (Word32) whose value falls in the
1653
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
1654
 
 |
1655
 
 |    var1     16 bit short signed integer (Word16) whose value falls in the
1656
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
1657
 
 |
1658
 
 |    var2     16 bit short signed integer (Word16) whose value falls in the
1659
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.
1660
 
 |
1661
 
 |   Return Value :
1662
 
 |
1663
 
 |    L_var_out
1664
 
 |             32 bit long signed integer (Word32) whose value falls in the
1665
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
1666
 
 |___________________________________________________________________________
1667
 
*/
1668
 
LIBG7221_DEF(Word32) L_msu0 (Word32 L_var3, Word16 var1, Word16 var2)
1669
 
{
1670
 
  Word32 L_var_out;
1671
 
  Word32 L_product;
1672
 
 
1673
 
  L_product = L_mult0(var1,var2);
1674
 
  L_var_out = L_sub(L_var3,L_product);
1675
 
 
1676
 
#if (WMOPS)
1677
 
    multiCounter[currCounter].L_msu0++;
1678
 
    multiCounter[currCounter].L_mult0--;
1679
 
    multiCounter[currCounter].L_sub--;
1680
 
#endif
1681
 
  return(L_var_out);
1682
 
}
1683
 
/* ------------------------- End of L_msu0() ------------------------- */
1684
 
 
1685
 
 
1686
 
/*___________________________________________________________________________
1687
 
 |                                                                           |
1688
 
 |   Function Name : LU_shl                                                  |
1689
 
 |                                                                           |
1690
 
 |   Purpose :                                                               |
1691
 
 |                                                                           |
1692
 
 |   Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero  |
1693
 
 |   fill the var2 LSB of the result. If var2 is negative, arithmetically    |
1694
 
 |   shift L_var1 right by -var2 with sign extension. Saturate the result in |
1695
 
 |   case of underflows or overflows.                                        |
1696
 
 |                                                                           |
1697
 
 |   Complexity weight : 2                                                   |
1698
 
 |                                                                           |
1699
 
 |   Inputs :                                                                |
1700
 
 |                                                                           |
1701
 
 |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
1702
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
1703
 
 |                                                                           |
1704
 
 |    var2                                                                   |
1705
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1706
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
1707
 
 |                                                                           |
1708
 
 |   Outputs :                                                               |
1709
 
 |                                                                           |
1710
 
 |    none                                                                   |
1711
 
 |                                                                           |
1712
 
 |   Return Value :                                                          |
1713
 
 |                                                                           |
1714
 
 |    L_var_out                                                              |
1715
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1716
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
1717
 
 |___________________________________________________________________________|
1718
 
*/
1719
 
LIBG7221_DEF(UWord32) LU_shl (UWord32 L_var1, Word16 var2)
1720
 
{
1721
 
    Word16 neg_var2;
1722
 
    UWord32 L_var_out = 0;
1723
 
 
1724
 
    if (var2 <= 0)
1725
 
    {
1726
 
        if (var2 < -32)
1727
 
            var2 = -32;
1728
 
        neg_var2 = negate(var2);
1729
 
        L_var_out = LU_shr (L_var1, neg_var2);
1730
 
#if (WMOPS)
1731
 
        multiCounter[currCounter].negate--;
1732
 
        multiCounter[currCounter].LU_shr--;
1733
 
#endif
1734
 
    }
1735
 
    else
1736
 
    {
1737
 
        for (; var2 > 0; var2--)
1738
 
        {
1739
 
            if (L_var1 > (UWord32) 0X7fffffffL)
1740
 
            {
1741
 
                SET_OVERFLOW(1);
1742
 
                L_var_out = UMAX_32;
1743
 
                break;
1744
 
            }
1745
 
            else
1746
 
            {
1747
 
                if (L_var1 < (UWord32) 0x00000001L)
1748
 
                {
1749
 
                    SET_OVERFLOW(1);
1750
 
                    L_var_out = (UWord32)MIN_32;
1751
 
                    break;
1752
 
                }
1753
 
            }
1754
 
            L_var1 *= 2;
1755
 
            L_var_out = L_var1;
1756
 
        }
1757
 
    }
1758
 
#if (WMOPS)
1759
 
    multiCounter[currCounter].LU_shl++;
1760
 
#endif
1761
 
    return (L_var_out);
1762
 
}
1763
 
/* ------------------------- End of LU_shl() ------------------------- */
1764
 
 
1765
 
 
1766
 
/*___________________________________________________________________________
1767
 
 |                                                                           |
1768
 
 |   Function Name : LU_shr                                                  |
1769
 
 |                                                                           |
1770
 
 |   Purpose :                                                               |
1771
 
 |                                                                           |
1772
 
 |   Arithmetically shift the 32 bit input L_var1 right var2 positions with  |
1773
 
 |   sign extension. If var2 is negative, arithmetically shift L_var1 left   |
1774
 
 |   by -var2 and zero fill the -var2 LSB of the result. Saturate the result |
1775
 
 |   in case of underflows or overflows.                                     |
1776
 
 |                                                                           |
1777
 
 |   Complexity weight : 2                                                   |
1778
 
 |                                                                           |
1779
 
 |   Inputs :                                                                |
1780
 
 |                                                                           |
1781
 
 |    L_var1   32 bit long signed integer (Word32) whose value falls in the  |
1782
 
 |             range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.                 |
1783
 
 |                                                                           |
1784
 
 |    var2                                                                   |
1785
 
 |             16 bit short signed integer (Word16) whose value falls in the |
1786
 
 |             range : 0xffff 8000 <= var1 <= 0x0000 7fff.                   |
1787
 
 |                                                                           |
1788
 
 |   Outputs :                                                               |
1789
 
 |                                                                           |
1790
 
 |    none                                                                   |
1791
 
 |                                                                           |
1792
 
 |   Return Value :                                                          |
1793
 
 |                                                                           |
1794
 
 |    L_var_out                                                              |
1795
 
 |             32 bit long signed integer (Word32) whose value falls in the  |
1796
 
 |             range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.              |
1797
 
 |___________________________________________________________________________|
1798
 
*/
1799
 
LIBG7221_DEF(UWord32) LU_shr (UWord32 L_var1, Word16 var2)
1800
 
{
1801
 
    Word16  neg_var2;
1802
 
    UWord32 L_var_out;
1803
 
 
1804
 
    if (var2 < 0)
1805
 
    {
1806
 
        if (var2 < -32)
1807
 
            var2 = -32;
1808
 
        neg_var2 = negate(var2);
1809
 
        L_var_out = LU_shl (L_var1, neg_var2);
1810
 
#if (WMOPS)
1811
 
        multiCounter[currCounter].negate--;
1812
 
        multiCounter[currCounter].LU_shl--;
1813
 
#endif
1814
 
    }
1815
 
    else
1816
 
    {
1817
 
        if (var2 >= 32)
1818
 
        {
1819
 
            L_var_out = 0L;
1820
 
        }
1821
 
        else
1822
 
        {
1823
 
            L_var_out = L_var1 >> var2;
1824
 
        }
1825
 
    }
1826
 
#if (WMOPS)
1827
 
    multiCounter[currCounter].LU_shr++;
1828
 
#endif
1829
 
    return (L_var_out);
1830
 
}
1831
 
/* ------------------------- End of LU_shr() ------------------------- */
1832
 
 
1833
 
#endif /* PJMEDIA_LIBG7221_FUNCS_INLINED */
1834
 
 
1835
 
/* ************************** END OF BASOP32.C ************************** */