15e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/*
25e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
35e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
45e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
55e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */
65e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
75e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/add.c,v 1.6 1996/07/02 09:57:33 jutta Exp $ */
85e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
95e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/*
105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *  See private.h for the more commonly used macro versions.
115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */
125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	<stdio.h>
145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	<assert.h>
155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	"private.h"
175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	"gsm.h"
185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include	"proto.h"
195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#define	saturate(x) 	\
215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_add P2((a,b), word a, word b)
245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	longword sum = (longword)a + (longword)b;
265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return saturate(sum);
275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_sub P2((a,b), word a, word b)
305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	longword diff = (longword)a - (longword)b;
325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return saturate(diff);
335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_mult P2((a,b), word a, word b)
365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;
385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	else return SASR( (longword)a * (longword)b, 15 );
395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_mult_r P2((a,b), word a, word b)
425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	else {
455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		longword prod = (longword)a * (longword)b + 16384;
465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		prod >>= 15;
475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		return prod & 0xFFFF;
485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_abs P1((a), word a)
525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehlongword gsm_L_mult P2((a,b),word a, word b)
575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	assert( a != MIN_WORD || b != MIN_WORD );
595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return ((longword)a * (longword)b) << 1;
605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehlongword gsm_L_add P2((a,b), longword a, longword b)
635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (a < 0) {
655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		if (b >= 0) return a + b;
665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		else {
675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		}
705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	else if (b <= 0) return a + b;
725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	else {
735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		ulongword A = (ulongword)a + (ulongword)b;
745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		return A > MAX_LONGWORD ? MAX_LONGWORD : A;
755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehlongword gsm_L_sub P2((a,b), longword a, longword b)
795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (a >= 0) {
815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		if (b >= 0) return a - b;
825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		else {
835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			/* a>=0, b<0 */
845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			ulongword A = (ulongword)a + -(b + 1);
865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		}
885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	else if (b <= 0) return a - b;
905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	else {
915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		/* a<0, b>0 */
925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		ulongword A = (ulongword)-(a + 1) + b;
945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic unsigned char const bitoff[ 256 ] = {
995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
1005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh};
1165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_norm P1((a), longword a )
1185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/*
1195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * the number of left shifts needed to normalize the 32 bit
1205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * variable L_var1 for positive values on the interval
1215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *
1225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * with minimum of
1235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * minimum of 1073741824  (01000000000000000000000000000000) and
1245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * maximum of 2147483647  (01111111111111111111111111111111)
1255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *
1265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *
1275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * and for negative values on the interval with
1285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * minimum of -2147483648 (-10000000000000000000000000000000) and
1295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * maximum of -1073741824 ( -1000000000000000000000000000000).
1305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *
1315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * in order to normalize the result, the following
1325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
1335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *
1345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * (That's 'ffs', only from the left, not the right..)
1355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */
1365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
1375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	assert(a != 0);
1385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (a < 0) {
1405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		if (a <= -1073741824) return 0;
1415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		a = ~a;
1425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
1435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return    a & 0xffff0000
1455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		? ( a & 0xff000000
1465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		  ?  -1 + bitoff[ 0xFF & (a >> 24) ]
1475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		  :   7 + bitoff[ 0xFF & (a >> 16) ] )
1485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		: ( a & 0xff00
1495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		  ?  15 + bitoff[ 0xFF & (a >> 8) ]
1505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		  :  23 + bitoff[ 0xFF & a ] );
1515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
1525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehlongword gsm_L_asl P2((a,n), longword a, int n)
1545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
1555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n >= 32) return 0;
1565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n <= -32) return -(a < 0);
1575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n < 0) return gsm_L_asr(a, -n);
1585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return a << n;
1595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
1605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_asl P2((a,n), word a, int n)
1625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
1635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n >= 16) return 0;
1645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n <= -16) return -(a < 0);
1655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n < 0) return gsm_asr(a, -n);
1665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return a << n;
1675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
1685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehlongword gsm_L_asr P2((a,n), longword a, int n)
1705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
1715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n >= 32) return -(a < 0);
1725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n <= -32) return 0;
1735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n < 0) return a << -n;
1745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#	ifdef	SASR
1765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		return a >> n;
1775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#	else
1785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		if (a >= 0) return a >> n;
1795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		else return -(longword)( -(ulongword)a >> n );
1805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#	endif
1815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
1825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_asr P2((a,n), word a, int n)
1845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
1855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n >= 16) return -(a < 0);
1865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n <= -16) return 0;
1875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (n < 0) return a << -n;
1885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#	ifdef	SASR
1905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		return a >> n;
1915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#	else
1925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		if (a >= 0) return a >> n;
1935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		else return -(word)( -(uword)a >> n );
1945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#	endif
1955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
1965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
1975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/*
1985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *  (From p. 46, end of section 4.2.5)
1995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *
2005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *  NOTE: The following lines gives [sic] one correct implementation
2015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *  	  of the div(num, denum) arithmetic operation.  Compute div
2025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *        which is the integer division of num by denum: with denum
2035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *	  >= num > 0
2045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */
2055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
2065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehword gsm_div P2((num,denum), word num, word denum)
2075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{
2085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	longword	L_num   = num;
2095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	longword	L_denum = denum;
2105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	word		div 	= 0;
2115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	int		k 	= 15;
2125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
2135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	/* The parameter num sometimes becomes zero.
2145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 * Although this is explicitly guarded against in 4.2.5,
2155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 * we assume that the result should then be zero as well.
2165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	 */
2175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
2185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	/* assert(num != 0); */
2195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
2205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	assert(num >= 0 && denum >= num);
2215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	if (num == 0)
2225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	    return 0;
2235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
2245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	while (k--) {
2255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		div   <<= 1;
2265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		L_num <<= 1;
2275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
2285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		if (L_num >= L_denum) {
2295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			L_num -= L_denum;
2305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh			div++;
2315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh		}
2325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	}
2335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh
2345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh	return div;
2355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh}
236