Blob
1 #include "os.h"2 #include <mp.h>3 #include "dat.h"5 #define VLDIGITS (sizeof(vlong)/sizeof(mpdigit))7 /*8 * this code assumes that a vlong is an integral number of9 * mpdigits long.10 */11 mpint*12 vtomp(vlong v, mpint *b)13 {14 int s;15 uvlong uv;17 if(b == nil)18 b = mpnew(VLDIGITS*sizeof(mpdigit));19 else20 mpbits(b, VLDIGITS*sizeof(mpdigit));21 mpassign(mpzero, b);22 if(v == 0)23 return b;24 if(v < 0){25 b->sign = -1;26 uv = -v;27 } else28 uv = v;29 for(s = 0; s < VLDIGITS && uv != 0; s++){30 b->p[s] = uv;31 uv >>= sizeof(mpdigit)*8;32 }33 b->top = s;34 return b;35 }37 vlong38 mptov(mpint *b)39 {40 uvlong v;41 int s;43 if(b->top == 0)44 return 0LL;46 mpnorm(b);47 if(b->top > VLDIGITS){48 if(b->sign > 0)49 return (vlong)MAXVLONG;50 else51 return (vlong)MINVLONG;52 }54 v = 0ULL;55 for(s = 0; s < b->top; s++)56 v |= b->p[s]<<(s*sizeof(mpdigit)*8);58 if(b->sign > 0){59 if(v > MAXVLONG)60 v = MAXVLONG;61 } else {62 if(v > MINVLONG)63 v = MINVLONG;64 else65 v = -(vlong)v;66 }68 return (vlong)v;69 }