/*****************************************************************************/ /* */ /* 256/32 BIT DIVIDE (UNSIGNED) */ /* 01/12/07 (dkc) */ /* */ /*****************************************************************************/ unsigned int carry(unsigned int a, unsigned int b, unsigned int sum); unsigned int lmbd(unsigned int mode, unsigned int a); void div256_32(unsigned int a0, unsigned int a1, unsigned int a2, unsigned int a3, unsigned int a4, unsigned int a5, unsigned int a6, unsigned int a7, unsigned int *quotient, unsigned int d7) { unsigned int i,d0,d1,d2, d3,d4,d5,d6,dshift,ashift,count,flag; unsigned int shift,c,c0,c1,c2,c3,c4,c5,c6,temp,temp0,temp1,temp2,temp3; unsigned int temp4,temp5,temp6,temp7; if ((a0==0)&&(a1==0)&&(a2==0)&&(a3==0)&&(a4==0)&&(a5==0)&&(a6==0)&&(a7<d7)) { *quotient=0; *(quotient+1)=0; *(quotient+2)=0; *(quotient+3)=0; *(quotient+4)=0; *(quotient+5)=0; *(quotient+6)=0; *(quotient+7)=0; return; } dshift=lmbd(1,d7); dshift+=224; ashift=lmbd(1,a0); if (a0==0) ashift+=lmbd(1,a1); if ((a0|a1)==0) ashift+=lmbd(1,a2); if ((a0|a1|a2)==0) ashift+=lmbd(1,a3); if ((a0|a1|a2|a3)==0) ashift+=lmbd(1,a4); if ((a0|a1|a2|a3|a4)==0) ashift+=lmbd(1,a5); if ((a0|a1|a2|a3|a4|a5)==0) ashift+=lmbd(1,a6); if ((a0|a1|a2|a3|a4|a5|a6)==0) ashift+=lmbd(1,a7); shift=dshift-ashift; count=shift+1; d0=0; d1=0; d2=0; d3=0; d4=0; d5=0; d6=0; if (shift<32) { if (shift!=0) { d6=d7>>(32-shift); d7=d7<<shift; } flag=7; shift=32-shift; } else { shift=shift-32; d6=d7; d7=0; if (shift<32) { if (shift!=0) { d5=d6>>(32-shift); d6=d6<<shift; } flag=6; shift=32-shift; } else { shift=shift-32; d5=d6; d6=0; if (shift<32) { if (shift!=0) { d4=d5>>(32-shift); d5=d5<<shift; } flag=5; shift=32-shift; } else { shift=shift-32; d4=d5; d5=0; if (shift<32) { if (shift!=0) { d3=d4>>(32-shift); d4=d4<<shift; } flag=4; shift=32-shift; } else { shift=shift-32; d3=d4; d4=0; if (shift<32) { if (shift!=0) { d2=d3>>(32-shift); d3=d3<<shift; } flag=3; shift=32-shift; } else { shift=shift-32; d2=d3; d3=0; if (shift<32) { if (shift!=0) { d1=d2>>(32-shift); d2=d2<<shift; } flag=2; shift=32-shift; } else { shift=shift-32; d1=d2; d2=0; if (shift<32) { if (shift!=0) { d0=d1>>(32-shift); d1=d1<<shift; } flag=1; shift=32-shift; } else { shift=shift-32; d0=d1; d1=0; if (shift!=0) d0=d0<<shift; flag=0; shift=32-shift; } } } } } } } d0=~d0; d1=~d1; d2=~d2; d3=~d3; d4=~d4; d5=~d5; d6=~d6; d7=~d7; temp=d7+1; c=carry(d7,1,temp); d7=temp; temp=d6+c; c=carry(d6,1,temp); d6=temp; temp=d5+c; c=carry(d5,1,temp); d5=temp; temp=d4+c; c=carry(d4,1,temp); d4=temp; temp=d3+c; c=carry(d3,1,temp); d3=temp; temp=d2+c; c=carry(d2,c,temp); d2=temp; temp=d1+c; c=carry(d1,c,temp); d1=temp; d0=d0+c; for (i=0; i<count; i++) { temp7=a7+d7; c6=carry(a7,d7,temp7); temp=a6+c6; c5=carry(a6,c6,temp); temp6=temp+d6; c5+=carry(temp,d6,temp6); temp=a5+c5; c4=carry(a5,c5,temp); temp5=temp+d5; c4+=carry(temp,d5,temp5); temp=a4+c4; c3=carry(a4,c4,temp); temp4=temp+d4; c3+=carry(temp,d4,temp4); temp=a3+c3; c2=carry(a3,c3,temp); temp3=temp+d3; c2+=carry(temp,d3,temp3); temp=a2+c2; c1=carry(a2,c2,temp); temp2=temp+d2; c1+=carry(temp,d2,temp2); temp=a1+c1; c0=carry(a1,c1,temp); temp1=temp+d1; c0+=carry(temp,d1,temp1); temp0=a0+d0+c0; if ((temp0>>31)==0) { a0=temp0<<1; if ((temp1>>31)!=0) c=1; else c=0; a0=a0+c; a1=temp1<<1; if ((temp2>>31)!=0) c=1; else c=0; a1=a1+c; a2=temp2<<1; if ((temp3>>31)!=0) c=1; else c=0; a2=a2+c; a3=temp3<<1; if ((temp4>>31)!=0) c=1; else c=0; a3=a3+c; a4=temp4<<1; if ((temp5>>31)!=0) c=1; else c=0; a4=a4+c; a5=temp5<<1; if ((temp6>>31)!=0) c=1; else c=0; a5=a5+c; a6=temp6<<1; if ((temp7>>31)!=0) c=1; else c=0; a6=a6+c; a7=temp7<<1; a7=a7+1; } else { a0=a0<<1; if ((a1>>31)!=0) c=1; else c=0; a0=a0+c; a1=a1<<1; if ((a2>>31)!=0) c=1; else c=0; a1=a1+c; a2=a2<<1; if ((a3>>31)!=0) c=1; else c=0; a2=a2+c; a3=a3<<1; if ((a4>>31)!=0) c=1; else c=0; a3=a3+c; a4=a4<<1; if ((a5>>31)!=0) c=1; else c=0; a4=a4+c; a5=a5<<1; if ((a6>>31)!=0) c=1; else c=0; a5=a5+c; a6=a6<<1; if ((a7>>31)!=0) c=1; else c=0; a6=a6+c; a7=a7<<1; } } shift=shift-1; if (flag==7) { a0=0; a1=0; a2=0; a3=0; a4=0; a5=0; a6=0; a7=a7<<shift; a7=a7>>shift; } else if (flag==6) { a0=0; a1=0; a2=0; a3=0; a4=0; a5=0; a6=a6<<shift; a6=a6>>shift; } else if (flag==5) { a0=0; a1=0; a2=0; a3=0; a4=0; a5=a5<<shift; a5=a5>>shift; } else if (flag==4) { a0=0; a1=0; a2=0; a3=0; a4=a4<<shift; a4=a4>>shift; } else if (flag==3) { a0=0; a1=0; a2=0; a3=a3<<shift; a3=a3>>shift; } else { if (flag==2) { a0=0; a1=0; a2=a2<<shift; a2=a2>>shift; } else { if (flag==1) { a0=0; a1=a1<<shift; a1=a1>>shift; } else { a0=a0<<shift; a0=a0>>shift; } } } *quotient=a0; *(quotient+1)=a1; *(quotient+2)=a2; *(quotient+3)=a3; *(quotient+4)=a4; *(quotient+5)=a5; *(quotient+6)=a6; *(quotient+7)=a7; return; }