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 (word)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;
47 return (word)(prod & 0xFFFF);
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 )
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 );
206 word gsm_div P2((num,denum), word num, word denum)
208 longword L_num = num;
209 longword L_denum = denum;
220 assert(num >= 0 && denum >= num);
228 if (L_num >= L_denum) {