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