Subversion Repositories planix.SVN

Rev

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

Rev Author Line No. Line
26 7u83 1
#include "os.h"
2
#include <mp.h>
3
#include "dat.h"
4
 
5
// res = s != 0 ? b1 : b2
6
void
7
mpsel(int s, mpint *b1, mpint *b2, mpint *res)
8
{
9
	mpdigit d;
10
	int n, m, i;
11
 
12
	res->flags |= (b1->flags | b2->flags) & MPtimesafe;
13
	if((res->flags & MPtimesafe) == 0){
14
		mpassign(s ? b1 : b2, res);
15
		return;
16
	}
17
	res->flags &= ~MPnorm;
18
 
19
	n = b1->top;
20
	m = b2->top;
21
	mpbits(res, Dbits*(n >= m ? n : m));
22
	res->top = n >= m ? n : m;
23
 
24
	s = (-s^s|s)>>(sizeof(s)*8-1);
25
	res->sign = (b1->sign & s) | (b2->sign & ~s);
26
 
27
	d = -((mpdigit)s & 1);
28
 
29
	i = 0;
30
	while(i < n && i < m){
31
		res->p[i] = (b1->p[i] & d) | (b2->p[i] & ~d);
32
		i++;
33
	}
34
	while(i < n){
35
		res->p[i] = b1->p[i] & d;
36
		i++;
37
	}
38
	while(i < m){
39
		res->p[i] = b2->p[i] & ~d;
40
		i++;
41
	}
42
}