2
/*___________________________________________________________________________
5
|___________________________________________________________________________|
8
/*___________________________________________________________________________
11
|___________________________________________________________________________|
19
/*___________________________________________________________________________
22
|___________________________________________________________________________|
24
Word16 sature(Word32 L_var1);
27
/*___________________________________________________________________________
29
| Constants and Globals |
30
|___________________________________________________________________________|
32
__thread Flag Overflow =0;
33
__thread Flag Carry =0;
36
/*___________________________________________________________________________
39
|___________________________________________________________________________|
43
/*___________________________________________________________________________
45
| Function Name : sature |
49
| Limit the 32 bit input to the range of a 16 bit word. |
54
| 32 bit long signed integer (Word32) whose value falls in the |
55
| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
64
| 16 bit short signed integer (Word16) whose value falls in the |
65
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
66
|___________________________________________________________________________|
69
Word16 sature(Word32 L_var1)
73
if (L_var1 > 0X00007fffL) {
78
if (L_var1 < (Word32)0xffff8000L) {
84
var_out = extract_l(L_var1);
90
/*___________________________________________________________________________
92
| Function Name : add |
96
| Performs the addition (var1+var2) with overflow control and saturation;|
97
| the 16 bit result is set at +32767 when overflow occurs or at -32768 |
98
| when underflow occurs. |
100
| Complexity weight : 1 |
105
| 16 bit short signed integer (Word16) whose value falls in the |
106
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
109
| 16 bit short signed integer (Word16) whose value falls in the |
110
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
119
| 16 bit short signed integer (Word16) whose value falls in the |
120
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
121
|___________________________________________________________________________|
124
Word16 add(Word16 var1,Word16 var2)
129
L_somme = (Word32) var1 + (Word32) var2;
130
var_out = sature(L_somme);
134
/*___________________________________________________________________________
136
| Function Name : sub |
140
| Performs the subtraction (var1+var2) with overflow control and satu- |
141
| ration; the 16 bit result is set at +32767 when overflow occurs or at |
142
| -32768 when underflow occurs. |
144
| Complexity weight : 1 |
149
| 16 bit short signed integer (Word16) whose value falls in the |
150
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
153
| 16 bit short signed integer (Word16) whose value falls in the |
154
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
163
| 16 bit short signed integer (Word16) whose value falls in the |
164
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
165
|___________________________________________________________________________|
168
Word16 sub(Word16 var1,Word16 var2)
173
L_diff = (Word32) var1 - (Word32) var2;
174
var_out = sature(L_diff);
178
/*___________________________________________________________________________
180
| Function Name : abs_s |
184
| Absolute value of var1; abs_s(-32768) = 32767. |
186
| Complexity weight : 1 |
191
| 16 bit short signed integer (Word16) whose value falls in the |
192
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
201
| 16 bit short signed integer (Word16) whose value falls in the |
202
| range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
203
|___________________________________________________________________________|
206
Word16 abs_s(Word16 var1)
210
if (var1 == (Word16)0X8000 ) {
225
/*___________________________________________________________________________
227
| Function Name : shl |
231
| Arithmetically shift the 16 bit input var1 left var2 positions.Zero fill|
232
| the var2 LSB of the result. If var2 is negative, arithmetically shift |
233
| var1 right by -var2 with sign extension. Saturate the result in case of |
234
| underflows or overflows. |
236
| Complexity weight : 1 |
241
| 16 bit short signed integer (Word16) whose value falls in the |
242
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
245
| 16 bit short signed integer (Word16) whose value falls in the |
246
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
255
| 16 bit short signed integer (Word16) whose value falls in the |
256
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
257
|___________________________________________________________________________|
260
Word16 shl(Word16 var1,Word16 var2)
266
var_out = shr(var1, (Word16)-var2);
269
L_result = (Word32) var1 * ((Word32) 1 << var2);
270
if ( ((var2 > 15) && (var1 != 0)) ||
271
(L_result != (Word32)((Word16) L_result)) ) {
273
var_out = (var1 > 0) ? MAX_16 : MIN_16;
276
var_out = extract_l(L_result);
283
/*___________________________________________________________________________
285
| Function Name : shr |
289
| Arithmetically shift the 16 bit input var1 right var2 positions with |
290
| sign extension. If var2 is negative, arithmetically shift var1 left by |
291
| -var2 with sign extension. Saturate the result in case of underflows or |
294
| Complexity weight : 1 |
299
| 16 bit short signed integer (Word16) whose value falls in the |
300
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
303
| 16 bit short signed integer (Word16) whose value falls in the |
304
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
313
| 16 bit short signed integer (Word16) whose value falls in the |
314
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
315
|___________________________________________________________________________|
318
Word16 shr(Word16 var1,Word16 var2)
323
var_out = shl(var1, (Word16)-var2);
327
var_out = (var1 < (Word16)0) ? (Word16)-1 : (Word16)0;
331
var_out = ~(( ~var1) >> var2 );
334
var_out = var1 >> var2;
342
/*___________________________________________________________________________
344
| Function Name : mult |
348
| Performs the multiplication of var1 by var2 and gives a 16 bit result |
349
| which is scaled i.e.: |
350
| mult(var1,var2) = shr((var1 times var2),15) and |
351
| mult(-32768,-32768) = 32767. |
353
| Complexity weight : 1 |
358
| 16 bit short signed integer (Word16) whose value falls in the |
359
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
362
| 16 bit short signed integer (Word16) whose value falls in the |
363
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
372
| 16 bit short signed integer (Word16) whose value falls in the |
373
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
374
|___________________________________________________________________________|
377
Word16 mult(Word16 var1, Word16 var2)
382
L_produit = (Word32)var1 * (Word32)var2;
384
L_produit = (L_produit & (Word32) 0xffff8000L) >> 15;
386
if (L_produit & (Word32) 0x00010000L) {
387
L_produit |= (Word32) 0xffff0000L;
389
var_out = sature(L_produit);
394
/*___________________________________________________________________________
396
| Function Name : L_mult |
400
| L_mult is the 32 bit result of the multiplication of var1 times var2 |
401
| with one shift left i.e.: |
402
| L_mult(var1,var2) = shl((var1 times var2),1) and |
403
| L_mult(-32768,-32768) = 2147483647. |
405
| Complexity weight : 1 |
410
| 16 bit short signed integer (Word16) whose value falls in the |
411
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
414
| 16 bit short signed integer (Word16) whose value falls in the |
415
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
424
| 32 bit long signed integer (Word32) whose value falls in the |
425
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
426
|___________________________________________________________________________|
429
Word32 L_mult(Word16 var1,Word16 var2)
433
L_var_out = (Word32)var1 * (Word32)var2;
434
if (L_var_out != (Word32)0x40000000L) {
446
/*___________________________________________________________________________
448
| Function Name : negate |
452
| Negate var1 with saturation, saturate in the case where input is -32768:|
453
| negate(var1) = sub(0,var1). |
455
| Complexity weight : 1 |
460
| 16 bit short signed integer (Word16) whose value falls in the |
461
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
470
| 16 bit short signed integer (Word16) whose value falls in the |
471
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
472
|___________________________________________________________________________|
475
Word16 negate(Word16 var1)
479
var_out = (var1 == MIN_16) ? MAX_16 : -var1;
484
/*___________________________________________________________________________
486
| Function Name : extract_h |
490
| Return the 16 MSB of L_var1. |
492
| Complexity weight : 1 |
497
| 32 bit long signed integer (Word32 ) whose value falls in the |
498
| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
507
| 16 bit short signed integer (Word16) whose value falls in the |
508
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
509
|___________________________________________________________________________|
512
Word16 extract_h(Word32 L_var1)
516
var_out = (Word16) (L_var1 >> 16);
520
/*___________________________________________________________________________
522
| Function Name : extract_l |
526
| Return the 16 LSB of L_var1. |
528
| Complexity weight : 1 |
533
| 32 bit long signed integer (Word32 ) whose value falls in the |
534
| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
543
| 16 bit short signed integer (Word16) whose value falls in the |
544
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
545
|___________________________________________________________________________|
548
Word16 extract_l(Word32 L_var1)
552
var_out = (Word16) L_var1;
557
/*___________________________________________________________________________
559
| Function Name : round |
563
| Round the lower 16 bits of the 32 bit input number into its MS 16 bits |
564
| with saturation. Shift the resulting bits right by 16 and return the 16 |
566
| g723_round(L_var1) = extract_h(L_add(L_var1,32768)) |
568
| Complexity weight : 1 |
573
| 32 bit long signed integer (Word32 ) whose value falls in the |
574
| range : 0x8000 0000 <= L_var1 <= 0x7fff ffff. |
583
| 16 bit short signed integer (Word16) whose value falls in the |
584
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
585
|___________________________________________________________________________|
588
Word16 g723_round(Word32 L_var1)
593
L_arrondi = L_add(L_var1, (Word32)0x00008000L);
594
var_out = extract_h(L_arrondi);
599
/*___________________________________________________________________________
601
| Function Name : L_mac |
605
| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
606
| result to L_var3 with saturation, return a 32 bit result: |
607
| L_mac(L_var3,var1,var2) = L_add(L_var3,(L_mult(var1,var2)). |
609
| Complexity weight : 1 |
613
| L_var3 32 bit long signed integer (Word32) whose value falls in the |
614
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
617
| 16 bit short signed integer (Word16) whose value falls in the |
618
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
621
| 16 bit short signed integer (Word16) whose value falls in the |
622
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
631
| 32 bit long signed integer (Word32) whose value falls in the |
632
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
633
|___________________________________________________________________________|
636
Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2)
641
L_produit = L_mult(var1, var2);
642
L_var_out = L_add(L_var3, L_produit);
647
/*___________________________________________________________________________
649
| Function Name : L_msu |
653
| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
654
| bit result to L_var3 with saturation, return a 32 bit result: |
655
| L_msu(L_var3,var1,var2) = L_sub(L_var3,(L_mult(var1,var2)). |
657
| Complexity weight : 1 |
661
| L_var3 32 bit long signed integer (Word32) whose value falls in the |
662
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
665
| 16 bit short signed integer (Word16) whose value falls in the |
666
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
669
| 16 bit short signed integer (Word16) whose value falls in the |
670
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
679
| 32 bit long signed integer (Word32) whose value falls in the |
680
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
681
|___________________________________________________________________________|
684
Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2)
689
L_produit = L_mult(var1, var2);
690
L_var_out = L_sub(L_var3, L_produit);
695
/*___________________________________________________________________________
697
| Function Name : L_macNs |
701
| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
702
| result to L_var3 without saturation, return a 32 bit result. Generate |
703
| carry and overflow values : |
704
| L_macNs(L_var3,var1,var2) = L_add_c(L_var3,(L_mult(var1,var2)). |
706
| Complexity weight : 1 |
710
| L_var3 32 bit long signed integer (Word32) whose value falls in the |
711
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
714
| 16 bit short signed integer (Word16) whose value falls in the |
715
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
718
| 16 bit short signed integer (Word16) whose value falls in the |
719
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
728
| 32 bit long signed integer (Word32) whose value falls in the |
729
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
733
| In some cases the Carry flag has to be cleared or set before using op- |
734
| rators which take into account its value. |
735
|___________________________________________________________________________|
738
Word32 L_macNs(Word32 L_var3, Word16 var1, Word16 var2)
742
L_var_out = L_mult(var1, var2);
743
L_var_out = L_add_c(L_var3, L_var_out);
747
/*___________________________________________________________________________
749
| Function Name : L_msuNs |
753
| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
754
| bit result from L_var3 without saturation, return a 32 bit result. Ge- |
755
| nerate carry and overflow values : |
756
| L_msuNs(L_var3,var1,var2) = L_sub_c(L_var3,(L_mult(var1,var2)). |
758
| Complexity weight : 1 |
762
| L_var3 32 bit long signed integer (Word32) whose value falls in the |
763
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
766
| 16 bit short signed integer (Word16) whose value falls in the |
767
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
770
| 16 bit short signed integer (Word16) whose value falls in the |
771
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
780
| 32 bit long signed integer (Word32) whose value falls in the |
781
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
785
| In some cases the Carry flag has to be cleared or set before using op- |
786
| rators which take into account its value. |
787
|___________________________________________________________________________|
790
Word32 L_msuNs(Word32 L_var3, Word16 var1, Word16 var2)
794
L_var_out = L_mult(var1,var2);
795
L_var_out = L_sub_c(L_var3,L_var_out);
799
/*___________________________________________________________________________
801
| Function Name : L_add |
805
| 32 bits addition of the two 32 bits variables (L_var1+L_var2) with |
806
| overflow control and saturation; the result is set at +214783647 when |
807
| overflow occurs or at -214783648 when underflow occurs. |
809
| Complexity weight : 2 |
813
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
814
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
816
| L_var2 32 bit long signed integer (Word32) whose value falls in the |
817
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
826
| 32 bit long signed integer (Word32) whose value falls in the |
827
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
828
|___________________________________________________________________________|
831
Word32 L_add(Word32 L_var1, Word32 L_var2)
835
L_var_out = L_var1 + L_var2;
837
if (((L_var1 ^ L_var2) & MIN_32) == 0L) {
838
if ((L_var_out ^ L_var1) & MIN_32) {
839
L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
846
/*___________________________________________________________________________
848
| Function Name : L_sub |
852
| 32 bits subtraction of the two 32 bits variables (L_var1-L_var2) with |
853
| overflow control and saturation; the result is set at +214783647 when |
854
| overflow occurs or at -214783648 when underflow occurs. |
856
| Complexity weight : 2 |
860
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
861
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
863
| L_var2 32 bit long signed integer (Word32) whose value falls in the |
864
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
873
| 32 bit long signed integer (Word32) whose value falls in the |
874
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
875
|___________________________________________________________________________|
878
Word32 L_sub(Word32 L_var1, Word32 L_var2)
882
L_var_out = L_var1 - L_var2;
884
if (((L_var1 ^ L_var2) & MIN_32) != 0L) {
885
if ((L_var_out ^ L_var1) & MIN_32) {
886
L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
893
/*___________________________________________________________________________
895
| Function Name : L_add_c |
899
| Performs 32 bits addition of the two 32 bits variables (L_var1+L_var2+C)|
900
| with carry. No saturation. Generate carry and Overflow values. The car- |
901
| ry and overflow values are binary variables which can be tested and as- |
904
| Complexity weight : 2 |
908
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
909
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
911
| L_var2 32 bit long signed integer (Word32) whose value falls in the |
912
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
921
| 32 bit long signed integer (Word32) whose value falls in the |
922
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
926
| In some cases the Carry flag has to be cleared or set before using op- |
927
| rators which take into account its value. |
928
|___________________________________________________________________________|
930
Word32 L_add_c(Word32 L_var1, Word32 L_var2)
936
L_var_out = L_var1 + L_var2 + (Word32)Carry;
938
L_test = L_var1 + L_var2;
940
if ((L_var1 > 0L) && (L_var2 > 0L) && (L_test < 0L)) {
945
if ((L_var1 < 0L) && (L_var2 < 0L) && (L_test > 0L)) {
950
if (((L_var1 ^ L_var2) < 0L) && (L_test > 0L)) {
962
if (L_test == MAX_32) {
967
if (L_test == (Word32) 0xFFFFFFFFL) {
982
/*___________________________________________________________________________
984
| Function Name : L_sub_c |
988
| Performs 32 bits subtraction of the two 32 bits variables with carry |
989
| (borrow) : L_var1-L_var2-C. No saturation. Generate carry and Overflow |
990
| values. The carry and overflow values are binary variables which can |
991
| be tested and assigned values. |
993
| Complexity weight : 2 |
997
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
998
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
1000
| L_var2 32 bit long signed integer (Word32) whose value falls in the |
1001
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
1010
| 32 bit long signed integer (Word32) whose value falls in the |
1011
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
1015
| In some cases the Carry flag has to be cleared or set before using op- |
1016
| rators which take into account its value. |
1017
|___________________________________________________________________________|
1020
Word32 L_sub_c(Word32 L_var1, Word32 L_var2)
1028
if (L_var2 != MIN_32) {
1029
L_var_out = L_add_c(L_var1,-L_var2);
1032
L_var_out = L_var1 - L_var2;
1040
L_var_out = L_var1 - L_var2 - (Word32)0X00000001L;
1041
L_test = L_var1 - L_var2;
1043
if ((L_test < 0L) && (L_var1 > 0L) && (L_var2 < 0L)) {
1047
else if ((L_test > 0L) && (L_var1 < 0L) && (L_var2 > 0L)) {
1051
else if ((L_test > 0L) && ((L_var1 ^ L_var2) > 0L)) {
1057
if (L_test == MIN_32) {
1069
/*___________________________________________________________________________
1071
| Function Name : L_negate |
1075
| Negate the 32 bit variable L_var1 with saturation; saturate in the case |
1076
| where input is -2147483648 (0x8000 0000). |
1078
| Complexity weight : 2 |
1082
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
1083
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
1092
| 32 bit long signed integer (Word32) whose value falls in the |
1093
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
1094
|___________________________________________________________________________|
1097
Word32 L_negate(Word32 L_var1)
1101
L_var_out = (L_var1 == MIN_32) ? MAX_32 : -L_var1;
1105
/*___________________________________________________________________________
1107
| Function Name : mult_r |
1111
| Same as mult with rounding, i.e.: |
1112
| mult_r(var1,var2) = shr(((var1*var2) + 16384),15) and |
1113
| mult_r(-32768,-32768) = 32767. |
1115
| Complexity weight : 2 |
1120
| 16 bit short signed integer (Word16) whose value falls in the |
1121
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1124
| 16 bit short signed integer (Word16) whose value falls in the |
1125
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1134
| 16 bit short signed integer (Word16) whose value falls in the |
1135
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
1136
|___________________________________________________________________________|
1139
Word16 mult_r(Word16 var1, Word16 var2)
1142
Word32 L_produit_arr;
1144
L_produit_arr = (Word32)var1 * (Word32)var2; /* product */
1145
L_produit_arr += (Word32) 0x00004000L; /* round */
1146
L_produit_arr &= (Word32) 0xffff8000L;
1147
L_produit_arr >>= 15; /* shift */
1149
if (L_produit_arr & (Word32) 0x00010000L) {
1150
/* sign extend when necessary */
1151
L_produit_arr |= (Word32) 0xffff0000L;
1154
var_out = sature(L_produit_arr);
1158
/*___________________________________________________________________________
1160
| Function Name : L_shl |
1164
| Arithmetically shift the 32 bit input L_var1 left var2 positions. Zero |
1165
| fill the var2 LSB of the result. If var2 is negative, L_var1 right by |
1166
| -var2 arithmetically shift with sign extension. Saturate the result in |
1167
| case of underflows or overflows. |
1169
| Complexity weight : 2 |
1173
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
1174
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
1177
| 16 bit short signed integer (Word16) whose value falls in the |
1178
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1187
| 32 bit long signed integer (Word32) whose value falls in the |
1188
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
1189
|___________________________________________________________________________|
1192
Word32 L_shl(Word32 L_var1, Word16 var2)
1194
Word32 L_var_out = 0L;
1196
if (var2 <= (Word16)0) {
1197
L_var_out = L_shr(L_var1, (Word16)-var2);
1200
for(; var2 > (Word16)0; var2--) {
1201
if (L_var1 > (Word32) 0X3fffffffL) {
1207
if (L_var1 < (Word32) 0xc0000000L) {
1221
/*___________________________________________________________________________
1223
| Function Name : L_shr |
1227
| Arithmetically shift the 32 bit input L_var1 right var2 positions with |
1228
| sign extension. If var2 is negative, arithmetically shift L_var1 left |
1229
| by -var2 and zero fill the var2 LSB of the result. Saturate the result |
1230
| in case of underflows or overflows. |
1232
| Complexity weight : 2 |
1236
| L_var1 32 bit long signed integer (Word32) whose value falls in the |
1237
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
1240
| 16 bit short signed integer (Word16) whose value falls in the |
1241
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1250
| 32 bit long signed integer (Word32) whose value falls in the |
1251
| range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. |
1252
|___________________________________________________________________________|
1255
Word32 L_shr(Word32 L_var1, Word16 var2)
1259
if (var2 < (Word16)0) {
1260
L_var_out = L_shl(L_var1, (Word16)-var2);
1263
if (var2 >= (Word16)31) {
1264
L_var_out = (L_var1 < 0L) ? -1L : 0L;
1268
L_var_out = ~((~L_var1) >> var2);
1271
L_var_out = L_var1 >> var2;
1278
/*___________________________________________________________________________
1280
| Function Name : shr_r |
1284
| Same as shr(var1,var2) but with rounding. Saturate the result in case of|
1285
| underflows or overflows : |
1286
| If var2 is greater than zero : |
1287
| shr_r(var1,var2) = shr(add(var1,2**(var2-1)),var2) |
1288
| If var2 is less than zero : |
1289
| shr_r(var1,var2) = shr(var1,var2). |
1291
| Complexity weight : 2 |
1296
| 16 bit short signed integer (Word16) whose value falls in the |
1297
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1300
| 16 bit short signed integer (Word16) whose value falls in the |
1301
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1310
| 16 bit short signed integer (Word16) whose value falls in the |
1311
| range : 0xffff 8000 <= var_out <= 0x0000 7fff. |
1312
|___________________________________________________________________________|
1315
Word16 shr_r(Word16 var1, Word16 var2)
1319
if (var2 > (Word16)15) {
1320
var_out = (Word16)0;
1323
var_out = shr(var1,var2);
1325
if (var2 > (Word16)0) {
1326
if ((var1 & ((Word16)1 << (var2-(Word16)1))) != (Word16)0) {
1334
/*___________________________________________________________________________
1336
| Function Name : mac_r |
1340
| Multiply var1 by var2 and shift the result left by 1. Add the 32 bit |
1341
| result to L_var3 with saturation. Round the LS 16 bits of the result |
1342
| into the MS 16 bits with saturation and shift the result right by 16. |
1343
| Return a 16 bit result. |
1344
| mac_r(L_var3,var1,var2) = g723_round(L_mac(Lvar3,var1,var2)) |
1346
| Complexity weight : 2 |
1350
| L_var3 32 bit long signed integer (Word32) whose value falls in the |
1351
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
1354
| 16 bit short signed integer (Word16) whose value falls in the |
1355
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1358
| 16 bit short signed integer (Word16) whose value falls in the |
1359
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1368
| 16 bit short signed integer (Word16) whose value falls in the |
1369
| range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. |
1370
|___________________________________________________________________________|
1373
Word16 mac_r(Word32 L_var3, Word16 var1, Word16 var2)
1377
L_var3 = L_mac(L_var3, var1, var2);
1378
L_var3 = L_add(L_var3, (Word32) 0x00008000L);
1379
var_out = extract_h(L_var3);
1384
/*___________________________________________________________________________
1386
| Function Name : msu_r |
1390
| Multiply var1 by var2 and shift the result left by 1. Subtract the 32 |
1391
| bit result to L_var3 with saturation. Round the LS 16 bits of the res- |
1392
| ult into the MS 16 bits with saturation and shift the result right by |
1393
| 16. Return a 16 bit result. |
1394
| msu_r(L_var3,var1,var2) = g723_round(L_msu(Lvar3,var1,var2)) |
1396
| Complexity weight : 2 |
1400
| L_var3 32 bit long signed integer (Word32) whose value falls in the |
1401
| range : 0x8000 0000 <= L_var3 <= 0x7fff ffff. |
1404
| 16 bit short signed integer (Word16) whose value falls in the |
1405
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1408
| 16 bit short signed integer (Word16) whose value falls in the |
1409
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1418
| 16 bit short signed integer (Word16) whose value falls in the |
1419
| range : 0x0000 8000 <= L_var_out <= 0x0000 7fff. |
1420
|___________________________________________________________________________|
1423
Word16 msu_r(Word32 L_var3, Word16 var1, Word16 var2)
1427
L_var3 = L_msu(L_var3,var1,var2);
1428
L_var3 = L_add(L_var3, (Word32) 0x00008000L);
1429
var_out = extract_h(L_var3);
1435
/*___________________________________________________________________________
1437
| Function Name : L_deposit_h |
1441
| Deposit the 16 bit var1 into the 16 MS bits of the 32 bit output. The |
1442
| 16 LS bits of the output are zeroed. |
1444
| Complexity weight : 2 |
1449
| 16 bit short signed integer (Word16) whose value falls in the |
1450
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1459
| 32 bit long signed integer (Word32) whose value falls in the |
1460
| range : 0x8000 0000 <= var_out <= 0x7fff 0000. |
1461
|___________________________________________________________________________|
1464
Word32 L_deposit_h(Word16 var1)
1468
L_var_out = (Word32) var1 << 16;
1472
/*___________________________________________________________________________
1474
| Function Name : L_deposit_l |
1478
| Deposit the 16 bit var1 into the 16 LS bits of the 32 bit output. The |
1479
| 16 MS bits of the output are sign extended. |
1481
| Complexity weight : 2 |
1486
| 16 bit short signed integer (Word16) whose value falls in the |
1487
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1496
| 32 bit long signed integer (Word32) whose value falls in the |
1497
| range : 0xFFFF 8000 <= var_out <= 0x0000 7fff. |
1498
|___________________________________________________________________________|
1501
Word32 L_deposit_l(Word16 var1)
1505
L_var_out = (Word32) var1;
1509
/*___________________________________________________________________________
1511
| Function Name : L_shr_r |
1515
| Same as L_shr(L_var1,var2)but with rounding. Saturate the result in case|
1516
| of underflows or overflows : |
1517
| If var2 is greater than zero : |
1518
| L_shr_r(var1,var2) = L_shr(L_add(L_var1,2**(var2-1)),var2) |
1519
| If var2 is less than zero : |
1520
| L_shr_r(var1,var2) = L_shr(L_var1,var2). |
1522
| Complexity weight : 3 |
1527
| 32 bit long signed integer (Word32) whose value falls in the |
1528
| range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
1531
| 16 bit short signed integer (Word16) whose value falls in the |
1532
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1541
| 32 bit long signed integer (Word32) whose value falls in the |
1542
| range : 0x8000 0000 <= var_out <= 0x7fff ffff. |
1543
|___________________________________________________________________________|
1546
Word32 L_shr_r(Word32 L_var1,Word16 var2)
1550
if (var2 > (Word16)31) {
1554
L_var_out = L_shr(L_var1,var2);
1555
if (var2 > (Word16)0) {
1556
if ( (L_var1 & ( 1L << (Word16)(var2-(Word16)1) )) != 0L) {
1564
/*___________________________________________________________________________
1566
| Function Name : L_abs |
1570
| Absolute value of L_var1; Saturate in case where the input is |
1573
| Complexity weight : 3 |
1578
| 32 bit long signed integer (Word32) whose value falls in the |
1579
| range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
1588
| 32 bit long signed integer (Word32) whose value falls in the |
1589
| range : 0x0000 0000 <= var_out <= 0x7fff ffff. |
1590
|___________________________________________________________________________|
1593
Word32 L_abs(Word32 L_var1)
1597
if (L_var1 == MIN_32) {
1602
L_var_out = -L_var1;
1612
/*___________________________________________________________________________
1614
| Function Name : L_sat |
1618
| 32 bit L_var1 is set to 2147833647 if an overflow occured or to |
1619
| -214783648 if an underflow occured on the most recent L_add_c, L_sub_c,|
1620
| L_macNs or LmsuNs operations. The carry and overflow values are binary |
1621
| values which can be tested and assigned values. |
1623
| Complexity weight : 4 |
1628
| 32 bit long signed integer (Word32) whose value falls in the |
1629
| range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
1638
| 32 bit long signed integer (Word32) whose value falls in the |
1639
| range : 0x8000 0000 <= var_out <= 0x7fff ffff. |
1640
|___________________________________________________________________________|
1643
Word32 L_sat (Word32 L_var1)
1667
/*___________________________________________________________________________
1669
| Function Name : norm_s |
1673
| Produces the number of left shift needed to normalize the 16 bit varia- |
1674
| ble var1 for positive values on the interval with minimum of 16384 and |
1675
| maximum of 32767, and for negative values on the interval with minimum |
1676
| of -32768 and maximum of -16384; in order to normalize the result, the |
1677
| following operation must be done : |
1678
| norm_var1 = shl(var1,norm_s(var1)). |
1680
| Complexity weight : 15 |
1685
| 16 bit short signed integer (Word16) whose value falls in the |
1686
| range : 0xffff 8000 <= var1 <= 0x0000 7fff. |
1695
| 16 bit short signed integer (Word16) whose value falls in the |
1696
| range : 0x0000 0000 <= var_out <= 0x0000 000f. |
1697
|___________________________________________________________________________|
1700
Word16 norm_s(Word16 var1)
1704
if (var1 == (Word16)0) {
1705
var_out = (Word16)0;
1708
if (var1 == (Word16) 0xffff) {
1709
var_out = (Word16)15;
1712
if (var1 < (Word16)0) {
1716
for(var_out = (Word16)0; var1 < (Word16)0x4000; var_out++) {
1726
/*___________________________________________________________________________
1728
| Function Name : div_s |
1732
| Produces a result which is the fractional integer division of var1 by |
1733
| var2; var1 and var2 must be positive and var2 must be greater or equal |
1734
| to var1; the result is positive (leading bit equal to 0) and truncated |
1736
| If var1 = var2 then div(var1,var2) = 32767. |
1738
| Complexity weight : 18 |
1743
| 16 bit short signed integer (Word16) whose value falls in the |
1744
| range : 0x0000 0000 <= var1 <= var2 and var2 != 0. |
1747
| 16 bit short signed integer (Word16) whose value falls in the |
1748
| range : var1 <= var2 <= 0x0000 7fff and var2 != 0. |
1757
| 16 bit short signed integer (Word16) whose value falls in the |
1758
| range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
1759
| It's a Q15 value (point between b15 and b14). |
1760
|___________________________________________________________________________|
1763
Word16 div_s(Word16 var1, Word16 var2)
1765
Word16 var_out = (Word16)0;
1770
if ((var1 > var2) || (var1 < (Word16)0) || (var2 < (Word16)0)) {
1771
printf("Division Error\n");
1775
if (var2 == (Word16)0) {
1776
printf("Division by 0, Fatal error \n");
1780
if (var1 == (Word16)0) {
1781
var_out = (Word16)0;
1788
L_num = L_deposit_l(var1);
1789
L_denom = L_deposit_l(var2);
1791
for(iteration=(Word16)0; iteration< (Word16)15;iteration++) {
1795
if (L_num >= L_denom) {
1796
L_num = L_sub(L_num,L_denom);
1797
var_out = add(var_out, (Word16)1);
1807
/*___________________________________________________________________________
1809
| Function Name : norm_l |
1813
| Produces the number of left shift needed to normalize the 32 bit varia- |
1814
| ble l_var1 for positive values on the interval with minimum of |
1815
| 1073741824 and maximum of 2147483647, and for negative values on the in-|
1816
| terval with minimum of -2147483648 and maximum of -1073741824; in order |
1817
| to normalize the result, the following operation must be done : |
1818
| norm_L_var1 = L_shl(L_var1,norm_l(L_var1)). |
1820
| Complexity weight : 30 |
1825
| 32 bit long signed integer (Word32) whose value falls in the |
1826
| range : 0x8000 0000 <= var1 <= 0x7fff ffff. |
1835
| 16 bit short signed integer (Word16) whose value falls in the |
1836
| range : 0x0000 0000 <= var_out <= 0x0000 001f. |
1837
|___________________________________________________________________________|
1840
Word16 norm_l(Word32 L_var1)
1845
var_out = (Word16)0;
1848
if (L_var1 == (Word32)0xffffffffL) {
1849
var_out = (Word16)31;
1856
for(var_out = (Word16)0;L_var1 < (Word32)0x40000000L;var_out++) {
1865
Additional operators
1867
Word32 L_mls( Word32 Lv, Word16 v )
1871
Temp = Lv & (Word32) 0x0000ffff ;
1872
Temp = Temp * (Word32) v ;
1873
Temp = L_shr( Temp, (Word16) 15 ) ;
1874
Temp = L_mac( Temp, v, extract_h(Lv) ) ;
1878
/*__________________________________________________________________________
1880
| Function Name : div_l |
1884
| Produces a result which is the fractional integer division of L_var1 by|
1885
| var2; L_var1 and var2 must be positive and var2 << 16 must be greater or|
1886
| equal to L_var1; the result is positive (leading bit equal to 0) and |
1887
| truncated to 16 bits. |
1888
| If L_var1 == var2 << 16 then div_l(L_var1,var2) = 32767. |
1890
| Complexity weight : 20 |
1895
| 32 bit long signed integer (Word32) whose value falls in the |
1896
| range : 0x0000 0000 <= var1 <= (var2 << 16) and var2 != 0. |
1897
| L_var1 must be considered as a Q.31 value |
1900
| 16 bit short signed integer (Word16) whose value falls in the |
1901
| range : var1 <= (var2<< 16) <= 0x7fff0000 and var2 != 0. |
1902
| var2 must be considered as a Q.15 value |
1911
| 16 bit short signed integer (Word16) whose value falls in the |
1912
| range : 0x0000 0000 <= var_out <= 0x0000 7fff. |
1913
| It's a Q15 value (point between b15 and b14). |
1914
|___________________________________________________________________________|
1918
Word16 div_l( Word32 L_num, Word16 den ){
1920
Word16 var_out = (Word16)0;
1924
if ( den == (Word16) 0 ) {
1925
printf("Division by 0 in div_l, Fatal error \n");
1929
if ( (L_num < (Word32) 0) || (den < (Word16) 0) ) {
1930
printf("Division Error in div_l, Fatal error \n");
1934
L_den = L_deposit_h( den ) ;
1936
if ( L_num >= L_den ){
1940
L_num = L_shr(L_num, (Word16)1) ;
1941
L_den = L_shr(L_den, (Word16)1);
1942
for(iteration=(Word16)0; iteration< (Word16)15;iteration++) {
1943
var_out = shl( var_out, (Word16)1);
1944
L_num = L_shl( L_num, (Word16)1);
1945
if (L_num >= L_den) {
1946
L_num = L_sub(L_num,L_den);
1947
var_out = add(var_out, (Word16)1);
1955
/*---------------------------------------------------------------------------*
1956
* Function i_mult() *
1957
* ~~~~~~~~~~~~~~~~~ *
1958
* Integer multiplication. *
1959
*--------------------------------------------------------------------------*/
1960
Word16 i_mult(Word16 a, Word16 b)