Subversion Repositories planix.SVN

Rev

Rev 33 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "os.h"
2
#include <mp.h>
3
#include "dat.h"
4
 
5
#define VLDIGITS (sizeof(vlong)/sizeof(mpdigit))
6
 
7
/*
8
 *  this code assumes that a vlong is an integral number of
9
 *  mpdigits long.
10
 */
11
mpint*
12
vtomp(vlong v, mpint *b)
13
{
14
	int s;
15
	uvlong uv;
16
 
33 7u83 17
	if(b == nil){
18
		b = mpnew(VLDIGITS*Dbits);
19
		setmalloctag(b, getcallerpc(&v));
20
	}else
21
		mpbits(b, VLDIGITS*Dbits);
22
	b->sign = (v >> (sizeof(v)*8 - 1)) | 1;
23
	uv = v * b->sign;
24
	for(s = 0; s < VLDIGITS; s++){
2 - 25
		b->p[s] = uv;
26
		uv >>= sizeof(mpdigit)*8;
27
	}
28
	b->top = s;
33 7u83 29
	return mpnorm(b);
2 - 30
}
31
 
32
vlong
33
mptov(mpint *b)
34
{
35
	uvlong v;
36
	int s;
37
 
38
	if(b->top == 0)
39
		return 0LL;
40
 
41
	if(b->top > VLDIGITS){
42
		if(b->sign > 0)
43
			return (vlong)MAXVLONG;
44
		else
45
			return (vlong)MINVLONG;
46
	}
47
 
48
	v = 0ULL;
49
	for(s = 0; s < b->top; s++)
33 7u83 50
		v |= (uvlong)b->p[s]<<(s*sizeof(mpdigit)*8);
2 - 51
 
52
	if(b->sign > 0){
53
		if(v > MAXVLONG)
54
			v = MAXVLONG;
55
	} else {
56
		if(v > MINVLONG)
57
			v = MINVLONG;
58
		else
59
			v = -(vlong)v;
60
	}
61
 
62
	return (vlong)v;
63
}