2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
10 * See private.h for the more commonly used macro versions.
21 ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
23 word gsm_add P2((a,b), word a, word b)
25 longword sum = (longword)a + (longword)b;
26 return (word) saturate(sum);
29 word gsm_sub P2((a,b), word a, word b)
31 longword diff = (longword)a - (longword)b;
32 return (word) saturate(diff);
35 word gsm_mult P2((a,b), word a, word b)
37 if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;
38 else return SASR( (longword)a * (longword)b, 15 );
41 word gsm_mult_r P2((a,b), word a, word b)
43 if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
45 longword prod = (longword)a * (longword)b + 16384;
51 word gsm_abs P1((a), word a)
53 return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
56 longword gsm_L_mult P2((a,b),word a, word b)
58 assert( a != MIN_WORD || b != MIN_WORD );
59 return ((longword)a * (longword)b) << 1;
62 longword gsm_L_add P2((a,b), longword a, longword b)
65 if (b >= 0) return a + b;
67 ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
68 return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
71 else if (b <= 0) return a + b;
73 ulongword A = (ulongword)a + (ulongword)b;
74 return A > MAX_LONGWORD ? MAX_LONGWORD : A;
78 longword gsm_L_sub P2((a,b), longword a, longword b)
81 if (b >= 0) return a - b;
85 ulongword A = (ulongword)a + -(b + 1);
86 return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
89 else if (b <= 0) return a - b;
93 ulongword A = (ulongword)-(a + 1) + b;
94 return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
98 static unsigned char const bitoff[ 256 ] = {
99 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
100 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
101 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
102 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
103 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
104 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
105 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
106 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
117 word gsm_norm P1((a), longword a )
119 * the number of left shifts needed to normalize the 32 bit
120 * variable L_var1 for positive values on the interval
123 * minimum of 1073741824 (01000000000000000000000000000000) and
124 * maximum of 2147483647 (01111111111111111111111111111111)
127 * and for negative values on the interval with
128 * minimum of -2147483648 (-10000000000000000000000000000000) and
129 * maximum of -1073741824 ( -1000000000000000000000000000000).
131 * in order to normalize the result, the following
132 * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
134 * (That's 'ffs', only from the left, not the right..)
140 if (a <= -1073741824) return 0;
144 return a & 0xffff0000
146 ? -1 + bitoff[ 0xFF & (a >> 24) ]
147 : 7 + bitoff[ 0xFF & (a >> 16) ] )
149 ? 15 + bitoff[ 0xFF & (a >> 8) ]
150 : 23 + bitoff[ 0xFF & a ] );
153 longword gsm_L_asl P2((a,n), longword a, int n)
155 if (n >= 32) return 0;
156 if (n <= -32) return -(a < 0);
157 if (n < 0) return gsm_L_asr(a, -n);
161 word gsm_asl P2((a,n), word a, int n)
163 if (n >= 16) return 0;
164 if (n <= -16) return -(a < 0);
165 if (n < 0) return gsm_asr(a, -n);
169 longword gsm_L_asr P2((a,n), longword a, int n)
171 if (n >= 32) return -(a < 0);
172 if (n <= -32) return 0;
173 if (n < 0) return a << -n;
178 if (a >= 0) return a >> n;
179 else return -(longword)( -(ulongword)a >> n );
183 word gsm_asr P2((a,n), word a, int n)
185 if (n >= 16) return -(a < 0);
186 if (n <= -16) return 0;
187 if (n < 0) return a << -n;
192 if (a >= 0) return a >> n;
193 else return -(word)( -(uword)a >> n );
198 * (From p. 46, end of section 4.2.5)
200 * NOTE: The following lines gives [sic] one correct implementation
201 * of the div(num, denum) arithmetic operation. Compute div
202 * which is the integer division of num by denum: with denum
206 word gsm_div P2((num,denum), word num, word denum)
208 longword L_num = num;
209 longword L_denum = denum;
213 /* The parameter num sometimes becomes zero.
214 * Although this is explicitly guarded against in 4.2.5,
215 * we assume that the result should then be zero as well.
218 /* assert(num != 0); */
220 assert(num >= 0 && denum >= num);
228 if (L_num >= L_denum) {