1
/*************************************************
2
* MP Misc Functions Source File *
3
* (C) 1999-2007 The Botan Project *
4
*************************************************/
6
#include <botan/mp_core.h>
7
#include <botan/mp_asm.h>
13
/*************************************************
14
* Core Division Operation *
15
*************************************************/
16
u32bit bigint_divcore(word q, word y1, word y2,
17
word x1, word x2, word x3)
20
y2 = word_madd2(q, y2, y0, &y0);
21
y1 = word_madd2(q, y1, y0, &y0);
32
/*************************************************
33
* Compare two MP integers *
34
*************************************************/
35
s32bit bigint_cmp(const word x[], u32bit x_size,
36
const word y[], u32bit y_size)
38
if(x_size < y_size) { return (-bigint_cmp(y, y_size, x, x_size)); }
40
while(x_size > y_size)
46
for(u32bit j = x_size; j > 0; --j)
48
if(x[j-1] > y[j-1]) return 1;
49
if(x[j-1] < y[j-1]) return -1;
54
/*************************************************
55
* Do a 2-word/1-word Division *
56
*************************************************/
57
word bigint_divop(word n1, word n0, word d)
59
word high = n1 % d, quotient = 0;
61
for(u32bit j = 0; j != MP_WORD_BITS; ++j)
63
word high_top_bit = (high & MP_WORD_TOP_BIT);
66
high |= (n0 >> (MP_WORD_BITS-1-j)) & 1;
69
if(high_top_bit || high >= d)
79
/*************************************************
80
* Do a 2-word/1-word Modulo *
81
*************************************************/
82
word bigint_modop(word n1, word n0, word d)
84
word z = bigint_divop(n1, n0, d);
86
z = word_madd2(z, d, dummy, &dummy);
90
/*************************************************
91
* Do a word*word->2-word Multiply *
92
*************************************************/
93
void bigint_wordmul(word a, word b, word* out_low, word* out_high)
95
const u32bit MP_HWORD_BITS = MP_WORD_BITS / 2;
96
const word MP_HWORD_MASK = ((word)1 << MP_HWORD_BITS) - 1;
98
const word a_hi = (a >> MP_HWORD_BITS);
99
const word a_lo = (a & MP_HWORD_MASK);
100
const word b_hi = (b >> MP_HWORD_BITS);
101
const word b_lo = (b & MP_HWORD_MASK);
103
word x0 = a_hi * b_hi;
104
word x1 = a_lo * b_hi;
105
word x2 = a_hi * b_lo;
106
word x3 = a_lo * b_lo;
108
x2 += x3 >> (MP_HWORD_BITS);
111
x0 += ((word)1 << MP_HWORD_BITS);
113
*out_high = x0 + (x2 >> MP_HWORD_BITS);
114
*out_low = ((x2 & MP_HWORD_MASK) << MP_HWORD_BITS) + (x3 & MP_HWORD_MASK);