63 lines
952 B
C
63 lines
952 B
C
|
/*
|
||
|
#define PRT_EXT
|
||
|
SHIFT TWO EXTENDED NUMBERS INTO PROPER
|
||
|
ALIGNMENT FOR ADDITION (exponents are equal)
|
||
|
*/
|
||
|
|
||
|
#include "FP_types.h"
|
||
|
|
||
|
sft_ext(e1,e2)
|
||
|
EXTEND *e1,*e2;
|
||
|
{
|
||
|
register EXTEND *s;
|
||
|
register short diff;
|
||
|
long tmp;
|
||
|
|
||
|
#ifdef PRT_EXT
|
||
|
prt_ext("enter sft_ext e1:",e1);
|
||
|
prt_ext("enter sft_ext e2:",e2);
|
||
|
#endif PRT_EXT
|
||
|
diff = e1->exp - e2->exp;
|
||
|
|
||
|
if (!diff)
|
||
|
return; /* exponents are equal */
|
||
|
|
||
|
if (diff < 0) { /* e2 is larger */
|
||
|
/* shift e1 */
|
||
|
diff = -diff;
|
||
|
s = e1;
|
||
|
}
|
||
|
else /* e1 is larger */
|
||
|
/* shift e2 */
|
||
|
s = e2;
|
||
|
|
||
|
s->exp += diff;
|
||
|
|
||
|
if (diff > 63) { /* no relative value */
|
||
|
s->m1 = 0L;
|
||
|
s->m2 = 0L;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (diff > 32) {
|
||
|
diff -= 32;
|
||
|
s->m2 = s->m1;
|
||
|
s->m1 = 0L;
|
||
|
}
|
||
|
if (diff) {
|
||
|
if (s->m1) {
|
||
|
tmp = s->m1;
|
||
|
tmp <<= (32-diff);
|
||
|
s->m1 >>= diff;
|
||
|
}
|
||
|
else
|
||
|
tmp = 0L;
|
||
|
s->m2 >>= diff;
|
||
|
s->m2 |= tmp;
|
||
|
}
|
||
|
#ifdef PRT_EXT
|
||
|
prt_ext("exit sft_ext e1:",e1);
|
||
|
prt_ext("exit sft_ext e2:",e2);
|
||
|
#endif PRT_EXT
|
||
|
}
|