ref: 7a503757b1251c2746df7bdcd891814c1518cc28
dir: /sys/src/libmp/port/mpleft.c/
#include "os.h" #include <mp.h> #include "dat.h" // res = b << shift void mpleft(mpint *b, int shift, mpint *res) { int d, l, r, i, otop; mpdigit this, last; res->sign = b->sign; if(b->top==0){ res->top = 0; return; } // a zero or negative left shift is a right shift if(shift <= 0){ mpright(b, -shift, res); return; } // b and res may be the same so remember the old top otop = b->top; // shift mpbits(res, otop*Dbits + shift); // overkill res->top = DIGITS(otop*Dbits + shift); d = shift/Dbits; l = shift - d*Dbits; r = Dbits - l; if(l == 0){ for(i = otop-1; i >= 0; i--) res->p[i+d] = b->p[i]; } else { last = 0; for(i = otop-1; i >= 0; i--) { this = b->p[i]; res->p[i+d+1] = (last<<l) | (this>>r); last = this; } res->p[d] = last<<l; } for(i = 0; i < d; i++) res->p[i] = 0; res->flags |= b->flags & MPtimesafe; mpnorm(res); }